Merge pull request #48571 from SaracenOne/collada_semantic_fix_3_x
Fix to parsing some Collada files with extra vertex semantics [3.x]
This commit is contained in:
commit
9b3d3ee6fc
@ -961,6 +961,7 @@ void Collada::_parse_mesh_geometry(XMLParser &parser, String p_id, String p_name
|
|||||||
} else if (section == "vertices") {
|
} else if (section == "vertices") {
|
||||||
MeshData::Vertices vert;
|
MeshData::Vertices vert;
|
||||||
String id = parser.get_attribute_value("id");
|
String id = parser.get_attribute_value("id");
|
||||||
|
int last_ref = 0;
|
||||||
|
|
||||||
while (parser.read() == OK) {
|
while (parser.read() == OK) {
|
||||||
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
|
||||||
@ -968,6 +969,10 @@ void Collada::_parse_mesh_geometry(XMLParser &parser, String p_id, String p_name
|
|||||||
String semantic = parser.get_attribute_value("semantic");
|
String semantic = parser.get_attribute_value("semantic");
|
||||||
String source = _uri_to_id(parser.get_attribute_value("source"));
|
String source = _uri_to_id(parser.get_attribute_value("source"));
|
||||||
|
|
||||||
|
if (semantic == "TEXCOORD") {
|
||||||
|
semantic = "TEXCOORD" + itos(last_ref++);
|
||||||
|
}
|
||||||
|
|
||||||
vert.sources[semantic] = source;
|
vert.sources[semantic] = source;
|
||||||
|
|
||||||
COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source);
|
COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source);
|
||||||
|
@ -498,61 +498,121 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
|
|||||||
const Collada::MeshData::Source *normal_src = nullptr;
|
const Collada::MeshData::Source *normal_src = nullptr;
|
||||||
int normal_ofs = 0;
|
int normal_ofs = 0;
|
||||||
|
|
||||||
if (p.sources.has("NORMAL")) {
|
{
|
||||||
String normal_source_id = p.sources["NORMAL"].source;
|
String normal_source_id = "";
|
||||||
normal_ofs = p.sources["NORMAL"].offset;
|
|
||||||
ERR_FAIL_COND_V(!meshdata.sources.has(normal_source_id), ERR_INVALID_DATA);
|
if (p.sources.has("NORMAL")) {
|
||||||
normal_src = &meshdata.sources[normal_source_id];
|
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;
|
const Collada::MeshData::Source *binormal_src = nullptr;
|
||||||
int binormal_ofs = 0;
|
int binormal_ofs = 0;
|
||||||
|
|
||||||
if (p.sources.has("TEXBINORMAL")) {
|
{
|
||||||
String binormal_source_id = p.sources["TEXBINORMAL"].source;
|
String binormal_source_id = "";
|
||||||
binormal_ofs = p.sources["TEXBINORMAL"].offset;
|
|
||||||
ERR_FAIL_COND_V(!meshdata.sources.has(binormal_source_id), ERR_INVALID_DATA);
|
if (p.sources.has("TEXBINORMAL")) {
|
||||||
binormal_src = &meshdata.sources[binormal_source_id];
|
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;
|
const Collada::MeshData::Source *tangent_src = nullptr;
|
||||||
int tangent_ofs = 0;
|
int tangent_ofs = 0;
|
||||||
|
|
||||||
if (p.sources.has("TEXTANGENT")) {
|
{
|
||||||
String tangent_source_id = p.sources["TEXTANGENT"].source;
|
String tangent_source_id = "";
|
||||||
tangent_ofs = p.sources["TEXTANGENT"].offset;
|
|
||||||
ERR_FAIL_COND_V(!meshdata.sources.has(tangent_source_id), ERR_INVALID_DATA);
|
if (p.sources.has("TEXTANGENT")) {
|
||||||
tangent_src = &meshdata.sources[tangent_source_id];
|
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;
|
const Collada::MeshData::Source *uv_src = nullptr;
|
||||||
int uv_ofs = 0;
|
int uv_ofs = 0;
|
||||||
|
|
||||||
if (p.sources.has("TEXCOORD0")) {
|
{
|
||||||
String uv_source_id = p.sources["TEXCOORD0"].source;
|
String uv_source_id = "";
|
||||||
uv_ofs = p.sources["TEXCOORD0"].offset;
|
|
||||||
ERR_FAIL_COND_V(!meshdata.sources.has(uv_source_id), ERR_INVALID_DATA);
|
if (p.sources.has("TEXCOORD0")) {
|
||||||
uv_src = &meshdata.sources[uv_source_id];
|
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;
|
const Collada::MeshData::Source *uv2_src = nullptr;
|
||||||
int uv2_ofs = 0;
|
int uv2_ofs = 0;
|
||||||
|
|
||||||
if (p.sources.has("TEXCOORD1")) {
|
{
|
||||||
String uv2_source_id = p.sources["TEXCOORD1"].source;
|
String uv2_source_id = "";
|
||||||
uv2_ofs = p.sources["TEXCOORD1"].offset;
|
|
||||||
ERR_FAIL_COND_V(!meshdata.sources.has(uv2_source_id), ERR_INVALID_DATA);
|
if (p.sources.has("TEXCOORD1")) {
|
||||||
uv2_src = &meshdata.sources[uv2_source_id];
|
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;
|
const Collada::MeshData::Source *color_src = nullptr;
|
||||||
int color_ofs = 0;
|
int color_ofs = 0;
|
||||||
|
|
||||||
if (p.sources.has("COLOR")) {
|
{
|
||||||
String color_source_id = p.sources["COLOR"].source;
|
String color_source_id = "";
|
||||||
color_ofs = p.sources["COLOR"].offset;
|
|
||||||
ERR_FAIL_COND_V(!meshdata.sources.has(color_source_id), ERR_INVALID_DATA);
|
if (p.sources.has("COLOR")) {
|
||||||
color_src = &meshdata.sources[color_source_id];
|
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..
|
//find largest source..
|
||||||
|
Loading…
Reference in New Issue
Block a user