コード例 #1
0
ファイル: dMeshNodeInfo.cpp プロジェクト: ak4hige/myway3d
void dMeshNodeInfo::ConvertToTriangles()
{
	NewtonMeshTriangulate (m_mesh);
}
コード例 #2
0
void Import::LoadGeometries (dScene& scene, GeometryCache& meshCache, const MaterialCache& materialCache)
{
    dScene::Iterator iter (scene);
    for (iter.Begin(); iter; iter ++) {
        dScene::dTreeNode* const geometryNode = iter.GetNode();
        dNodeInfo* const info = scene.GetInfoFromNode(geometryNode);
        if (info->IsType(dGeometryNodeInfo::GetRttiType())) {
            if (info->GetTypeId() == dMeshNodeInfo::GetRttiType()) {

                // add the vertices
                //TriObject* const geometry = CreateNewTriObject();
                TriObject* const geometry = (TriObject*) CreateInstance (GEOMOBJECT_CLASS_ID, Class_ID(TRIOBJ_CLASS_ID, 0));
                meshCache.AddMesh(geometry, geometryNode);

                dMeshNodeInfo* const meshInfo = (dMeshNodeInfo*) scene.GetInfoFromNode(geometryNode);
                NewtonMesh* const mesh = meshInfo->GetMesh();

                NewtonMeshTriangulate (mesh);

                int vertexCount = NewtonMeshGetVertexCount(mesh);
                int pointCount = NewtonMeshGetPointCount(mesh);

                //int triangleCount = NewtonMeshGetTotalFaceCount(mesh);
                int triangleCount = 0;
                for (void* face = NewtonMeshGetFirstFace(mesh); face; face = NewtonMeshGetNextFace(mesh, face)) {
                    if (!NewtonMeshIsFaceOpen(mesh, face)) {
                        triangleCount += NewtonMeshGetFaceIndexCount (mesh, face) - 2;
                    }
                }

                Mesh&  maxMesh = geometry->mesh;
                maxMesh.setNumVerts(vertexCount);
                maxMesh.setNumFaces(triangleCount);
                maxMesh.setNumTVerts(pointCount);
                maxMesh.setNumTVFaces(triangleCount);

                int vertexStride = NewtonMeshGetVertexStrideInByte(mesh) / sizeof (dFloat64);
                dFloat64* const vertex = NewtonMeshGetVertexArray (mesh);
                for (int j = 0; j < vertexCount; j ++) {
                    Point3 vx (vertex[vertexStride * j + 0], vertex[vertexStride * j + 1], vertex[vertexStride * j + 2]);
                    maxMesh.setVert(j, vx);
                }

                int pointStride = NewtonMeshGetPointStrideInByte(mesh) / sizeof (dFloat64);
                dFloat64* const points = NewtonMeshGetUV0Array(mesh);
                for (int j = 0; j < pointCount; j ++) {
                    Point3 uv (dFloat(points[j * pointStride + 0]), dFloat(points[j * pointStride + 1]), 0.0f);
                    maxMesh.setTVert(j, uv);
                }

                int faceIndex = 0;
                for (void* face = NewtonMeshGetFirstFace(mesh); face; face = NewtonMeshGetNextFace(mesh, face)) {
                    if (!NewtonMeshIsFaceOpen(mesh, face)) {
                        int vertexInices[256];
                        int pointIndices[256];

                        int indexCount = NewtonMeshGetFaceIndexCount (mesh, face);
                        int matId = NewtonMeshGetFaceMaterial (mesh, face);

                        MaterialProxi material;
                        material.m_mtl = 0;
                        material.m_matID = 0;
                        MaterialCache::dTreeNode* const materialNode = materialCache.Find(matId);
                        if (materialNode) {
                            material = materialNode->GetInfo();
                        }

                        NewtonMeshGetFaceIndices (mesh, face, vertexInices);
                        NewtonMeshGetFacePointIndices (mesh, face, pointIndices);

                        for (int i = 2; i < indexCount; i ++) {
                            Face* f = &maxMesh.faces[faceIndex];
                            TVFace* t = &maxMesh.tvFace[faceIndex];

                            f->v[0] = vertexInices[0];
                            f->v[1] = vertexInices[i - 1];
                            f->v[2] = vertexInices[i];

                            f->setEdgeVis(0, 1);
                            f->setEdgeVis(1, 1);
                            f->setEdgeVis(2, 1);
                            f->setSmGroup(0);

                            //f->setMatID((MtlID)matID);
                            f->setMatID(material.m_matID);

                            t->t[0] = pointIndices[0];
                            t->t[1] = pointIndices[i - 1];
                            t->t[2] = pointIndices[i];
                            faceIndex ++;
                        }
                    }
                }

                SetSmoothingGroups (maxMesh);

#if 0
                if (geom->m_uv1) {
                    int texChannel = 2;

                    //			maxMesh.setNumMaps (texChannel, TRUE);
                    maxMesh.setMapSupport (texChannel);
                    if (maxMesh.mapSupport(texChannel)) {
                        maxMesh.setNumMapVerts (texChannel, triangleCount * 3);
                        maxMesh.setNumMapFaces (texChannel, triangleCount);

                        UVVert *tv = maxMesh.mapVerts(texChannel);
                        faceIndex = 0;
                        TVFace *tf = maxMesh.mapFaces(texChannel);
                        for (segmentPtr = geom->GetFirst(); segmentPtr; segmentPtr = segmentPtr->GetNext()) {
                            const dSubMesh& segment = segmentPtr->GetInfo();
                            int triangleCount = segment.m_indexCount / 3;
                            for (k = 0; k < triangleCount; k ++) {
                                for (int m = 0; m < 3; m ++) {
                                    int index = segment.m_indexes[k * 3 + m];
                                    UVVert v (dFloat (geom->m_uv1[index * 2 + 0]), dFloat (geom->m_uv1[index * 2 + 1]), 0.0f);
                                    tv[faceIndex * 3 + m] = v;
                                    tf[faceIndex].t[m] = faceIndex * 3 + m;
                                }
                                faceIndex ++;
                            }
                        }
                    }
                }
#endif
            } else {
                _ASSERTE (0);
            }
        }
    }
}