bam2egg: support multitexturing, multiple UV sets

This commit is contained in:
rdb 2020-03-14 14:53:07 +01:00
parent ebd538a7f8
commit 9966ddaa33

View File

@ -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);