public bool CombineWithObjects(NullMeshObjects otherOne, Matrix4x4 m1, Matrix4x4 m2, bool newCenter, ref Vector3 center) { if (otherOne == null) { return(false); } for (int i = 0; i < MeshObjectList.Count; i++) { if (this[i].IsVertexAnimationMeshObject()) { return(false); } } for (int i = 0; i < otherOne.GetMeshObjectCount(); i++) { if (otherOne[i].IsVertexAnimationMeshObject()) { return(false); } } for (int i = 0; i < MeshObjectList.Count; i++) { this[i].Transform(m1); } for (int i = 0; i < otherOne.GetMeshObjectCount(); i++) { otherOne[i].Transform(m2); } for (int i = 0; i < otherOne.GetMeshObjectCount(); i++) { MeshObjectList.Add(otherOne[i]); } otherOne.ClearWithOutDeletingData(); if (newCenter) { GetCenter(ref center); DoAutoCenter(center); } else { DoAutoCenter(); } return(false); }
protected bool RotateMeshObjects(NullMeshObjects meshObjects, float angle) { if (meshObjects == null || meshObjects.GetVertexCount() == 0) { return(false); } int triangleCount = meshObjects.GetTriangleCount(); if (triangleCount > 0) { //preparing data List <Vector3> vertices = new List <Vector3>(); List <Vector3> newVertices = new List <Vector3>(); for (int i = 0; i < meshObjects.GetMeshObjectCount(); i++) { NullMeshObject meshObject = meshObjects[i]; int count = meshObject.GetTriangleCount(); vertices.AddRange(meshObject.GetVertexData()); } //do rotate calculation Vector3RotateCalculation(angle, vertices, newVertices, false); //update mesh objects vertices int index = 0; for (int i = 0; i < meshObjects.GetMeshObjectCount(); i++) { NullMeshObject meshObject = meshObjects[i]; int count = meshObject.GetTriangleCount(); for (int j = 0; j < count; j++) { meshObject.SetVertex(j * 3 + 0, newVertices[index++]); meshObject.SetVertex(j * 3 + 1, newVertices[index++]); meshObject.SetVertex(j * 3 + 2, newVertices[index++]); } } //delete temp buffer vertices.Clear(); newVertices.Clear(); } return(true); }
protected bool BuildTangentForMeshObjects(NullMeshObjects meshObjects, float thresHold, bool forceSmooth = false) { if (meshObjects == null || meshObjects.GetMeshObjectCount() == 0) { return(false); } int triangleCount = meshObjects.GetTriangleCount(); if (triangleCount > 0) { //preparing data List <Vector3> vertices = new List <Vector3>(); List <Vector2> uvs = new List <Vector2>(); List <Vector3> tangents = Make <Vector3>(triangleCount * 3); List <Vector3> binormals = Make <Vector3>(triangleCount * 3); List <byte> smoothGroups = Make <byte>(triangleCount); int realTriangleCount = 0; for (int i = 0; i < meshObjects.GetMeshObjectCount(); i++) { NullMeshObject meshObject = meshObjects[i]; if (meshObject.GetUVGroups().Count == 0 || meshObject.GetNormalData().Count == 0) { continue; } int count = meshObject.GetTriangleCount(); vertices.AddRange(meshObject.GetVertexData()); byte smoothGroup = meshObject.GetSmoothGroup(); if (forceSmooth && smoothGroup == 0) { smoothGroup = 1; } Set(smoothGroups, smoothGroup); NullUVGroup uvGroup = meshObject.GetUVGroup(UVType.UVT_NORMAL_MAP); if (uvGroup == null) { uvGroup = meshObject.GetUVGroup(UVType.UVT_DEFAULT); } uvs.AddRange(uvGroup.GetUVData()); realTriangleCount += count; } //do face-smoothing ComputeTengents(thresHold, vertices, realTriangleCount, smoothGroups, uvs, tangents, binormals); //update mesh objects normals for (int i = 0; i < meshObjects.GetMeshObjectCount(); i++) { NullMeshObject meshObject = meshObjects[i]; if (meshObject.GetUVGroups().Count == 0 || meshObject.GetNormalData().Count == 0) { continue; } meshObject.BuildTangentArray(); int count = meshObject.GetTriangleCount(); for (int j = 0; j < count; j++) { //set tangent meshObject.SetTangent(j * 3 + 0, tangents[j * 3]); meshObject.SetTangent(j * 3 + 1, tangents[j * 3 + 1]); meshObject.SetTangent(j * 3 + 2, tangents[j * 3 + 2]); //set binormal meshObject.SetBinormal(j * 3 + 0, binormals[j * 3]); meshObject.SetBinormal(j * 3 + 1, binormals[j * 3 + 1]); meshObject.SetBinormal(j * 3 + 2, binormals[j * 3 + 2]); } } //delete temp buffer vertices.Clear(); tangents.Clear(); binormals.Clear(); uvs.Clear(); smoothGroups.Clear(); } return(true); }