Skip to content

Instantly share code, notes, and snippets.

@rdb
Created November 30, 2019 09:03
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save rdb/13cb936f41e0339a9a9cf9651ea2b09f to your computer and use it in GitHub Desktop.
Save rdb/13cb936f41e0339a9a9cf9651ea2b09f to your computer and use it in GitHub Desktop.

This is the technical documentation for the .bam format. This is generally not useful except for developers who insist on writing their own tools to manipulate .bam files without using the Panda APIs.

== Bam versions ==

The .bam format has a major.minor version scheme. The format is designed to be backward compatible, so that .bam files created with older versions of Panda3D will generally work with newer versions of Panda3D, although occasionally compatibility has been broken due to major changes in the Panda3D structures.

Forward compatibility is not considered, though, so Panda3D will refuse to read .bam files with a higher version number. This means you can read Panda3D 1.8 bams in Panda3D 1.9, but not vice versa.

As of Panda3D 1.7.1, We try not to bump the .bam version between minor releases of Panda3D, so that .bam files created with Panda3D 1.8.1 will still load in Panda3D 1.8.

The table below shows the .bam version associated with each Panda release. The first column shows the Panda version, the second shows which version .bam files it will output (and also the maximum that it will read), and the third shows the minimum .bam version that it will read.

{| ! Panda version ! Writes

! Reads
1.0.x
-
1.1.0
-
1.1.1
-
1.2.x
-
1.3.x
-
1.4.x
-
1.5.0
-
1.5.1, 1.5.2
-
1.5.3, 1.5.4
-
1.6.x
-
1.7.0
-
1.7.1, 1.7.2
-
1.8.x
-
1.9.x
-
master
}

Note that Panda3D 1.10 is able to write older .bam files. This can be done by putting this in Config.prc: <code prc> bam-version 6 21 </code> When not set, the default is to write the latest supported version.

== Bam header ==

The bam format is composed of a series of datagrams. Each datagram is prefixed by an unsigned 32-bit size number. Exceptionally large datagrams are encoded by writing 0xffffffff as the size, followed by an unsigned 64-bit integer containing the actual size.

Most .bam structures are stored in little-endian format. Certain structures can be stored in a different endian format, where specially tagged as such. Currently, this applies to vertex data. The endianness of this special data is indicated by the file header.

.bam files (but not .bam streams) begin with the six-character magic string <code>pbj\0\n\r</code>. This can be used to uniquely identify .bam files. It includes a carriage return and newline character to help detect files damaged due to faulty ASCII/binary conversion.

This is followed directly by the file header, the structure of which is detailed below. When a version number is indicated, it indicates that a field has been added in that version, so a backward compatible reader should not read that field if the .bam version is lower than the indicated number.

{| ! Bytes ! Type ! Name ! Minver

! Description
4
Size of header datagram (should be 6)
-
2
Major .bam version, as detailed above.
-
2
Minor .bam version, as detailed above.
-
1
Endianness of vertex data (everything else is little-endian). 0 if big-endian, 1 if little-endian.
-
1
True if fields marked "stdfloat" contain 64-bit floating point numbers instead of 32-bit. Before 6.27 they were implicitly 32-bit.
}

== Objects ==

What follows the header is essentially a list of objects. There is usually (but not necessarily) a single root object at the beginning, and all children and other dependent objects follow. For a .bam file containing model/animation data, this is the root node of the scene graph.

Each object has a sequentially increasing unique ID, by which it is referenced by other objects. The special ID 0 is reserved to indicate a NULL pointer.

Of note is that object IDs are stored as 16-bit unsigned integers, but as soon as an object with ID 65535 is encountered, all future object IDs and references to it are stored as 32-bit integers.

An object may occur more than once in the .bam stream, for example if it was modified since it was first written.

The first time an object is written it also specifies type information. Each type is identified with an arbitrarily chosen type index, followed by the name of the type. It also contains hierarchical information about the parent classes, which is useful when a reader does not understand eg. a PandaNode derivation but will still be able to reconstruct the base node. Information about each type is only written the first time a type with a particular index is encountered.

== Object stream ==

Before version 6.21, the header was followed by a continuous stream of objects. This means that in order to determine whether the object and its dependencies have been completed, the reader must keep track of the number of objects referenced

Version 6.21 resolves this by inserting special codes in the object stream that can be used to specify a nested structure of objects. When writing out an object, a <code>push</code> code is first inserted, after which the object is written out, followed by the objects that were referenced the object, each of them also prefixed by an object code. Only then is the <code>pop</code> written out, indicating that the object is complete.

Of course, the dependent objects themselves may write nesting <code>push</code> and <code>pop</code> codes, so in order to determine whether an object structure has been completely read, it is necessary to count the number of <code>push</code> and <code>pop</code> codes encountered.

The object code is a single 8-bit integer that can take on the following values:

{| ! Value ! Name

! Description
0
Increments the nesting level. Followed by a single object definition.
-
1
Decrements the nesting level. Followed by another object code.
-
2
This code is followed by a single object. This is the implied value before 6.21.
-
3
Followed by a list of object IDs that are no longer important to the file and may be released.
-
4
Followed by an auxiliary data record that may be requested by certain objects.
}

As an example, this is what the structure looks like for a node referencing two different textures: <pre>PUSH PandaNode ADJUNCT Texture ADJUNCT Texture POP</pre>

Since it may be difficult for a writer to know before writing an object whether it will reference other objects, the following is also perfectly legal: <pre>PUSH PandaNode PUSH Texture POP PUSH Texture POP POP</pre>

== Type encoding ==

Unless specified otherwise, all integer types are little-endian. (Note that there is an endianness field in the header, but it only affects geometry buffer data.)

;bool : Booleans are stored as a single byte that is either 1 (for true) or 0 (for false). ;string : Strings are encoded as a uint16 length indicating the number of characters that directly follow. ;stdfloat : Usually float32, but can be float64 if stdfloat_double in the header is set to 1. ;pointer : An integer identifying the referenced object. 0 represents the NULL pointer. This is uint16 until object ID 0xFFFF has been encountered in the stream, then it becomes uint32.

Arrays of multiple objects are usually expressed by first outputting a length field, which itself can vary on size depending on how many objects are usually present in this array.

== Object reference == This is an incomplete list of objects and their .bam encoding scheme. The "minver" column indicates which bam version the field was introduced in; if writing a bam file with a version older than that, the field should not be written out.

Blocks in grey indicate either an optional field (the presence of which depends on the value of the indicated other fields) or a block that is repeated for each element in an array (usually indicated by a preceding length field).

=== Geom === {| ! width="50" | Minver ! width="60" | Type ! width="80" | Name

! Description
Non-0 pointer to GeomVertexData object.
-
The following field is repeated for each primitive:
-
colspan="4"
{
! width="43"
-
Non-0 pointer to a GeomPrimitive object.
}
-
Base primitive type of all primitives, should be one of the following:
-
colspan="3"
{
0
+
1
+
2
+
3
+
4
}
-
See geomEnums.h. Set to 1 for SM_smooth, the default in Panda.
-
Not used.
-
6.19
Default 0.
}

=== GeomNode === {| ! width="50" | Minver ! width="60" | Type ! width="80" | Name

! Description
-
The following block is repeated for each geom:
-
colspan="4"
{
! width="43"
-
Non-0 pointer to a Geom object.
-
Non-0 pointer to a RenderState object.
}
}

=== GeomVertexData === {| ! width="50" | Minver ! width="60" | Type ! width="140" | Name

! Description
-
Non-0 pointer to a GeomVertexFormat object.
-
Set to 3 for static objects, 2 for dynamic, 1 for streamed vertex data.
-
The following block is repeated for each array:
-
colspan="4"
{
! width="43"
-
Non-0 pointer to a GeomVertexArrayData object.
}
-
May be 0 for non-skinned objects.
-
May be 0 for non-skinned objects.
-
May be 0 for objects without morphs.
}

=== GeomVertexArrayFormat === {| ! width="50" | Minver ! width="60" | Type ! width="100" | Name

! Description
-
-
-
6.37
Attribute divisor. Set to 0 for vertex data, 1 for instance data.
-
Repeated for each column:
-
colspan="4"
{
! width="43"
-
Non-0 pointer to an InternalName object.
-
-
-
-
-
6.29
Default is 1, which indicates no particular alignment.
}
}

=== GeomVertexArrayData === {| ! width="50" | Minver ! width="60" | Type ! width="100" | Name

! Description
Non-0 pointer to GeomVertexArrayFormat. Should be the same as in the GeomVertexFormat.
-
Should be same as usage_hint in the GeomVertexData.
-
-
Buffer data. Floats are in endianness specified in the file header.
}

=== GeomVertexFormat === {| ! width="50" | Minver ! width="60" | Type ! width="100" | Name

! Description
0 for no vertex animation, 1 for CPU animation.
-
Set to 0.
-
Set to false.
-
The following block is repeated for each array:
-
colspan="4"
{
! width="43"
-
Non-0 pointer to a GeomVertexArrayFormat object.
}
}

=== InternalName === This stores just a single string.

=== Material === Bam 6.39 introduced a new Material structure. This is the old structure from before 6.39: {| ! width="50" | Minver ! width="60" | Type ! width="80" | Name

! Description
5.6
Name of this material.
-
Must be present, but is ignored if flags does not include F_ambient.
-
Must be present, but is ignored if flags does not include F_diffuse.
-
Must be present, but is ignored if flags does not include F_specular.
-
Must be present, but is ignored if flags does not include F_emission.
-
This value is usually the specular exponent, unless F_roughness is set.
-
A bitmask produced by OR-ing one or more of the following:
-
colspan="3"
{
0x001
-
0x002
-
0x004
-
0x008
-
0x010
-
0x020
-
0x040
-
0x080
}
}

=== MaterialAttrib === A MaterialAttrib simply contains a single pointer to a Material, which may be 0 to indicate the lack of a material.

=== PandaNode === {| ! width="50" | Minver ! width="60" | Type ! width="140" | Name

! Description
Name of this node
-
Pointer to RenderState object. Should not be 0.
-
Pointer to TransformState object. Should not be 0.
-
Pointer to RenderEffects object. Should not be 0.
-
6.2
Default 0.
-
Default 0xffffffff. Interpreted slightly differently before 6.2.
-
4.12
Default 0.
-
6.19
Type of bounding volume to be generated for this node. Default 0 (BT_default).
-
4.4
The following block is repeated for each tag:
-
colspan="4"
{
! width="43"
-
-
}
-
The following field is repeated for each parent:
-
colspan="4"
{
! width="43"
-
}
-
The following block is repeated for each child:
-
colspan="4"
{
! width="43"
-
-
}
-
The following block is repeated for each stashed child:
-
colspan="4"
{
! width="43"
-
-
}
}

=== Texture ===

{| ! width="50" | Minver ! width="60" | Type ! width="140" | Name

! Description
Name of this texture
-
Filename of this texture
-
If not empty, name of a different file from which to retrieve the alpha information
-
If not 0, the number of channels to downgrade the image to if it is greater than this number
-
If alpha_filename is not empty, determines which channel to take the alpha information from. 0 is to take the grayscale combination of RGB, 1 is red, 2 green, and so on.
-
If true, the raw contents of this texture are included in the .bam data
-
Type of texture, should be one of the following:
-
colspan="3"
{
0
+
1
+
2
+
3
+
4
+
5
}
-
6.32
If true, the filename is assumed to contain a # which is substituted with an index for various mipmap levels
-
The sampler settings that will be used in absence of other sampler parameters. See SamplerState entry for the various fields
-
6.1
Leave 0 for default compression mode (according to <i>compressed-textures</i>), 1 for explicit off, 2 for explicit on (see texture.h for others)
-
6.16
Leave 0 for default quality (according to <i>texture-quality-level</i>), 1=fastest, 2=normal, 3=best
-
Texture format, see texture.h for values. Common values: 12=F_rgba 16=F_rgba8 32=F_srgb_alpha
-
Number of components (eg. 4 for RGBA), MUST match number of components in format
-
colspan="4"
{
+ Only present if texture_type is TT_buffer_texture
! width="43"
-
}
-
6.28
Power-of-two texture scaling that will be applied on loading this model, one of:
-
colspan="3"
{
0
+
1
+
2
+
3
+
4
}
-
6.18
Width of the image before scaling. Not sure if you can just leave this zero when loading from disk?
-
6.18
Height of the image before scaling.
-
6.18
If true, there is a lower resolution raw version of this image that can be shown before the full version is loaded from disk. Leave false if in doubt.
-
colspan="4"
{
+ Only present if has_simple_ram_image is true
-
-
-
-
-
}
-
colspan="4"
{
+ Only present if has_rawdata is true
! width="43"
-
-
-
-
6.30
-
6.30
-
6.30
-
6.26
-
-
-
6.1
-
6.3
-
colspan="4"
{
+ Repeated for num_ram_images (defaults to 1 before 6.3)
! width="43"
-
6.1
-
-
}
}
}

=== TransformState ===

All nodes must have a TransformState reference, but it is perfectly fine to create a single TransformState referring to the identity transformation and refer to that in all nodes that don't have an explicit transform. Since transform states are immutable in Panda3D, there are no negative consequences from sharing them between different nodes.

Transformations can be expressed in various ways. Besides the specially marked "identity" and "invalid" transforms, there may be componentwise specification of the transformation, or a matrix can be specified. Both may be specified, but this is not necessary as Panda3D will calculate one from the other at request.

{| ! width="50" | Minver ! width="60" | Type ! width="80" | Name

! Description
This is a complex bitmask, but writers should choose one of the following:
-
colspan="3"
{
0x00010005
-
0x00000096
-
0x00000338
-
0x00000c38
-
0x00000040
}
As of 5.2, any of these may be OR-ed with 0x00010000 to indicate that it is a 2-D transformation,
although this does not affect the storage size of the components.
-
colspan="4"
{
+ Only present if flags includes 0x00000008
! width="43"
-
-
-
-
}
-
colspan="4"
{
+ Only present if flags includes 0x00000040
! width="43"
-
}
}

== Example ==

This is an annotated hex dump of a simple .bam file.

<pre> 70 62 6a 00 0a 0d The magic code "pbj\0\n\r" 06 00 00 00 A 6-byte datagram follows 06 00 21 00 Version number is 6.33 01 00 Little-endian vertex data, single precision floats

a1 00 00 00 A 161-byte datagram follows 00 BOC_push: open a nesting block, an object follows cc 01 This object has type index 460, type info follows 09 00 Type name string has 9 characters 4d6f64656c526f6f74 "ModelRoot" 01 This type has one parent type cb 01 Parent type has index 459, type info follows 09 00 Type name string has 9 characters 4d6f64656c4e6f6465 "ModelNode" 01 This type has one parent type 3c 00 Parent type has index 60 09 00 Type name string has 9 characters 50616e64614e6f6465 "PandaNode" ... rest of type hierarchy ... 01 00 This is object ID 1 05 00 5363656e65 PandaNode::_name (5-character string "Scene") 02 00 PandaNode::_state (reference to object 2) 03 00 PandaNode::_transform (reference to object 3) 04 00 PandaNode::_effects (reference to object 4) 00 00 00 00 PandaNode::_draw_control_mask ff ff ff ff PandaNode::_draw_show_mask (all visible) 00 00 00 00 PandaNode::_into_collide_mask 00 PandaNode::_bounds_type (0 = BT_default) 00 00 00 00 PandaNode::_tags.size() (no tags) 00 00 PandaNode has 0 parents 02 00 PandaNode has 2 children, which are: 05 00 first child is object ID 5 00 00 00 00 first child has sort 0 06 00 second child is object ID 6 00 00 00 00 second child has sort 0 00 00 PandaNode has 0 stashed children 00 ModelNode::_preserve_transform = PT_none 00 00 ModelNode::_preserve_attributes

82 00 00 00 A 130-byte datagram follows 02 BOC_adjunct: an object follows directly da 01 This object has type index 474, type info follows 0b 00 Type name string has 11 characters 52656e6465725374617465 "RenderState" ... rest of RenderState type hierarchy ...

... to be continued ... </pre>

== Changelog == This is a list of revisions that changed the version number of the .bam format, in chronological order. Click on the dates to be taken to the associated GitHub revision page.

{| | 2.3 || [https://github.com/panda3d/panda3d/commit/174bdd8807726dbb3be0440cfbb4631b897adacd 2000-11-21] || dual-image textures. |- | 2.4 || [https://github.com/panda3d/panda3d/commit/0287c81e94ef0a871b8fad598d98be7f33ef1788 2000-11-28] || anisotropic texture filtering. |- | 3.0 || [https://github.com/panda3d/panda3d/commit/d69d3fc470f953b7b47b72b385fe913691c159ab 2000-12-08] || change float64's to float32's. |- | 3.1 || [https://github.com/panda3d/panda3d/commit/ba2608b7b429d0408467bb39051ce3531004bee3 2000-12-15] || add FFT-style channel |- | 3.2 || [https://github.com/panda3d/panda3d/commit/032f773b53e453288fa8c00b807c5e449cc42b24 2001-02-15] || add ModelNode::_preserve_transform. |- | 3.3 || [https://github.com/panda3d/panda3d/commit/e1f0c9a90863410250484993ac0ed4cc5dac1107 2001-04-11] || support correctly ordered children. |- | 3.4 || [https://github.com/panda3d/panda3d/commit/fc6db22bb173173244d3939faf547ab538068276 2001-12-11] || transpose quaternions. |- | 3.5 || [https://github.com/panda3d/panda3d/commit/4a0b5d3d7ea4ffb502a5b777795b6a07568f0fee 2001-12-13] || remove obsolete fields from Texture. |- | 3.6 || [https://github.com/panda3d/panda3d/commit/e46050a69e6929544af360c32912431124fe6c77 2002-05-16] || add ImageBuffer::_filename. |- | 3.7 || [https://github.com/panda3d/panda3d/commit/d4482780b5ae47ecb3bd91a3ea1c18d4371be5b3 2002-05-19] || add CharacterJoint::_net_transform_nodes, etc. |- | 4.0 || [https://github.com/panda3d/panda3d/commit/a23a7572a2682cae2255c52583c2cef45d2eeb9b 2002-04-10] || store new scene graph. |- | 4.1 || [https://github.com/panda3d/panda3d/commit/6e686caf8c0a42dc2d3741ee6f1041df9096d90f 2003-04-10] || add CullFaceAttrib::reverse. |- | 4.2 || [https://github.com/panda3d/panda3d/commit/28743b123bc283e998bd676b6054d6cb62985e98 2003-04-12] || add num_components to texture. |- | 4.3 || [https://github.com/panda3d/panda3d/commit/df2a60cfb09c24ed56e42c0eafd1d7ca759f818e 2003-04-15] || add ImageBuffer::_alpha_file_channel. |- | 4.4 || [https://github.com/panda3d/panda3d/commit/c03d886691380dd05fafdf4745d47659ecb24562 2003-06-12] || add PandaNode::set_tag(). |- | 4.5 || [https://github.com/panda3d/panda3d/commit/f7569695f82a923bf4dae7eb58357d0c93bc66e6 2003-07-09] || add rawdata mode to texture |- | 4.6 || [https://github.com/panda3d/panda3d/commit/344ca11ffd2e7e7f2f7c5cb416df02f0faac526f 2003-07-22] || add shear to scene graph and animation data. |- | 4.7 || [https://github.com/panda3d/panda3d/commit/2536db25f45f9df28dee0366e5f570651772767d 2003-11-10] || add CollisionSolid::_effective_normal |- | 4.8 || [https://github.com/panda3d/panda3d/commit/e1a8ff794c4b2eeede97903044bfecae28ee8103 2003-11-12] || add FFTCompressor::reject_compression |- | 4.9 || [https://github.com/panda3d/panda3d/commit/35f5cd7d67c8d7d85adaaca2a9b2a4dff9fc996d 2003-12-02] || change CollisionPolygon internals. |- | 4.10 || [https://github.com/panda3d/panda3d/commit/dec4cb4bdb9c3ef449a76a0cb291ccd4866c0da7 2004-04-23] || make ComputedVertices use uint32's. |- | 4.11 || [https://github.com/panda3d/panda3d/commit/c7c639797e7abad770f7eff31956d7b8a5d58dc5 2004-07-26] || add multitexture pointers. |- | 4.12 || [https://github.com/panda3d/panda3d/commit/0369f07074e1f21c73937d709c2b991a34b52f66 2004-09-22] || add PandaNode::into_collide_mask. |- | 4.13 || [https://github.com/panda3d/panda3d/commit/d850afd71aaa95abfb8d3521f0abf17a4c8c5207 2004-09-24] || store actual LODNode switch distances instead of squares. |- | 4.14 || [https://github.com/panda3d/panda3d/commit/8747959c7b41c5ef03677f665e707e383184ebed 2004-11-18] || differentiate old_hpr from new_hpr in compressed anim channels. |- | 4.15 || [https://github.com/panda3d/panda3d/commit/d9d30855d014525415de9aad34f0955fecb76b4a 2005-01-16] || remove width from GeomLine, etc. |- | 4.16 || [https://github.com/panda3d/panda3d/commit/ffdbf61985855d4ac855eee214392d49f0f3a77f 2005-02-24] || add TextureStage::rgb_scale, etc. |- | 4.17 || [https://github.com/panda3d/panda3d/commit/87d03ccb34c914fa47258a17a0524f8535d9fc9c 2005-03-03] || add 3-d textures, etc. |- | 4.18 || [https://github.com/panda3d/panda3d/commit/8dd9c1419cb6be8c3453e69c4c4b424ba4b7a4ee 2005-04-05] || add RenderModeAttrib::perspective. |- | 4.19 || [https://github.com/panda3d/panda3d/commit/e0dca3b43bba2a74f97407f28339c0a67704cf29 2005-04-19] || add nonindexed qpgeom primitives. |- | 5.0 || [https://github.com/panda3d/panda3d/commit/bc0d5090900a2314d1eacbd764d5a5f2f1fd3bab 2005-05-06] || new Geom implementation. |- | 5.1 || [https://github.com/panda3d/panda3d/commit/ba139578e0dc7416a31a21bea68fa130c1cef1c0 2005-07-14] || add TextureStage::_saved_result. |- | 5.2 || [https://github.com/panda3d/panda3d/commit/65458d9edd882aa410509b10211da8a91e95d174 2005-07-21] || add TransformState::is_2d. |- | 5.3 || [https://github.com/panda3d/panda3d/commit/1e81e656ab3935547de4c3a4c71b9c6f67e4e3da 2005-08-25] || add ModelNode::_preserve_attributes. |- | 5.4 || [https://github.com/panda3d/panda3d/commit/54655719635ac32c706b8d8fd6412b69a425eb15 2005-09-27] || make SequenceNode inherit from AnimInterface. |- | 5.5 || [https://github.com/panda3d/panda3d/commit/ef0f4859329cdd34ff3d3a673b47abc488ff05cf 2005-12-22] || add Texture::_border_color. |- | 5.6 || [https://github.com/panda3d/panda3d/commit/cf01ef9cd6e70355d64dcc5e68b5bd69bfaac202 2006-01-14] || add Material::_name. |- | 6.0 || [https://github.com/panda3d/panda3d/commit/1d2282a879145b237fcb2d5f6fbf55510df663e6 2006-02-11] || factor out PandaNode::CData. |- | 6.1 || [https://github.com/panda3d/panda3d/commit/e6369ba5a4211ddc1e6cd320f33c75a4d4e1dcb1 2006-03-12] || add Texture::_compression. |- | 6.2 || [https://github.com/panda3d/panda3d/commit/725e82e6f465d0cabc7ec1a3f70f77817f1e2f1e 2006-03-17] || add PandaNode::_draw_control_mask. |- | 6.3 || [https://github.com/panda3d/panda3d/commit/f803ef85ceeaa8247ff72e73a259300ff01c9a63 2006-03-21] || add Texture::_ram_images. |- | 6.4 || [https://github.com/panda3d/panda3d/commit/8e178ae9d605940f1c8b9125cb9f70e5828277c0 2006-07-26] || add CharacterJoint::_character. |- | 6.5 || [https://github.com/panda3d/panda3d/commit/ccec9eb3df572159d03509f14474ea11b2659b64 2006-11-15] || add PartBundleNode::_num_bundles. |- | 6.6 || [https://github.com/panda3d/panda3d/commit/63edecf517525d39c61cfb9aaac3533fab4032ad 2007-02-05] || change GeomPrimitive::_num_vertices. |- | 6.7 || [https://github.com/panda3d/panda3d/commit/e43f4f5c64a3a2eeac38d6954e43ea67af9217fc 2007-02-15] || change SliderTable. |- | 6.8 || [https://github.com/panda3d/panda3d/commit/0329972a41939b40c79ddb681b5a7afb6c6e5ae2 2007-05-12] || change GeomVertexArrayData::_data. |- | 6.9 || [https://github.com/panda3d/panda3d/commit/7e08d7b759a5ef23a817c90cbce8bc9ab664af54 2007-05-15] || add PlaneNode::_clip_effect. |- | 6.10 || [https://github.com/panda3d/panda3d/commit/823bd7a56c76f85ba9bf5b29524f3e23344e7a4b 2007-06-19] || properly write PartBundles. |- | 6.11 || [https://github.com/panda3d/panda3d/commit/4bce07faaa667c35cf5604b9a6d236baf9528467 2007-06-20] || write frozen joints to PartGroups. |- | 6.12 || [https://github.com/panda3d/panda3d/commit/81ae62f553607abd1e9b85e7dcd8e8135c3b3b98 2007-07-03] || rework control/frozen joints more. |- | 6.13 || [https://github.com/panda3d/panda3d/commit/1ccd464d81f9d4b982cc9ac9b43d0ab3235f284b 2007-08-15] || reverse CollisionPolygon vertices. |- | 6.14 || [https://github.com/panda3d/panda3d/commit/775466b4bd74c15e09f17b67b19cba2840091757 2007-12-19] || change default ColorAttrib. |- | 6.15 || [https://github.com/panda3d/panda3d/commit/a667e91dce10bacfabdf59ecdc9bc0457b97de17 2008-04-09] || add TextureAttrib::_implicit_sort. |- | 6.16 || [https://github.com/panda3d/panda3d/commit/acb0faae46e383d4a7a9dabd1062d6d91256fe68 2008-05-13] || add Texture::_quality_level. |- | 6.17 || [https://github.com/panda3d/panda3d/commit/35baf6a2eeee00403b40a96ad6a230bfcae65028 2008-08-06] || add PartBundle::_anim_preload. |- | 6.18 || [https://github.com/panda3d/panda3d/commit/617a769ef760f7564bd3d64ddfbe6629a55c748c 2008-08-14] || add Texture::_simple_ram_image. |- | || [https://github.com/panda3d/panda3d/commit/b07dbcc262263b1bb74288d47d3d95ae7e1994bb 2008-08-14] || remove support for pre-6.14 bams |- | 6.19 || [https://github.com/panda3d/panda3d/commit/ddbad778518638a4aae0b6357c578789f0931213 2008-08-14] || add PandaNode::_bounds_type. |- | 6.20 || [https://github.com/panda3d/panda3d/commit/aee550231c7b5b5b234efc625b72d71b5ca7b58c 2009-04-21] || add MovingPartBase::_forced_channel. |- | 6.21 || [https://github.com/panda3d/panda3d/commit/aefe3d35c2f2fbcf67a46ed92e5c0a409bfc1172 2008-02-26] || add BamEnums::BamObjectCode. |- | 6.22 || [https://github.com/panda3d/panda3d/commit/8db00b4f74e0edae94c2a8cda91c4e126e48033c 2009-07-31] || add UvScrollNode R speed. |- | 6.23 || [https://github.com/panda3d/panda3d/commit/9d62ca9f98b29995f770fbfd083b5760ef52e523 2010-05-04] || add internal TextureAttrib overrides. |- | 6.24 || [https://github.com/panda3d/panda3d/commit/91e6231a3c948d3e011512bc81ed778f054a2f54 2010-05-04] || add internal TexMatrixAttrib overrides. |- | 6.25 || [https://github.com/panda3d/panda3d/commit/285d70c29e0d16f7bf77d51889e5116f0b0b896e 2011-06-22] || add support for caching movie files. |- | 6.26 || [https://github.com/panda3d/panda3d/commit/6872488839b5c979f4926bb258b17fa651a83bda 2011-08-05] || add multiview (stereo) Textures. |- | 6.27 || [https://github.com/panda3d/panda3d/commit/501470169f0513d1075427eb0069a6aeea30ef5d 2011-10-09] || add stdfloat_double. |- | 6.28 || [https://github.com/panda3d/panda3d/commit/3d89cef5443266eedb16ee23a72124ea8cad6ae5 2011-11-28] || add Texture::_auto_texture_scale. |- | 6.29 || [https://github.com/panda3d/panda3d/commit/a4728957da7086a3025740335807918e4173808a 2011-12-17] || add GeomVertexColumn::_column_alignment. |- | 6.30 || [https://github.com/panda3d/panda3d/commit/deb8a56b8acd7b034834aeaf79d298ed67921545 2012-01-22] || add Texture::pad*_size. |- | 6.31 || [https://github.com/panda3d/panda3d/commit/3a75ebde9a805648f0d581ceb8f032ca5db5448c 2012-02-16] || add DepthOffsetAttrib::_min_value, _max_value |- | 6.32 || [https://github.com/panda3d/panda3d/commit/5ba7076808908cd2ff676e032beb1d8f20acf1e8 2012-06-11] || add Texture::_has_read_mipmaps. |- | 6.33 || [https://github.com/panda3d/panda3d/commit/a585faa807765c5b297533cb45020cb93d636c56 2013-08-17] || add UvScrollNode::_w_speed. |- | 6.34 || [https://github.com/panda3d/panda3d/commit/8b7217b4f9d80284a3b4e9fcb15d34c24add11bd 2014-09-16] || add ScissorAttrib::_off. |- | 6.35 || [https://github.com/panda3d/panda3d/commit/0473fa7eadece14d046be963a7f505e91ea6b8ed 2014-12-03] || change StencilAttrib. |- | 6.36 || [https://github.com/panda3d/panda3d/commit/95d85819b032a26b2eb1f06798f746235607cca3 2014-12-09] || add samplers and lod settings. |- | 6.37 || [https://github.com/panda3d/panda3d/commit/77c9e6cf6c4bb52d5d39777f3e47c94c369f8b0c 2015-01-22] || add GeomVertexArrayFormat::_divisor. |- | 6.38 || [https://github.com/panda3d/panda3d/commit/38ac0401ce19ff326ee54f451782efef2c508d07 2015-04-15] || add various Bullet classes. |- | 6.39 || [https://github.com/panda3d/panda3d/commit/3393454582a6330dbc3df775d29e94221198863a 2016-01-09] || change lights and materials. |- | 6.40 || [https://github.com/panda3d/panda3d/commit/41fad59ae8c32eb23c1ef848f64f803a0d54eec9 2016-01-11] || make NodePaths writable. |- | 6.41 || [https://github.com/panda3d/panda3d/commit/2971915618053b159069b5dcb28ed55ac826f1a3 2016-03-02] || change LensNode, Lens and Camera. |- | 6.42 || [https://github.com/panda3d/panda3d/commit/f0cd1ce3158e52c4b3b8ed338ec510c9d2a33398 2016-04-08] || expand ColorBlendAttrib. |}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment