diff --git a/panda/src/egg2pg/eggSaver.cxx b/panda/src/egg2pg/eggSaver.cxx index 13483a55d3..dc7be82d7d 100644 --- a/panda/src/egg2pg/eggSaver.cxx +++ b/panda/src/egg2pg/eggSaver.cxx @@ -750,6 +750,7 @@ convert_primitive(const GeomVertexData *vertex_data, const LMatrix4 &net_mat, EggGroupNode *egg_parent, CharacterJointMap *joint_map) { GeomVertexReader reader(vertex_data); + const GeomVertexFormat *format = vertex_data->get_format(); // Make a zygote that will be duplicated for each primitive. PT(EggPrimitive) egg_prim; @@ -808,14 +809,14 @@ convert_primitive(const GeomVertexData *vertex_data, // Check for a texture. const TextureAttrib *ta; if (net_state->get_attrib(ta)) { - EggTexture *egg_tex = get_egg_texture(ta->get_texture()); + for (size_t i = 0; i < ta->get_num_on_stages(); ++i) { + TextureStage *tex_stage = ta->get_on_stage(i); - if (egg_tex != nullptr) { - TextureStage *tex_stage = ta->get_on_stage(0); - if (tex_stage != nullptr) { + EggTexture *egg_tex = get_egg_texture(ta->get_on_texture(tex_stage)); + if (egg_tex != nullptr) { switch (tex_stage->get_mode()) { case TextureStage::M_modulate: - if (has_color_off == true) { + if (has_color_off == true && i == 0) { egg_tex->set_env_type(EggTexture::ET_replace); } else { egg_tex->set_env_type(EggTexture::ET_modulate); @@ -836,12 +837,44 @@ convert_primitive(const GeomVertexData *vertex_data, case TextureStage::M_blend_color_scale: egg_tex->set_env_type(EggTexture::ET_blend_color_scale); break; + case TextureStage::M_modulate_glow: + egg_tex->set_env_type(EggTexture::ET_modulate_glow); + break; + case TextureStage::M_modulate_gloss: + egg_tex->set_env_type(EggTexture::ET_modulate_gloss); + break; + case TextureStage::M_normal: + egg_tex->set_env_type(EggTexture::ET_normal); + break; + case TextureStage::M_normal_height: + egg_tex->set_env_type(EggTexture::ET_normal_height); + break; + case TextureStage::M_glow: + egg_tex->set_env_type(EggTexture::ET_glow); + break; + case TextureStage::M_gloss: + egg_tex->set_env_type(EggTexture::ET_gloss); + break; + case TextureStage::M_height: + egg_tex->set_env_type(EggTexture::ET_height); + break; + case TextureStage::M_selector: + egg_tex->set_env_type(EggTexture::ET_selector); + break; + case TextureStage::M_normal_gloss: + egg_tex->set_env_type(EggTexture::ET_normal_gloss); + break; default: break; } - } - egg_prim->set_texture(egg_tex); + const InternalName *name = tex_stage->get_texcoord_name(); + if (name != nullptr && name != InternalName::get_texcoord()) { + egg_tex->set_uv_name(name->get_basename()); + } + + egg_prim->add_texture(egg_tex); + } } } @@ -906,10 +939,15 @@ convert_primitive(const GeomVertexData *vertex_data, color[3] * color_scale[3])); } - if (vertex_data->has_column(InternalName::get_texcoord())) { - reader.set_column(InternalName::get_texcoord()); + for (size_t ti = 0; ti < format->get_num_texcoords(); ++ti) { + const InternalName *texcoord_name = format->get_texcoord(ti); + reader.set_column(texcoord_name); LTexCoord uv = reader.get_data2(); - egg_vert.set_uv(LCAST(double, uv)); + if (texcoord_name == InternalName::get_texcoord()) { + egg_vert.set_uv(LCAST(double, uv)); + } else { + egg_vert.set_uv(texcoord_name->get_basename(), LCAST(double, uv)); + } } EggVertex *new_egg_vert = _vpool->create_unique_vertex(egg_vert);