Merge pull request #48560 from SaracenOne/collada_semantic_fix_4_0

This commit is contained in:
Rémi Verschelde 2021-08-19 09:02:16 +02:00 committed by GitHub
commit 8b6c168b3a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 95 additions and 30 deletions

View file

@ -960,6 +960,7 @@ void Collada::_parse_mesh_geometry(XMLParser &parser, String p_id, String p_name
} else if (section == "vertices") {
MeshData::Vertices vert;
String id = parser.get_attribute_value("id");
int last_ref = 0;
while (parser.read() == OK) {
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
@ -967,6 +968,10 @@ void Collada::_parse_mesh_geometry(XMLParser &parser, String p_id, String p_name
String semantic = parser.get_attribute_value("semantic");
String source = _uri_to_id(parser.get_attribute_value("source"));
if (semantic == "TEXCOORD") {
semantic = "TEXCOORD" + itos(last_ref++);
}
vert.sources[semantic] = source;
COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source);

View file

@ -504,61 +504,121 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<EditorSceneImpor
const Collada::MeshData::Source *normal_src = nullptr;
int normal_ofs = 0;
if (p.sources.has("NORMAL")) {
String normal_source_id = p.sources["NORMAL"].source;
normal_ofs = p.sources["NORMAL"].offset;
ERR_FAIL_COND_V(!meshdata.sources.has(normal_source_id), ERR_INVALID_DATA);
normal_src = &meshdata.sources[normal_source_id];
{
String normal_source_id = "";
if (p.sources.has("NORMAL")) {
normal_source_id = p.sources["NORMAL"].source;
normal_ofs = p.sources["NORMAL"].offset;
} else if (meshdata.vertices[vertex_src_id].sources.has("NORMAL")) {
normal_source_id = meshdata.vertices[vertex_src_id].sources["NORMAL"];
normal_ofs = vertex_ofs;
}
if (normal_source_id != "") {
ERR_FAIL_COND_V(!meshdata.sources.has(normal_source_id), ERR_INVALID_DATA);
normal_src = &meshdata.sources[normal_source_id];
}
}
const Collada::MeshData::Source *binormal_src = nullptr;
int binormal_ofs = 0;
if (p.sources.has("TEXBINORMAL")) {
String binormal_source_id = p.sources["TEXBINORMAL"].source;
binormal_ofs = p.sources["TEXBINORMAL"].offset;
ERR_FAIL_COND_V(!meshdata.sources.has(binormal_source_id), ERR_INVALID_DATA);
binormal_src = &meshdata.sources[binormal_source_id];
{
String binormal_source_id = "";
if (p.sources.has("TEXBINORMAL")) {
binormal_source_id = p.sources["TEXBINORMAL"].source;
binormal_ofs = p.sources["TEXBINORMAL"].offset;
} else if (meshdata.vertices[vertex_src_id].sources.has("TEXBINORMAL")) {
binormal_source_id = meshdata.vertices[vertex_src_id].sources["TEXBINORMAL"];
binormal_ofs = vertex_ofs;
}
if (binormal_source_id != "") {
ERR_FAIL_COND_V(!meshdata.sources.has(binormal_source_id), ERR_INVALID_DATA);
binormal_src = &meshdata.sources[binormal_source_id];
}
}
const Collada::MeshData::Source *tangent_src = nullptr;
int tangent_ofs = 0;
if (p.sources.has("TEXTANGENT")) {
String tangent_source_id = p.sources["TEXTANGENT"].source;
tangent_ofs = p.sources["TEXTANGENT"].offset;
ERR_FAIL_COND_V(!meshdata.sources.has(tangent_source_id), ERR_INVALID_DATA);
tangent_src = &meshdata.sources[tangent_source_id];
{
String tangent_source_id = "";
if (p.sources.has("TEXTANGENT")) {
tangent_source_id = p.sources["TEXTANGENT"].source;
tangent_ofs = p.sources["TEXTANGENT"].offset;
} else if (meshdata.vertices[vertex_src_id].sources.has("TEXTANGENT")) {
tangent_source_id = meshdata.vertices[vertex_src_id].sources["TEXTANGENT"];
tangent_ofs = vertex_ofs;
}
if (tangent_source_id != "") {
ERR_FAIL_COND_V(!meshdata.sources.has(tangent_source_id), ERR_INVALID_DATA);
tangent_src = &meshdata.sources[tangent_source_id];
}
}
const Collada::MeshData::Source *uv_src = nullptr;
int uv_ofs = 0;
if (p.sources.has("TEXCOORD0")) {
String uv_source_id = p.sources["TEXCOORD0"].source;
uv_ofs = p.sources["TEXCOORD0"].offset;
ERR_FAIL_COND_V(!meshdata.sources.has(uv_source_id), ERR_INVALID_DATA);
uv_src = &meshdata.sources[uv_source_id];
{
String uv_source_id = "";
if (p.sources.has("TEXCOORD0")) {
uv_source_id = p.sources["TEXCOORD0"].source;
uv_ofs = p.sources["TEXCOORD0"].offset;
} else if (meshdata.vertices[vertex_src_id].sources.has("TEXCOORD0")) {
uv_source_id = meshdata.vertices[vertex_src_id].sources["TEXCOORD0"];
uv_ofs = vertex_ofs;
}
if (uv_source_id != "") {
ERR_FAIL_COND_V(!meshdata.sources.has(uv_source_id), ERR_INVALID_DATA);
uv_src = &meshdata.sources[uv_source_id];
}
}
const Collada::MeshData::Source *uv2_src = nullptr;
int uv2_ofs = 0;
if (p.sources.has("TEXCOORD1")) {
String uv2_source_id = p.sources["TEXCOORD1"].source;
uv2_ofs = p.sources["TEXCOORD1"].offset;
ERR_FAIL_COND_V(!meshdata.sources.has(uv2_source_id), ERR_INVALID_DATA);
uv2_src = &meshdata.sources[uv2_source_id];
{
String uv2_source_id = "";
if (p.sources.has("TEXCOORD1")) {
uv2_source_id = p.sources["TEXCOORD1"].source;
uv2_ofs = p.sources["TEXCOORD1"].offset;
} else if (meshdata.vertices[vertex_src_id].sources.has("TEXCOORD1")) {
uv2_source_id = meshdata.vertices[vertex_src_id].sources["TEXCOORD1"];
uv2_ofs = vertex_ofs;
}
if (uv2_source_id != "") {
ERR_FAIL_COND_V(!meshdata.sources.has(uv2_source_id), ERR_INVALID_DATA);
uv2_src = &meshdata.sources[uv2_source_id];
}
}
const Collada::MeshData::Source *color_src = nullptr;
int color_ofs = 0;
if (p.sources.has("COLOR")) {
String color_source_id = p.sources["COLOR"].source;
color_ofs = p.sources["COLOR"].offset;
ERR_FAIL_COND_V(!meshdata.sources.has(color_source_id), ERR_INVALID_DATA);
color_src = &meshdata.sources[color_source_id];
{
String color_source_id = "";
if (p.sources.has("COLOR")) {
color_source_id = p.sources["COLOR"].source;
color_ofs = p.sources["COLOR"].offset;
} else if (meshdata.vertices[vertex_src_id].sources.has("COLOR")) {
color_source_id = meshdata.vertices[vertex_src_id].sources["COLOR"];
color_ofs = vertex_ofs;
}
if (color_source_id != "") {
ERR_FAIL_COND_V(!meshdata.sources.has(color_source_id), ERR_INVALID_DATA);
color_src = &meshdata.sources[color_source_id];
}
}
//find largest source..