Now supporting multiple material per mesh. Simon changed glDrawElementsBaseVertex to glDrawElements in DrawFinalPass.cpp Hallelulijah!
This commit is contained in:
@@ -11,8 +11,8 @@ bool Export::Meshes(std::string pathName, bool selectedOnly)
|
||||
MGlobal::displayError(MString() + "Export::Meshes() got no pathName. Do not know where to write file");
|
||||
return false;
|
||||
}
|
||||
meshes.clear();
|
||||
|
||||
MObjectArray Objects;
|
||||
if (selectedOnly) {
|
||||
// Retrieving the objects we currently have selected
|
||||
MSelectionList selected;
|
||||
@@ -25,7 +25,7 @@ bool Export::Meshes(std::string pathName, bool selectedOnly)
|
||||
|
||||
if (object.hasFn(MFn::kMesh)) {
|
||||
MFnDependencyNode thisNode(object);
|
||||
GetMeshData(object);
|
||||
Objects.append(object);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -48,9 +48,10 @@ bool Export::Meshes(std::string pathName, bool selectedOnly)
|
||||
if (next)
|
||||
continue;
|
||||
|
||||
GetMeshData(node);
|
||||
Objects.append(node);
|
||||
}
|
||||
}
|
||||
GetMeshData(Objects);
|
||||
WriteMeshData(pathName);
|
||||
return true;
|
||||
}
|
||||
@@ -87,19 +88,16 @@ bool Export::Animations(std::string pathName, std::vector<AnimationInfo> animInf
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Export::GetMeshData(MObject object)
|
||||
bool Export::GetMeshData(MObjectArray object)
|
||||
{
|
||||
if (!object.hasFn(MFn::kMesh))
|
||||
return false;
|
||||
|
||||
meshes.push_back(m_MeshHandler.GetMeshData(object));
|
||||
meshes = m_MeshHandler.GetMeshData(object);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Export::GetMaterialData()
|
||||
{
|
||||
// Traverse scene and return vector with all materials
|
||||
AllMaterials = m_MaterialHandler.DoIt();
|
||||
AllMaterials = m_MaterialHandler.DoIt(meshes);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -126,9 +124,7 @@ void Export::WriteMeshData(std::string pathName)
|
||||
|
||||
m_MeshFile.OpenFiles();
|
||||
|
||||
for (auto aMesh : meshes) {
|
||||
m_MeshFile.writeToFiles((OutputData*)&aMesh);
|
||||
}
|
||||
m_MeshFile.writeToFiles((OutputData*)&meshes);
|
||||
|
||||
m_MeshFile.CloseFiles();
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ public:
|
||||
bool Animations(std::string pathName, std::vector<AnimationInfo> animInfo);
|
||||
|
||||
private:
|
||||
bool GetMeshData(MObject object);
|
||||
bool GetMeshData(MObjectArray object);
|
||||
bool GetMaterialData();
|
||||
bool GetAnimationData(AnimationInfo info);
|
||||
|
||||
@@ -46,7 +46,7 @@ private:
|
||||
WriteToFile m_MtrlFile;
|
||||
|
||||
//Mesh Data
|
||||
std::vector<Mesh> meshes;
|
||||
Mesh meshes;
|
||||
|
||||
//Animation Data
|
||||
std::vector<BindPoseSkeletonNode> allBindPoses;
|
||||
|
||||
@@ -166,36 +166,42 @@ std::vector<std::string>* Material::TexturePaths()
|
||||
}
|
||||
|
||||
// Traverse the DAG and grab all the materials
|
||||
std::vector<MaterialNode>* Material::DoIt()
|
||||
std::vector<MaterialNode>* Material::DoIt(Mesh mesh)
|
||||
{
|
||||
// All materials we care about inherit from Lambert
|
||||
MItDependencyNodes matIt(MFn::kLambert);
|
||||
m_AllMaterials.clear();
|
||||
int totalIndices = 0;
|
||||
while (!matIt.isDone()) {
|
||||
MFnDependencyNode MaterialFnDN(matIt.thisNode());
|
||||
MaterialNode MaterialStorage;
|
||||
bool meshHasMaterial = false;
|
||||
//Mesh Indices is a map with <string : MaterialName, vector<int> : indices>
|
||||
for (auto aMeshMaterial : mesh.Indices) {
|
||||
if (aMeshMaterial.first.compare(MaterialFnDN.name().asChar()) == 0) {
|
||||
meshHasMaterial = true;
|
||||
MaterialStorage.IndexStart = totalIndices;
|
||||
MaterialStorage.IndexEnd = totalIndices + aMeshMaterial.second.size() - 1;
|
||||
totalIndices += aMeshMaterial.second.size();
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (meshHasMaterial) {
|
||||
grabLambertProperties(MaterialStorage, MaterialFnDN);
|
||||
|
||||
if (matIt.thisNode().hasFn(MFn::kPhong)) {
|
||||
grabLambertProperties(MaterialStorage, MaterialFnDN);
|
||||
grabPhongProperties(MaterialStorage, MaterialFnDN);
|
||||
if (matIt.thisNode().hasFn(MFn::kPhong)) {
|
||||
grabPhongProperties(MaterialStorage, MaterialFnDN);
|
||||
|
||||
m_AllMaterials.push_back(MaterialStorage);
|
||||
}
|
||||
else if (matIt.thisNode().hasFn(MFn::kBlinn)) {
|
||||
grabLambertProperties(MaterialStorage, MaterialFnDN);
|
||||
grabBlinnProperties(MaterialStorage, MaterialFnDN);
|
||||
} else if (matIt.thisNode().hasFn(MFn::kBlinn)) {
|
||||
grabBlinnProperties(MaterialStorage, MaterialFnDN);
|
||||
|
||||
m_AllMaterials.push_back(MaterialStorage);
|
||||
}
|
||||
else if (matIt.thisNode().hasFn(MFn::kLambert)) {
|
||||
grabLambertProperties(MaterialStorage, MaterialFnDN);
|
||||
|
||||
MaterialStorage.ReflectionFactor = 0.0f;
|
||||
MaterialStorage.SpecularExponent = 0.0f;
|
||||
|
||||
m_AllMaterials.push_back(MaterialStorage);
|
||||
}
|
||||
} else if (matIt.thisNode().hasFn(MFn::kLambert)) {
|
||||
MaterialStorage.ReflectionFactor = 0.0f;
|
||||
MaterialStorage.SpecularExponent = 0.0f;
|
||||
}
|
||||
|
||||
m_AllMaterials.push_back(MaterialStorage);
|
||||
}
|
||||
matIt.next();
|
||||
}
|
||||
|
||||
|
||||
@@ -67,9 +67,9 @@ public:
|
||||
out << "IndexStart: " << IndexStart << endl;
|
||||
out << "IndexEnd: " << IndexEnd << endl;
|
||||
|
||||
out << "ColorMapFile length: " << ColorMapFileLength << endl;
|
||||
if (ColorMapFileLength > 0)
|
||||
out << "ColorMapFile: " << ColorMapFile << endl;
|
||||
|
||||
if (NormalMapFileLength > 0)
|
||||
out << "NormalMapFile: " << NormalMapFile << endl;
|
||||
|
||||
@@ -86,7 +86,7 @@ class Material
|
||||
public:
|
||||
Material() {};
|
||||
~Material() {};
|
||||
std::vector<MaterialNode>* DoIt();
|
||||
std::vector<MaterialNode>* DoIt(Mesh mesh);
|
||||
std::vector<std::string>* TexturePaths();
|
||||
private:
|
||||
MPlug m_Plug;
|
||||
|
||||
@@ -73,186 +73,201 @@ std::map<int, MeshClass::WeightInfo> MeshClass::GetWeightData()
|
||||
return weightMap;
|
||||
}
|
||||
|
||||
Mesh MeshClass::GetMeshData(MObject object)
|
||||
Mesh MeshClass::GetMeshData(MObjectArray object)
|
||||
{
|
||||
Mesh newMesh;
|
||||
vector<VertexLayout>& vertexList = newMesh.Vertices;
|
||||
map<string, vector<int>>& indexLists = newMesh.Indices;
|
||||
// In here, we retrieve triangulated polygons from the mesh
|
||||
MFnMesh mesh(object);
|
||||
for (int ObjectID = 0; ObjectID < object.length(); ObjectID++) {
|
||||
if (!object[ObjectID].hasFn(MFn::kMesh))
|
||||
continue;
|
||||
|
||||
map<unsigned int, vector<unsigned int>> vertexToIndex;;
|
||||
// In here, we retrieve triangulated polygons from the mesh
|
||||
MFnMesh mesh(object[ObjectID]);
|
||||
MDagPathArray dagPaths;
|
||||
MDagPath::getAllPathsTo(object[ObjectID], dagPaths);
|
||||
for (int pathID = 0; pathID < dagPaths.length(); pathID++) {
|
||||
MGlobal::displayInfo(dagPaths[pathID].fullPathName());
|
||||
MDagPath thisMeshPath(dagPaths[pathID]);
|
||||
MMatrix transformMatrix = thisMeshPath.inclusiveMatrix();
|
||||
|
||||
MIntArray intdexOffsetVertexCount, vertices, triangleList;
|
||||
MPointArray dummy;
|
||||
unsigned int vertexIndex;
|
||||
MVector normal;
|
||||
MPoint pos;
|
||||
float2 UV;
|
||||
double biTangent[3];
|
||||
double biNormal[3];
|
||||
MFloatVectorArray Tangents;
|
||||
MFloatVectorArray biNormals;
|
||||
map<unsigned int, vector<unsigned int>> vertexToIndex;;
|
||||
|
||||
MObjectArray shaderList;
|
||||
MIntArray shaderIndexList;
|
||||
mesh.getConnectedShaders(0, shaderList, shaderIndexList);
|
||||
MIntArray intdexOffsetVertexCount, vertices, triangleList;
|
||||
MPointArray dummy;
|
||||
unsigned int vertexIndex;
|
||||
MVector normal;
|
||||
MPoint pos;
|
||||
float2 UV;
|
||||
double biTangent[3];
|
||||
double biNormal[3];
|
||||
MFloatVectorArray Tangents;
|
||||
MFloatVectorArray biNormals;
|
||||
|
||||
map<string, vector<int>> materialFaceIDs;
|
||||
MGlobal::displayInfo(MString() + "shaderIndexList: " + shaderIndexList.length());
|
||||
MGlobal::displayInfo(MString() + "shaderList: " + shaderList.length());
|
||||
MPlugArray plugArray;
|
||||
for (int i = 0; i < shaderIndexList.length(); i++)
|
||||
{
|
||||
MFnDependencyNode shader(shaderList[shaderIndexList[i]]);
|
||||
MPlug p_Plug = shader.findPlug("surfaceShader");
|
||||
if (p_Plug.connectedTo(plugArray, true, false)) {
|
||||
MFnDependencyNode node = plugArray[0].node();
|
||||
materialFaceIDs[node.name().asChar()].push_back(i);
|
||||
}
|
||||
}
|
||||
|
||||
map<int, WeightInfo> vertexWeights = GetWeightData();
|
||||
MObjectArray shaderList;
|
||||
MIntArray shaderIndexList;
|
||||
mesh.getConnectedShaders(0, shaderList, shaderIndexList);
|
||||
|
||||
mesh.getTangents(Tangents, MSpace::kObject, NULL);
|
||||
mesh.getBinormals(biNormals, MSpace::kObject, NULL);
|
||||
|
||||
MItMeshFaceVertex faceVert(object);
|
||||
|
||||
int intDummy = 0;
|
||||
|
||||
MItMeshPolygon meshPolyIter(object);
|
||||
|
||||
for (auto aMaterial : materialFaceIDs) {
|
||||
for (auto faceID : aMaterial.second) {
|
||||
|
||||
vector<array<unsigned int, 2>> localVertexToGlobalIndex;
|
||||
meshPolyIter.setIndex(faceID, intDummy);
|
||||
|
||||
meshPolyIter.getVertices(vertices);
|
||||
meshPolyIter.getTriangles(dummy, triangleList);
|
||||
//MGlobal::displayInfo("Befor Second Loop");
|
||||
for (unsigned int i = 0; i < vertices.length(); i++) {
|
||||
VertexLayout thisVertex;
|
||||
vertexIndex = meshPolyIter.vertexIndex(i);
|
||||
faceVert.setIndex(meshPolyIter.index(), i, intDummy, intDummy);
|
||||
//MGlobal::displayInfo("In Second Loop");
|
||||
pos = faceVert.position();
|
||||
if (abs(pos.x) > 0.0001)
|
||||
thisVertex.Pos[0] = pos.x;
|
||||
if (abs(pos.y) > 0.0001)
|
||||
thisVertex.Pos[1] = pos.y;
|
||||
if (abs(pos.z) > 0.0001)
|
||||
thisVertex.Pos[2] = pos.z;
|
||||
|
||||
faceVert.getNormal(normal);
|
||||
if (abs(normal[0]) > 0.0001)
|
||||
thisVertex.Normal[0] = normal[0];
|
||||
if (abs(normal[1]) > 0.0001)
|
||||
thisVertex.Normal[1] = normal[1];
|
||||
if (abs(normal[2]) > 0.0001)
|
||||
thisVertex.Normal[2] = normal[2];
|
||||
|
||||
MFloatVector Tangent = Tangents[faceVert.tangentId()];
|
||||
//MVector tmp = faceVert.getTangent(MSpace::kObject, NULL);
|
||||
//tmp.get(biTangent);
|
||||
if (abs(Tangent[0]) > 0.0001)
|
||||
thisVertex.Tangent[0] = Tangent[0];
|
||||
if (abs(Tangent[1]) > 0.0001)
|
||||
thisVertex.Tangent[1] = Tangent[1];
|
||||
if (abs(Tangent[2]) > 0.0001)
|
||||
thisVertex.Tangent[2] = Tangent[2];
|
||||
|
||||
MFloatVector biNormal = biNormals[faceVert.tangentId()];
|
||||
//faceVert.getBinormal().get(biNormal);
|
||||
if (abs(biNormal[0]) > 0.0001)
|
||||
thisVertex.BiNormal[0] = biNormal[0];
|
||||
if (abs(biNormal[1]) > 0.0001)
|
||||
thisVertex.BiNormal[1] = biNormal[1];
|
||||
if (abs(biNormal[2]) > 0.0001)
|
||||
thisVertex.BiNormal[2] = biNormal[2];
|
||||
|
||||
faceVert.getUV(UV);
|
||||
thisVertex.Uv[0] = UV[0];
|
||||
thisVertex.Uv[1] = UV[1];
|
||||
|
||||
thisVertex.BoneIndices[0] = vertexWeights[faceVert.vertId()].BoneIndices[0];
|
||||
thisVertex.BoneIndices[1] = vertexWeights[faceVert.vertId()].BoneIndices[1];
|
||||
thisVertex.BoneIndices[2] = vertexWeights[faceVert.vertId()].BoneIndices[2];
|
||||
thisVertex.BoneIndices[3] = vertexWeights[faceVert.vertId()].BoneIndices[3];
|
||||
|
||||
if (abs(vertexWeights[faceVert.vertId()].BoneWeights[0]) > 0.0001)
|
||||
thisVertex.BoneWeights[0] = vertexWeights[faceVert.vertId()].BoneWeights[0];
|
||||
if (abs(vertexWeights[faceVert.vertId()].BoneWeights[1]) > 0.0001)
|
||||
thisVertex.BoneWeights[1] = vertexWeights[faceVert.vertId()].BoneWeights[1];
|
||||
if (abs(vertexWeights[faceVert.vertId()].BoneWeights[2]) > 0.0001)
|
||||
thisVertex.BoneWeights[2] = vertexWeights[faceVert.vertId()].BoneWeights[2];
|
||||
if (abs(vertexWeights[faceVert.vertId()].BoneWeights[3]) > 0.0001)
|
||||
thisVertex.BoneWeights[3] = vertexWeights[faceVert.vertId()].BoneWeights[3];
|
||||
|
||||
float totalWeight = thisVertex.BoneWeights[0] + thisVertex.BoneWeights[1] + thisVertex.BoneWeights[2] + thisVertex.BoneWeights[3];
|
||||
if (totalWeight < 1.00f && totalWeight > 0.01f) {
|
||||
thisVertex.BoneWeights[0] /= totalWeight;
|
||||
thisVertex.BoneWeights[1] /= totalWeight;
|
||||
thisVertex.BoneWeights[2] /= totalWeight;
|
||||
thisVertex.BoneWeights[3] /= totalWeight;
|
||||
map<string, vector<int>> materialFaceIDs;
|
||||
MGlobal::displayInfo(MString() + "shaderIndexList: " + shaderIndexList.length());
|
||||
MGlobal::displayInfo(MString() + "shaderList: " + shaderList.length());
|
||||
MPlugArray plugArray;
|
||||
for (int i = 0; i < shaderIndexList.length(); i++) {
|
||||
MFnDependencyNode shader(shaderList[shaderIndexList[i]]);
|
||||
MPlug p_Plug = shader.findPlug("surfaceShader");
|
||||
if (p_Plug.connectedTo(plugArray, true, false)) {
|
||||
MFnDependencyNode node = plugArray[0].node();
|
||||
materialFaceIDs[node.name().asChar()].push_back(i);
|
||||
}
|
||||
|
||||
std::vector<VertexLayout>::iterator it = std::find(vertexList.begin(), vertexList.end(), thisVertex);
|
||||
array<unsigned int, 2> tmp;
|
||||
if (it != vertexList.end()) {
|
||||
tmp[0] = vertexIndex;
|
||||
tmp[1] = it - vertexList.begin();
|
||||
localVertexToGlobalIndex.push_back(tmp);
|
||||
} else {
|
||||
tmp[0] = vertexIndex;
|
||||
tmp[1] = vertexList.size();
|
||||
localVertexToGlobalIndex.push_back(tmp);
|
||||
vertexList.push_back(thisVertex);
|
||||
}
|
||||
//MGlobal::displayInfo(MString() + "localVertexToGlobalIndex[localVertexToGlobalIndex.size()-1]: " + localVertexToGlobalIndex[localVertexToGlobalIndex.size()-1][0] + " " + localVertexToGlobalIndex[localVertexToGlobalIndex.size()-1][1]);
|
||||
//cout << "Pos: " << thisVertex.Pos[0] << "/" << thisVertex.Pos[1] << "/" << thisVertex.Pos[2] << endl;
|
||||
//cout << "Normals: " << thisVertex.Normal[0] << "/" << thisVertex.Normal[1] << "/" << thisVertex.Normal[2] << endl;
|
||||
//cout << "Bi-Normals: " << thisVertex.BiNormal[0] << "/" << thisVertex.BiNormal[1] << "/" << thisVertex.BiNormal[2] << endl;
|
||||
//cout << "Bi-Tangents: " << thisVertex.BiTangent[0] << "/" << thisVertex.BiTangent[1] << "/" << thisVertex.BiTangent[2] << endl;
|
||||
//cout << "UV: " << thisVertex.Uv[0] << "/" << thisVertex.Uv[1] << endl;
|
||||
}
|
||||
for (unsigned int i = 0; i < triangleList.length(); i++) {
|
||||
unsigned int k = 0;
|
||||
if (localVertexToGlobalIndex.size() > 0) {
|
||||
//MGlobal::displayInfo(MString() + "triangleList[i] : " + triangleList[i]);
|
||||
while (localVertexToGlobalIndex[k][0] != triangleList[i] && k < localVertexToGlobalIndex.size()) {
|
||||
k++;
|
||||
|
||||
map<int, WeightInfo> vertexWeights = GetWeightData();
|
||||
|
||||
mesh.getTangents(Tangents, MSpace::kTransform, NULL);
|
||||
mesh.getBinormals(biNormals, MSpace::kTransform, NULL);
|
||||
|
||||
MItMeshFaceVertex faceVert(object[ObjectID]);
|
||||
|
||||
int intDummy = 0;
|
||||
|
||||
MItMeshPolygon meshPolyIter(object[ObjectID]);
|
||||
MFloatPointArray positions;
|
||||
|
||||
mesh.getPoints(positions);
|
||||
|
||||
for (auto aMaterial : materialFaceIDs) {
|
||||
for (auto faceID : aMaterial.second) {
|
||||
|
||||
vector<array<unsigned int, 2>> localVertexToGlobalIndex;
|
||||
meshPolyIter.setIndex(faceID, intDummy);
|
||||
|
||||
meshPolyIter.getVertices(vertices);
|
||||
meshPolyIter.getTriangles(dummy, triangleList);
|
||||
//MGlobal::displayInfo("Befor Second Loop");
|
||||
for (unsigned int i = 0; i < vertices.length(); i++) {
|
||||
VertexLayout thisVertex;
|
||||
vertexIndex = meshPolyIter.vertexIndex(i);
|
||||
faceVert.setIndex(meshPolyIter.index(), i, intDummy, intDummy);
|
||||
//MGlobal::displayInfo("In Second Loop");
|
||||
//pos = faceVert.position(MSpace::kTransform);
|
||||
//mesh.getPoint(vertexIndex, pos, MSpace::kPostTransform);
|
||||
pos = positions[vertexIndex];
|
||||
pos = pos * transformMatrix;
|
||||
if (abs(pos.x) > 0.0001)
|
||||
thisVertex.Pos[0] = pos.x;
|
||||
if (abs(pos.y) > 0.0001)
|
||||
thisVertex.Pos[1] = pos.y;
|
||||
if (abs(pos.z) > 0.0001)
|
||||
thisVertex.Pos[2] = pos.z;
|
||||
|
||||
faceVert.getNormal(normal, MSpace::kTransform);
|
||||
if (abs(normal[0]) > 0.0001)
|
||||
thisVertex.Normal[0] = normal[0];
|
||||
if (abs(normal[1]) > 0.0001)
|
||||
thisVertex.Normal[1] = normal[1];
|
||||
if (abs(normal[2]) > 0.0001)
|
||||
thisVertex.Normal[2] = normal[2];
|
||||
|
||||
MFloatVector Tangent = Tangents[faceVert.tangentId()];
|
||||
//MVector tmp = faceVert.getTangent(MSpace::kObject, NULL);
|
||||
//tmp.get(biTangent);
|
||||
if (abs(Tangent[0]) > 0.0001)
|
||||
thisVertex.Tangent[0] = Tangent[0];
|
||||
if (abs(Tangent[1]) > 0.0001)
|
||||
thisVertex.Tangent[1] = Tangent[1];
|
||||
if (abs(Tangent[2]) > 0.0001)
|
||||
thisVertex.Tangent[2] = Tangent[2];
|
||||
|
||||
MFloatVector biNormal = biNormals[faceVert.tangentId()];
|
||||
//faceVert.getBinormal().get(biNormal);
|
||||
if (abs(biNormal[0]) > 0.0001)
|
||||
thisVertex.BiNormal[0] = biNormal[0];
|
||||
if (abs(biNormal[1]) > 0.0001)
|
||||
thisVertex.BiNormal[1] = biNormal[1];
|
||||
if (abs(biNormal[2]) > 0.0001)
|
||||
thisVertex.BiNormal[2] = biNormal[2];
|
||||
|
||||
faceVert.getUV(UV);
|
||||
thisVertex.Uv[0] = UV[0];
|
||||
thisVertex.Uv[1] = UV[1];
|
||||
|
||||
thisVertex.BoneIndices[0] = vertexWeights[faceVert.vertId()].BoneIndices[0];
|
||||
thisVertex.BoneIndices[1] = vertexWeights[faceVert.vertId()].BoneIndices[1];
|
||||
thisVertex.BoneIndices[2] = vertexWeights[faceVert.vertId()].BoneIndices[2];
|
||||
thisVertex.BoneIndices[3] = vertexWeights[faceVert.vertId()].BoneIndices[3];
|
||||
|
||||
if (abs(vertexWeights[faceVert.vertId()].BoneWeights[0]) > 0.0001)
|
||||
thisVertex.BoneWeights[0] = vertexWeights[faceVert.vertId()].BoneWeights[0];
|
||||
if (abs(vertexWeights[faceVert.vertId()].BoneWeights[1]) > 0.0001)
|
||||
thisVertex.BoneWeights[1] = vertexWeights[faceVert.vertId()].BoneWeights[1];
|
||||
if (abs(vertexWeights[faceVert.vertId()].BoneWeights[2]) > 0.0001)
|
||||
thisVertex.BoneWeights[2] = vertexWeights[faceVert.vertId()].BoneWeights[2];
|
||||
if (abs(vertexWeights[faceVert.vertId()].BoneWeights[3]) > 0.0001)
|
||||
thisVertex.BoneWeights[3] = vertexWeights[faceVert.vertId()].BoneWeights[3];
|
||||
|
||||
float totalWeight = thisVertex.BoneWeights[0] + thisVertex.BoneWeights[1] + thisVertex.BoneWeights[2] + thisVertex.BoneWeights[3];
|
||||
if (totalWeight < 1.00f && totalWeight > 0.01f) {
|
||||
thisVertex.BoneWeights[0] /= totalWeight;
|
||||
thisVertex.BoneWeights[1] /= totalWeight;
|
||||
thisVertex.BoneWeights[2] /= totalWeight;
|
||||
thisVertex.BoneWeights[3] /= totalWeight;
|
||||
}
|
||||
|
||||
std::vector<VertexLayout>::iterator it = std::find(vertexList.begin(), vertexList.end(), thisVertex);
|
||||
array<unsigned int, 2> tmp;
|
||||
if (it != vertexList.end()) {
|
||||
tmp[0] = vertexIndex;
|
||||
tmp[1] = it - vertexList.begin();
|
||||
localVertexToGlobalIndex.push_back(tmp);
|
||||
} else {
|
||||
tmp[0] = vertexIndex;
|
||||
tmp[1] = vertexList.size();
|
||||
localVertexToGlobalIndex.push_back(tmp);
|
||||
vertexList.push_back(thisVertex);
|
||||
}
|
||||
//MGlobal::displayInfo(MString() + "localVertexToGlobalIndex[localVertexToGlobalIndex.size()-1]: " + localVertexToGlobalIndex[localVertexToGlobalIndex.size()-1][0] + " " + localVertexToGlobalIndex[localVertexToGlobalIndex.size()-1][1]);
|
||||
//cout << "Pos: " << thisVertex.Pos[0] << "/" << thisVertex.Pos[1] << "/" << thisVertex.Pos[2] << endl;
|
||||
//cout << "Normals: " << thisVertex.Normal[0] << "/" << thisVertex.Normal[1] << "/" << thisVertex.Normal[2] << endl;
|
||||
//cout << "Bi-Normals: " << thisVertex.BiNormal[0] << "/" << thisVertex.BiNormal[1] << "/" << thisVertex.BiNormal[2] << endl;
|
||||
//cout << "Bi-Tangents: " << thisVertex.BiTangent[0] << "/" << thisVertex.BiTangent[1] << "/" << thisVertex.BiTangent[2] << endl;
|
||||
//cout << "UV: " << thisVertex.Uv[0] << "/" << thisVertex.Uv[1] << endl;
|
||||
}
|
||||
for (unsigned int i = 0; i < triangleList.length(); i++) {
|
||||
unsigned int k = 0;
|
||||
if (localVertexToGlobalIndex.size() > 0) {
|
||||
//MGlobal::displayInfo(MString() + "triangleList[i] : " + triangleList[i]);
|
||||
while (localVertexToGlobalIndex[k][0] != triangleList[i] && k < localVertexToGlobalIndex.size()) {
|
||||
k++;
|
||||
}
|
||||
//MGlobal::displayInfo(MString() + "localVertexToGlobalIndex[k] : " + localVertexToGlobalIndex[k][0] + " " + localVertexToGlobalIndex[k][1]);
|
||||
indexLists[aMaterial.first.c_str()].push_back(localVertexToGlobalIndex[k][1]);
|
||||
}
|
||||
}
|
||||
//MGlobal::displayInfo(MString() + "localVertexToGlobalIndex[k] : " + localVertexToGlobalIndex[k][0] + " " + localVertexToGlobalIndex[k][1]);
|
||||
indexLists[aMaterial.first.c_str()].push_back(localVertexToGlobalIndex[k][1]);
|
||||
}
|
||||
// MGlobal::displayInfo( MString() + "localVertexToGlobalIndex.size(): " + localVertexToGlobalIndex.size());
|
||||
// if (localVertexToGlobalIndex.size() > 0) {
|
||||
// MGlobal::displayInfo(MString() + "triangleList.length(): " + triangleList.length());
|
||||
// for (unsigned int i = triangleList.length() - 1; i >= 0; i--) {
|
||||
// MGlobal::displayInfo(MString() + "i: " + i);
|
||||
// unsigned int k = localVertexToGlobalIndex.size() - 1;
|
||||
// MGlobal::displayInfo(MString() + "triangleList[i] : " + triangleList[i]);
|
||||
// while (localVertexToGlobalIndex[k] != triangleList[i] && k >= 0) {
|
||||
// MGlobal::displayInfo(MString() + "k: " + k);
|
||||
// k--;
|
||||
// }
|
||||
// MGlobal::displayInfo(MString() + "localVertexToGlobalIndex[k] : " + localVertexToGlobalIndex[k]);
|
||||
// indexList.push_back(indexOffset + k);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
// MGlobal::displayInfo( MString() + "localVertexToGlobalIndex.size(): " + localVertexToGlobalIndex.size());
|
||||
// if (localVertexToGlobalIndex.size() > 0) {
|
||||
// MGlobal::displayInfo(MString() + "triangleList.length(): " + triangleList.length());
|
||||
// for (unsigned int i = triangleList.length() - 1; i >= 0; i--) {
|
||||
// MGlobal::displayInfo(MString() + "i: " + i);
|
||||
// unsigned int k = localVertexToGlobalIndex.size() - 1;
|
||||
// MGlobal::displayInfo(MString() + "triangleList[i] : " + triangleList[i]);
|
||||
// while (localVertexToGlobalIndex[k] != triangleList[i] && k >= 0) {
|
||||
// MGlobal::displayInfo(MString() + "k: " + k);
|
||||
// k--;
|
||||
// }
|
||||
// MGlobal::displayInfo(MString() + "localVertexToGlobalIndex[k] : " + localVertexToGlobalIndex[k]);
|
||||
// indexList.push_back(indexOffset + k);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
int totalIndecies = 0;
|
||||
int totalIndices = 0;
|
||||
for (auto aList : newMesh.Indices) {
|
||||
totalIndecies += aList.second.size();
|
||||
totalIndices += aList.second.size();
|
||||
}
|
||||
|
||||
newMesh.NumIndices = totalIndecies;
|
||||
newMesh.NumIndices = totalIndices;
|
||||
newMesh.NumVertices = newMesh.Vertices.size();
|
||||
|
||||
return newMesh;
|
||||
|
||||
@@ -69,8 +69,9 @@ public:
|
||||
for (auto aVertex : Vertices) {
|
||||
aVertex.WriteBinary(out);
|
||||
}
|
||||
for (auto aIndex : Indices) {
|
||||
out.write((char*)aIndex.second.data(), sizeof(int) * aIndex.second.size());
|
||||
//for (auto aIndex : Indices) {
|
||||
for (std::map<std::string, std::vector<int>>::reverse_iterator aIndex = Indices.rbegin(); aIndex != Indices.rend(); aIndex++){
|
||||
out.write((char*)(*aIndex).second.data(), sizeof(int) * (*aIndex).second.size());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,7 +102,7 @@ class MeshClass
|
||||
{
|
||||
public:
|
||||
MeshClass();
|
||||
Mesh GetMeshData(MObject Object);
|
||||
Mesh GetMeshData(MObjectArray Object);
|
||||
~MeshClass();
|
||||
private:
|
||||
struct WeightInfo {
|
||||
|
||||
Reference in New Issue
Block a user