@@ -345,18 +345,61 @@ convert_anim_node(AnimBundleNode *node, const WorkingNodePath &node_path,
345
345
*/
346
346
void EggSaver::
347
347
convert_character_bundle (PartGroup *bundleNode, EggGroupNode *egg_parent, CharacterJointMap *joint_map) {
348
+ convert_character_bundle (bundleNode, egg_parent, joint_map, nullptr );
349
+ }
350
+
351
+ /* *
352
+ * Converts the indicated Character Bundle to the corresponding Egg joints
353
+ * structure.
354
+ */
355
+ void EggSaver::
356
+ convert_character_bundle (PartGroup *bundleNode, EggGroupNode *egg_parent,
357
+ CharacterJointMap *joint_map, const CharacterJoint *parent_joint) {
348
358
int num_children = bundleNode->get_num_children ();
349
359
360
+ const CharacterJoint *character_joint = nullptr ;
361
+
350
362
EggGroupNode *joint_group = egg_parent;
351
363
if (bundleNode->is_of_type (CharacterJoint::get_class_type ())) {
352
- CharacterJoint * character_joint = DCAST (CharacterJoint, bundleNode);
364
+ character_joint = DCAST (CharacterJoint, bundleNode);
353
365
354
- LMatrix4 transformf;
355
- character_joint->get_transform (transformf);
356
- LMatrix4d transformd (LCAST (double , transformf));
357
366
EggGroup *joint = new EggGroup (bundleNode->get_name ());
358
- joint->add_matrix4 (transformd);
359
367
joint->set_group_type (EggGroup::GT_joint);
368
+
369
+ // The default_value originally passed to the CharacterJoint is what is used
370
+ // for skinning. However, the _default_value can be changed after joint
371
+ // construction (such as via a <DefaultPose>), so we can't just pull the
372
+ // current _default_value.
373
+ //
374
+ // We have to instead work back from the _initial_net_transform_inverse,
375
+ // which is computed at construction time from the original default_value:
376
+ //
377
+ // _net_transform = default_value * parent_joint->_net_transform;
378
+ // _initial_net_transform_inverse = invert(_net_transform);
379
+ //
380
+ // So we should be able to reconstruct the original default_value like so:
381
+ //
382
+ // default_value = invert(_initial_net_transform_inverse)
383
+ // * parent_joint->_initial_net_transform_inverse;
384
+ //
385
+ LMatrix4d net_transform = invert (LCAST (double , character_joint->_initial_net_transform_inverse ));
386
+ if (parent_joint != nullptr ) {
387
+ if (parent_joint->_initial_net_transform_inverse != character_joint->_initial_net_transform_inverse ) {
388
+ LMatrix4d parent_inverse = LCAST (double , parent_joint->_initial_net_transform_inverse );
389
+ joint->add_matrix4 (net_transform * parent_inverse);
390
+ }
391
+ } else if (!net_transform.is_identity ()) {
392
+ joint->add_matrix4 (net_transform);
393
+ }
394
+
395
+ // The joint's _default_value, if different, goes into a <DefaultPose>.
396
+ LMatrix4d default_pose = LCAST (double , character_joint->_default_value );
397
+ if (default_pose != joint->get_transform3d ()) {
398
+ EggTransform transform;
399
+ transform.add_matrix4 (LCAST (double , default_pose));
400
+ joint->set_default_pose (transform);
401
+ }
402
+
360
403
joint_group = joint;
361
404
egg_parent->add_child (joint_group);
362
405
if (joint_map != nullptr ) {
@@ -373,7 +416,7 @@ convert_character_bundle(PartGroup *bundleNode, EggGroupNode *egg_parent, Charac
373
416
374
417
for (int i = 0 ; i < num_children ; i++) {
375
418
PartGroup *partGroup= bundleNode->get_child (i);
376
- convert_character_bundle (partGroup, joint_group, joint_map);
419
+ convert_character_bundle (partGroup, joint_group, joint_map, character_joint );
377
420
}
378
421
379
422
}
@@ -707,6 +750,7 @@ convert_primitive(const GeomVertexData *vertex_data,
707
750
const LMatrix4 &net_mat, EggGroupNode *egg_parent,
708
751
CharacterJointMap *joint_map) {
709
752
GeomVertexReader reader (vertex_data);
753
+ const GeomVertexFormat *format = vertex_data->get_format ();
710
754
711
755
// Make a zygote that will be duplicated for each primitive.
712
756
PT (EggPrimitive) egg_prim;
@@ -765,14 +809,14 @@ convert_primitive(const GeomVertexData *vertex_data,
765
809
// Check for a texture.
766
810
const TextureAttrib *ta;
767
811
if (net_state->get_attrib (ta)) {
768
- EggTexture *egg_tex = get_egg_texture (ta->get_texture ());
812
+ for (size_t i = 0 ; i < ta->get_num_on_stages (); ++i) {
813
+ TextureStage *tex_stage = ta->get_on_stage (i);
769
814
770
- if (egg_tex != nullptr ) {
771
- TextureStage *tex_stage = ta->get_on_stage (0 );
772
- if (tex_stage != nullptr ) {
815
+ EggTexture *egg_tex = get_egg_texture (ta->get_on_texture (tex_stage));
816
+ if (egg_tex != nullptr ) {
773
817
switch (tex_stage->get_mode ()) {
774
818
case TextureStage::M_modulate:
775
- if (has_color_off == true ) {
819
+ if (has_color_off == true && i == 0 ) {
776
820
egg_tex->set_env_type (EggTexture::ET_replace);
777
821
} else {
778
822
egg_tex->set_env_type (EggTexture::ET_modulate);
@@ -793,12 +837,44 @@ convert_primitive(const GeomVertexData *vertex_data,
793
837
case TextureStage::M_blend_color_scale:
794
838
egg_tex->set_env_type (EggTexture::ET_blend_color_scale);
795
839
break ;
840
+ case TextureStage::M_modulate_glow:
841
+ egg_tex->set_env_type (EggTexture::ET_modulate_glow);
842
+ break ;
843
+ case TextureStage::M_modulate_gloss:
844
+ egg_tex->set_env_type (EggTexture::ET_modulate_gloss);
845
+ break ;
846
+ case TextureStage::M_normal:
847
+ egg_tex->set_env_type (EggTexture::ET_normal);
848
+ break ;
849
+ case TextureStage::M_normal_height:
850
+ egg_tex->set_env_type (EggTexture::ET_normal_height);
851
+ break ;
852
+ case TextureStage::M_glow:
853
+ egg_tex->set_env_type (EggTexture::ET_glow);
854
+ break ;
855
+ case TextureStage::M_gloss:
856
+ egg_tex->set_env_type (EggTexture::ET_gloss);
857
+ break ;
858
+ case TextureStage::M_height:
859
+ egg_tex->set_env_type (EggTexture::ET_height);
860
+ break ;
861
+ case TextureStage::M_selector:
862
+ egg_tex->set_env_type (EggTexture::ET_selector);
863
+ break ;
864
+ case TextureStage::M_normal_gloss:
865
+ egg_tex->set_env_type (EggTexture::ET_normal_gloss);
866
+ break ;
796
867
default :
797
868
break ;
798
869
}
799
- }
800
870
801
- egg_prim->set_texture (egg_tex);
871
+ const InternalName *name = tex_stage->get_texcoord_name ();
872
+ if (name != nullptr && name != InternalName::get_texcoord ()) {
873
+ egg_tex->set_uv_name (name->get_basename ());
874
+ }
875
+
876
+ egg_prim->add_texture (egg_tex);
877
+ }
802
878
}
803
879
}
804
880
@@ -863,10 +939,15 @@ convert_primitive(const GeomVertexData *vertex_data,
863
939
color[3 ] * color_scale[3 ]));
864
940
}
865
941
866
- if (vertex_data->has_column (InternalName::get_texcoord ())) {
867
- reader.set_column (InternalName::get_texcoord ());
942
+ for (size_t ti = 0 ; ti < format->get_num_texcoords (); ++ti) {
943
+ const InternalName *texcoord_name = format->get_texcoord (ti);
944
+ reader.set_column (texcoord_name);
868
945
LTexCoord uv = reader.get_data2 ();
869
- egg_vert.set_uv (LCAST (double , uv));
946
+ if (texcoord_name == InternalName::get_texcoord ()) {
947
+ egg_vert.set_uv (LCAST (double , uv));
948
+ } else {
949
+ egg_vert.set_uv (texcoord_name->get_basename (), LCAST (double , uv));
950
+ }
870
951
}
871
952
872
953
EggVertex *new_egg_vert = _vpool->create_unique_vertex (egg_vert);
0 commit comments