//----------------------------------------------------------------------------------- void Renderer::DrawVertexArray(const Vertex_PCT* vertexes, int numVertexes, DrawMode drawMode /*= DrawMode::QUADS*/) { if (numVertexes == 0) { return; } MeshBuilder builder; builder.Begin(); for (int i = 0; i < numVertexes; ++i) { builder.SetColor(vertexes[i].color); builder.SetUV(vertexes[i].texCoords); builder.SetTBN(Vector3::ZERO, Vector3::ZERO, Vector3::ZERO); builder.AddVertex(vertexes[i].pos); builder.AddIndex(i); } builder.End(); Mesh* mesh = new Mesh(); builder.CopyToMesh(mesh, &Vertex_PCUTB::Copy, sizeof(Vertex_PCUTB), &Vertex_PCUTB::BindMeshToVAO); mesh->m_drawMode = drawMode; MeshRenderer* thingToRender = new MeshRenderer(mesh, m_defaultMaterial); m_defaultMaterial->SetMatrices(Matrix4x4::IDENTITY, m_viewStack.GetTop(), m_projStack.GetTop()); GL_CHECK_ERROR(); thingToRender->Render(); delete mesh; }
//----------------------------------------------------------------------------------- static void ImportVertex(MeshBuilder& builder, const Matrix4x4& transform, FbxMesh* mesh, int polyIndex, int vertIndex, std::vector<SkinWeight>& skinWeights) { Vector3 normal; if (GetNormal(normal, transform, mesh, polyIndex, vertIndex)) { builder.SetNormal(normal); //Temporary hack to get around not supporting multiple vertex definitions Vector3 bitangent = Vector3::UP; if (normal == bitangent) { bitangent = Vector3::FORWARD; } Vector3 tangent = Vector3::Cross(bitangent, normal); bitangent = Vector3::Cross(normal, tangent); builder.SetTangent(tangent); builder.SetBitangent(bitangent); } RGBA color; if (GetColor(color, mesh, polyIndex, vertIndex)) { builder.SetColor(color); } Vector2 uv; if (GetUV(uv, mesh, polyIndex, vertIndex, 0)) { builder.SetUV(uv); } //Set Skin Weights int controlIndex = mesh->GetPolygonVertex(polyIndex, vertIndex); if (controlIndex < skinWeights.size()) { builder.SetBoneWeights(skinWeights[controlIndex].indices, skinWeights[controlIndex].weights); builder.RenormalizeSkinWeights(); //Just to be safe. } else { builder.ClearBoneWeights(); } Vector3 position; if (GetPosition(&position, transform, mesh, polyIndex, vertIndex)) { builder.AddVertex(position); } }
//----------------------------------------------------------------------------------- void Renderer::DrawVertexArray(const Vertex_PCT* vertexes, int numVertexes, DrawMode drawMode /*= QUADS*/, Texture* texture /*= nullptr*/) { // if (!texture) // { // texture = m_defaultTexture; // } // BindTexture(*texture); // glEnableClientState(GL_VERTEX_ARRAY); // glEnableClientState(GL_COLOR_ARRAY); // glEnableClientState(GL_TEXTURE_COORD_ARRAY); // // glVertexPointer(3, GL_FLOAT, sizeof(Vertex_PCT), &vertexes[0].pos); // glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Vertex_PCT), &vertexes[0].color); // glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex_PCT), &vertexes[0].texCoords); // // glDrawArrays(GetDrawMode(drawMode), 0, numVertexes); // // glDisableClientState(GL_VERTEX_ARRAY); // glDisableClientState(GL_COLOR_ARRAY); // glDisableClientState(GL_TEXTURE_COORD_ARRAY); // UnbindTexture(); if (numVertexes == 0) { return; } MeshBuilder builder; builder.Begin(); for (int i = 0; i < numVertexes; ++i) { builder.SetColor(vertexes[i].color); builder.SetUV(vertexes[i].texCoords); builder.SetTBN(Vector3::ZERO, Vector3::ZERO, Vector3::ZERO); builder.AddVertex(vertexes[i].pos); builder.AddIndex(i); } builder.End(); Mesh* mesh = new Mesh(); builder.CopyToMesh(mesh, &Vertex_PCUTB::Copy); mesh->m_drawMode = drawMode; MeshRenderer thingToRender = MeshRenderer(mesh, m_defaultMaterial); m_defaultMaterial->SetMatrices(Matrix4x4::IDENTITY, m_viewStack.GetTop(), m_projStack.GetTop()); GL_CHECK_ERROR(); thingToRender.Render(); delete mesh; }
//----------------------------------------------------------------------------------- void Renderer::DrawVertexArrayModern(const Vertex_PCT* vertexes, int numVertexes, Renderer::DrawMode drawMode /*= QUADS*/, Texture* texture /*= nullptr*/) { MeshBuilder builder; builder.Begin(); for (int i = 0; i < numVertexes; ++i) { builder.SetColor(vertexes[i].color); builder.SetUV(vertexes[i].texCoords); builder.SetTBN(Vector3::ZERO, Vector3::ZERO, Vector3::ZERO); builder.AddVertex(vertexes[i].pos); builder.AddIndex(i); } builder.End(); Mesh* mesh = new Mesh(); builder.CopyToMesh(mesh, &Vertex_PCUTB::Copy); mesh->m_drawMode = drawMode; MeshRenderer thingToRender = MeshRenderer(mesh, m_defaultMaterial); m_defaultMaterial->SetMatrices(Matrix4x4::IDENTITY, m_viewStack.GetTop(), m_projStack.GetTop()); GL_CHECK_ERROR(); thingToRender.Render(); delete mesh; }
//-------------------------------------------------------------------- Ptr<TransformNode> Nebula3Writer::writeSkinGeometryData( const NodeData& instanceNodeData,const SkinData& skinData,GeometryData& geometryData ) { Ptr<TransformNode> transformNode = TransformNode::Create(); MeshBuilder meshBuilder; Util::String meshFilename ="msh:" + geometryData.mGeometryName;meshFilename.Append(".nvx2"); for (int groupIndex=0;groupIndex<geometryData.mMeshDatas.Size();groupIndex++) { /// 设置基本信息 GeometryData::MeshData& meshData = geometryData.mMeshDatas[groupIndex]; Ptr<CharacterSkinNode> shapeNode = CharacterSkinNode::Create(); Util::String shapeName(geometryData.mGeometryName); shapeName.Append("_s_"); shapeName.AppendInt(groupIndex); shapeNode->SetName(shapeName); shapeNode->SetPrimitiveGroupIndex(groupIndex); shapeNode->SetMeshResourceId(meshFilename); this->writeMaterialData(instanceNodeData,geometryData,groupIndex,shapeNode.upcast<ModelNode>()); for (int j=0;j< meshData.positionIndices.Size();j+=3 ) { MeshBuilderVertex vertex01,vertex02,vertex03; vertex01.SetComponent(MeshBuilderVertex::CoordIndex,geometryData.mPositions[meshData.positionIndices[j]]); vertex02.SetComponent(MeshBuilderVertex::CoordIndex,geometryData.mPositions[meshData.positionIndices[j+1]]); vertex03.SetComponent(MeshBuilderVertex::CoordIndex,geometryData.mPositions[meshData.positionIndices[j+2]]); if( !meshData.normalIndices.IsEmpty()) { vertex01.SetComponent(MeshBuilderVertex::NormalIndex,geometryData.mNormals[meshData.normalIndices[j]]); vertex02.SetComponent(MeshBuilderVertex::NormalIndex,geometryData.mNormals[meshData.normalIndices[j+1]]); vertex03.SetComponent(MeshBuilderVertex::NormalIndex,geometryData.mNormals[meshData.normalIndices[j+2]]); } if( !meshData.mDiffMapUVs.IsEmpty()) { vertex01.SetComponent(MeshBuilderVertex::Uv0Index,meshData.mDiffMapUVs[meshData.mDiffMapIndices[j]]); vertex02.SetComponent(MeshBuilderVertex::Uv0Index,meshData.mDiffMapUVs[meshData.mDiffMapIndices[j+1]]); vertex03.SetComponent(MeshBuilderVertex::Uv0Index,meshData.mDiffMapUVs[meshData.mDiffMapIndices[j+2]]); } if( !geometryData.mJointIndices.IsEmpty()) { vertex01.SetComponent(MeshBuilderVertex::JIndicesIndex,geometryData.mJointIndices[meshData.positionIndices[j]]); vertex01.SetComponent(MeshBuilderVertex::WeightsIndex,geometryData.mWeights[meshData.positionIndices[j]]); vertex02.SetComponent(MeshBuilderVertex::JIndicesIndex,geometryData.mJointIndices[meshData.positionIndices[j+1]]); vertex02.SetComponent(MeshBuilderVertex::WeightsIndex,geometryData.mWeights[meshData.positionIndices[j+1]]); vertex03.SetComponent(MeshBuilderVertex::JIndicesIndex,geometryData.mJointIndices[meshData.positionIndices[j+2]]); vertex03.SetComponent(MeshBuilderVertex::WeightsIndex,geometryData.mWeights[meshData.positionIndices[j+2]]); } meshBuilder.AddVertex(vertex01); size_t indices01 = meshBuilder.GetNumVertices() -1; meshBuilder.AddVertex(vertex02); size_t indices02 = meshBuilder.GetNumVertices() -1; meshBuilder.AddVertex(vertex03); size_t indices03 = meshBuilder.GetNumVertices() -1; MeshBuilderTriangle triangle; triangle.SetGroupId(groupIndex); triangle.SetVertexIndices(indices01,indices02,indices03); meshBuilder.AddTriangle(triangle); }///end for transformNode->AddChild(shapeNode.upcast<ModelNode>()); }///end for /// 保存模型文件 if( !MeshBuilderSaver::SaveNvx2(meshFilename,meshBuilder,Platform::Win32) ) { n_error("Save [%s] Failed!\n",meshFilename); }///end if Math::bbox boundingbox = meshBuilder.ComputeBoundingBox(); transformNode->SetName(geometryData.mGeometryName); transformNode->SetBoundingBox(boundingbox); Util::Array<Ptr<ModelNode>> shapeNodes = transformNode->GetChildren(); for (int i=0;i<shapeNodes.Size();i++) { shapeNodes[i]->SetBoundingBox(boundingbox); }///end for /// 设置位置信息 //Math::vector outTranslate;Math::quaternion outRotate;Math::vector outScale; //Math::matrix44 matTemp = this->getGeometryMatrix(instanceNodeData.nodeUniqueId); //matTemp.decompose(outScale,outRotate,outTranslate); //transformNode->SetPosition(outTranslate); //transformNode->SetRotation(outRotate); //transformNode->SetScale(outScale); return transformNode; }