Optimize model data access during models importing
This commit is contained in:
@@ -491,7 +491,7 @@ bool ProcessMesh(ImportedModelData& result, OpenFbxImporterData& data, const ofb
|
|||||||
mesh.Positions.Resize(vertexCount, false);
|
mesh.Positions.Resize(vertexCount, false);
|
||||||
for (int i = 0; i < vertexCount; i++)
|
for (int i = 0; i < vertexCount; i++)
|
||||||
{
|
{
|
||||||
mesh.Positions[i] = ToVector3(vertices[i + firstVertexOffset]);
|
mesh.Positions.Get()[i] = ToVector3(vertices[i + firstVertexOffset]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Indices (dummy index buffer)
|
// Indices (dummy index buffer)
|
||||||
@@ -503,7 +503,7 @@ bool ProcessMesh(ImportedModelData& result, OpenFbxImporterData& data, const ofb
|
|||||||
mesh.Indices.Resize(vertexCount, false);
|
mesh.Indices.Resize(vertexCount, false);
|
||||||
for (int i = 0; i < vertexCount; i++)
|
for (int i = 0; i < vertexCount; i++)
|
||||||
{
|
{
|
||||||
mesh.Indices[i] = i;
|
mesh.Indices.Get()[i] = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Texture coordinates
|
// Texture coordinates
|
||||||
@@ -512,7 +512,7 @@ bool ProcessMesh(ImportedModelData& result, OpenFbxImporterData& data, const ofb
|
|||||||
mesh.UVs.Resize(vertexCount, false);
|
mesh.UVs.Resize(vertexCount, false);
|
||||||
for (int i = 0; i < vertexCount; i++)
|
for (int i = 0; i < vertexCount; i++)
|
||||||
{
|
{
|
||||||
mesh.UVs[i] = ToVector2(uvs[i + firstVertexOffset]);
|
mesh.UVs.Get()[i] = ToVector2(uvs[i + firstVertexOffset]);
|
||||||
}
|
}
|
||||||
if (data.ConvertRH)
|
if (data.ConvertRH)
|
||||||
{
|
{
|
||||||
@@ -537,14 +537,14 @@ bool ProcessMesh(ImportedModelData& result, OpenFbxImporterData& data, const ofb
|
|||||||
mesh.Normals.Resize(vertexCount, false);
|
mesh.Normals.Resize(vertexCount, false);
|
||||||
for (int i = 0; i < vertexCount; i++)
|
for (int i = 0; i < vertexCount; i++)
|
||||||
{
|
{
|
||||||
mesh.Normals[i] = ToVector3(normals[i + firstVertexOffset]);
|
mesh.Normals.Get()[i] = ToVector3(normals[i + firstVertexOffset]);
|
||||||
}
|
}
|
||||||
if (data.ConvertRH)
|
if (data.ConvertRH)
|
||||||
{
|
{
|
||||||
// Mirror normals along the Z axis
|
// Mirror normals along the Z axis
|
||||||
for (int32 i = 0; i < vertexCount; i++)
|
for (int32 i = 0; i < vertexCount; i++)
|
||||||
{
|
{
|
||||||
mesh.Normals[i].Z *= -1.0f;
|
mesh.Normals.Get()[i].Z *= -1.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -559,14 +559,14 @@ bool ProcessMesh(ImportedModelData& result, OpenFbxImporterData& data, const ofb
|
|||||||
mesh.Tangents.Resize(vertexCount, false);
|
mesh.Tangents.Resize(vertexCount, false);
|
||||||
for (int i = 0; i < vertexCount; i++)
|
for (int i = 0; i < vertexCount; i++)
|
||||||
{
|
{
|
||||||
mesh.Tangents[i] = ToVector3(tangents[i + firstVertexOffset]);
|
mesh.Tangents.Get()[i] = ToVector3(tangents[i + firstVertexOffset]);
|
||||||
}
|
}
|
||||||
if (data.ConvertRH)
|
if (data.ConvertRH)
|
||||||
{
|
{
|
||||||
// Mirror tangents along the Z axis
|
// Mirror tangents along the Z axis
|
||||||
for (int32 i = 0; i < vertexCount; i++)
|
for (int32 i = 0; i < vertexCount; i++)
|
||||||
{
|
{
|
||||||
mesh.Tangents[i].Z *= -1.0f;
|
mesh.Tangents.Get()[i].Z *= -1.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -614,7 +614,7 @@ bool ProcessMesh(ImportedModelData& result, OpenFbxImporterData& data, const ofb
|
|||||||
mesh.LightmapUVs.Resize(vertexCount, false);
|
mesh.LightmapUVs.Resize(vertexCount, false);
|
||||||
for (int i = 0; i < vertexCount; i++)
|
for (int i = 0; i < vertexCount; i++)
|
||||||
{
|
{
|
||||||
mesh.LightmapUVs[i] = ToVector2(lightmapUVs[i + firstVertexOffset]);
|
mesh.LightmapUVs.Get()[i] = ToVector2(lightmapUVs[i + firstVertexOffset]);
|
||||||
}
|
}
|
||||||
if (data.ConvertRH)
|
if (data.ConvertRH)
|
||||||
{
|
{
|
||||||
@@ -636,7 +636,7 @@ bool ProcessMesh(ImportedModelData& result, OpenFbxImporterData& data, const ofb
|
|||||||
mesh.Colors.Resize(vertexCount, false);
|
mesh.Colors.Resize(vertexCount, false);
|
||||||
for (int i = 0; i < vertexCount; i++)
|
for (int i = 0; i < vertexCount; i++)
|
||||||
{
|
{
|
||||||
mesh.Colors[i] = ToColor(colors[i + firstVertexOffset]);
|
mesh.Colors.Get()[i] = ToColor(colors[i + firstVertexOffset]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -732,13 +732,13 @@ bool ProcessMesh(ImportedModelData& result, OpenFbxImporterData& data, const ofb
|
|||||||
|
|
||||||
blendShapeData.Vertices.Resize(shape->getVertexCount());
|
blendShapeData.Vertices.Resize(shape->getVertexCount());
|
||||||
for (int32 i = 0; i < blendShapeData.Vertices.Count(); i++)
|
for (int32 i = 0; i < blendShapeData.Vertices.Count(); i++)
|
||||||
blendShapeData.Vertices[i].VertexIndex = i;
|
blendShapeData.Vertices.Get()[i].VertexIndex = i;
|
||||||
|
|
||||||
auto shapeVertices = shape->getVertices();
|
auto shapeVertices = shape->getVertices();
|
||||||
for (int32 i = 0; i < blendShapeData.Vertices.Count(); i++)
|
for (int32 i = 0; i < blendShapeData.Vertices.Count(); i++)
|
||||||
{
|
{
|
||||||
auto delta = ToVector3(shapeVertices[i]) - mesh.Positions[i];
|
auto delta = ToVector3(shapeVertices[i]) - mesh.Positions.Get()[i];
|
||||||
blendShapeData.Vertices[i].PositionDelta = delta;
|
blendShapeData.Vertices.Get()[i].PositionDelta = delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto shapeNormals = shape->getNormals();
|
auto shapeNormals = shape->getNormals();
|
||||||
@@ -749,7 +749,7 @@ bool ProcessMesh(ImportedModelData& result, OpenFbxImporterData& data, const ofb
|
|||||||
if (length > ZeroTolerance)
|
if (length > ZeroTolerance)
|
||||||
delta /= length;*/
|
delta /= length;*/
|
||||||
auto delta = Vector3::Zero; // TODO: blend shape normals deltas fix when importing from fbx
|
auto delta = Vector3::Zero; // TODO: blend shape normals deltas fix when importing from fbx
|
||||||
blendShapeData.Vertices[i].NormalDelta = delta;
|
blendShapeData.Vertices.Get()[i].NormalDelta = delta;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -718,7 +718,7 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op
|
|||||||
// Remove blend shape vertices with empty deltas
|
// Remove blend shape vertices with empty deltas
|
||||||
for (int32 i = blendShape.Vertices.Count() - 1; i >= 0; i--)
|
for (int32 i = blendShape.Vertices.Count() - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
auto& v = blendShape.Vertices[i];
|
auto& v = blendShape.Vertices.Get()[i];
|
||||||
if (v.PositionDelta.IsZero() && v.NormalDelta.IsZero())
|
if (v.PositionDelta.IsZero() && v.NormalDelta.IsZero())
|
||||||
{
|
{
|
||||||
blendShape.Vertices.RemoveAt(i);
|
blendShape.Vertices.RemoveAt(i);
|
||||||
@@ -739,7 +739,7 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op
|
|||||||
int32 rootIndex = -1;
|
int32 rootIndex = -1;
|
||||||
for (int32 i = 0; i < data.Skeleton.Nodes.Count(); i++)
|
for (int32 i = 0; i < data.Skeleton.Nodes.Count(); i++)
|
||||||
{
|
{
|
||||||
const auto idx = data.Skeleton.Nodes[i].ParentIndex;
|
const auto idx = data.Skeleton.Nodes.Get()[i].ParentIndex;
|
||||||
if (idx == -1 && rootIndex == -1)
|
if (idx == -1 && rootIndex == -1)
|
||||||
{
|
{
|
||||||
// Found root
|
// Found root
|
||||||
@@ -767,7 +767,7 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op
|
|||||||
Swap(data.Skeleton.Nodes[rootIndex], data.Skeleton.Nodes[prevRootIndex]);
|
Swap(data.Skeleton.Nodes[rootIndex], data.Skeleton.Nodes[prevRootIndex]);
|
||||||
for (int32 i = 0; i < data.Skeleton.Nodes.Count(); i++)
|
for (int32 i = 0; i < data.Skeleton.Nodes.Count(); i++)
|
||||||
{
|
{
|
||||||
auto& node = data.Skeleton.Nodes[i];
|
auto& node = data.Skeleton.Nodes.Get()[i];
|
||||||
if (node.ParentIndex == prevRootIndex)
|
if (node.ParentIndex == prevRootIndex)
|
||||||
node.ParentIndex = rootIndex;
|
node.ParentIndex = rootIndex;
|
||||||
else if (node.ParentIndex == rootIndex)
|
else if (node.ParentIndex == rootIndex)
|
||||||
@@ -775,7 +775,7 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op
|
|||||||
}
|
}
|
||||||
for (int32 i = 0; i < data.Skeleton.Bones.Count(); i++)
|
for (int32 i = 0; i < data.Skeleton.Bones.Count(); i++)
|
||||||
{
|
{
|
||||||
auto& bone = data.Skeleton.Bones[i];
|
auto& bone = data.Skeleton.Bones.Get()[i];
|
||||||
if (bone.NodeIndex == prevRootIndex)
|
if (bone.NodeIndex == prevRootIndex)
|
||||||
bone.NodeIndex = rootIndex;
|
bone.NodeIndex = rootIndex;
|
||||||
else if (bone.NodeIndex == rootIndex)
|
else if (bone.NodeIndex == rootIndex)
|
||||||
@@ -845,7 +845,7 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op
|
|||||||
// Apply import transform on root bones
|
// Apply import transform on root bones
|
||||||
for (int32 i = 0; i < data.Skeleton.Bones.Count(); i++)
|
for (int32 i = 0; i < data.Skeleton.Bones.Count(); i++)
|
||||||
{
|
{
|
||||||
auto& bone = data.Skeleton.Bones[i];
|
auto& bone = data.Skeleton.Bones.Get()[i];
|
||||||
if (bone.ParentIndex == -1)
|
if (bone.ParentIndex == -1)
|
||||||
{
|
{
|
||||||
bone.LocalTransform = importTransform.LocalToWorld(bone.LocalTransform);
|
bone.LocalTransform = importTransform.LocalToWorld(bone.LocalTransform);
|
||||||
@@ -921,8 +921,6 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op
|
|||||||
}
|
}
|
||||||
reorder_nodes_and_test_it_out!
|
reorder_nodes_and_test_it_out!
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// TODO: remove nodes that don't have bone attached and all child nodes don' have any bones
|
|
||||||
}
|
}
|
||||||
else if (options.Type == ModelType::Animation)
|
else if (options.Type == ModelType::Animation)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user