//---------------------------------------------------------------------------- void EffectModel::GenMesh () { StandardMesh stdMesh(GetVertexFormat(), false); TriMeshPtr mesh; if (MT_SPHERE == mModelType) { mesh = stdMesh.Sphere(mZSample, mRadiusSample, GetEmitSizeX()); } else if (MT_CYLINDEROPEN == mModelType) { mesh = stdMesh.Cylinder(mZSample, mRadiusSample, GetEmitSizeX(), GetEmitSizeZ(), true); } else if (MT_MODEL == mModelType) { if (!mModelFilename.empty()) mesh = DynamicCast<TriMesh>(PX2_RM.BlockLoadCopy(mModelFilename)); } if (mesh) { SetVertexBuffer(mesh->GetVertexBuffer()); SetIndexBuffer(mesh->GetIndexBuffer()); mInitUVs.clear(); VertexBufferAccessor vba(GetVertexFormat(), GetVertexBuffer()); for (int i=0; i<vba.GetNumVertices(); i++) { Float2 uv = vba.TCoord<Float2>(0, i); mInitUVs.push_back(uv); } } }
//---------------------------------------------------------------------------- bool ConvexHull3D::OnMouseClick (int button, int state, int x, int y, unsigned int modifiers) { WindowApplication3::OnMouseClick(button, state, x, y, modifiers); if (button == MOUSE_RIGHT_BUTTON) { // Convert to right-handed screen coordinates. y = GetHeight() - 1 - y; APoint origin; AVector direction; mRenderer->GetPickRay(x, y, origin, direction); mPicker.Execute(mTrnNode, origin, direction, 0.0f, Mathf::MAX_REAL); if (mPicker.Records.size() > 0) { const PickRecord& record = mPicker.GetClosestNonnegative(); TriMeshPtr mesh = StaticCast<TriMesh>(record.Intersected); float maxBary = record.Bary[0]; int index = 0; if (record.Bary[1] > maxBary) { maxBary = record.Bary[1]; index = 1; } if (record.Bary[2] > maxBary) { maxBary = record.Bary[2]; index = 2; } int* indices =(int*) mesh->GetIndexBuffer()->GetData(); sprintf(mFooter, "intr = %d, tri = %d, ver = %d", (int)mPicker.Records.size(), record.Triangle, indices[3*record.Triangle + index]); } } return true; }
//---------------------------------------------------------------------------- void ClodMeshes::CreateScene () { mScene = new0 Node(); mTrnNode = new0 Node(); mScene->AttachChild(mTrnNode); mWireState = new0 WireState(); mRenderer->SetOverrideWireState(mWireState); // Load the face model. #ifdef WM5_LITTLE_ENDIAN std::string path = Environment::GetPathR("FacePN.wmof"); #else std::string path = Environment::GetPathR("FacePN.be.wmof"); #endif InStream inStream; inStream.Load(path); TriMeshPtr mesh = StaticCast<TriMesh>(inStream.GetObjectAt(0)); VertexBufferAccessor vba0(mesh); // Remove the normals and add texture coordinates. VertexFormat* vformat = VertexFormat::Create(2, VertexFormat::AU_POSITION, VertexFormat::AT_FLOAT3, 0, VertexFormat::AU_TEXCOORD, VertexFormat::AT_FLOAT2, 0); int vstride = vformat->GetStride(); VertexBuffer* vbuffer = new0 VertexBuffer(vba0.GetNumVertices(), vstride); VertexBufferAccessor vba1(vformat, vbuffer); float xmin = Mathf::MAX_REAL, xmax = -Mathf::MAX_REAL; float ymin = Mathf::MAX_REAL, ymax = -Mathf::MAX_REAL; int i; for (i = 0; i < vba0.GetNumVertices(); ++i) { Float3 position = vba0.Position<Float3>(i); vba1.Position<Float3>(i) = position; float x = position[0]; float y = position[2]; vba1.TCoord<Float2>(0, i) = Float2(x, y); if (x < xmin) { xmin = x; } if (x > xmax) { xmax = x; } if (y < ymin) { ymin = y; } if (y > ymax) { ymax = y; } } float xmult = 1.0f/(xmax - xmin); float ymult = 1.0f/(ymax - ymin); for (i = 0; i < vba1.GetNumVertices(); ++i) { Float2 tcoord = vba1.TCoord<Float2>(0, i); vba1.TCoord<Float2>(0,i) = Float2( (tcoord[0] - xmin)*xmult, (tcoord[1] - ymin)*ymult); } mesh->SetVertexFormat(vformat); mesh->SetVertexBuffer(vbuffer); // Create a texture for the face. Use the generated texture coordinates. Texture2DEffect* effect = new0 Texture2DEffect(Shader::SF_LINEAR); path = Environment::GetPathR("Magician.wmtf"); Texture2D* texture = Texture2D::LoadWMTF(path); #ifdef USE_CLOD_MESH // Create the collapse records to be shared by two CLOD meshes. int numRecords = 0; CollapseRecord* records = 0; CreateClodMesh ccm(mesh, numRecords, records); CollapseRecordArray* recordArray = new0 CollapseRecordArray(numRecords, records); mClod[0] = new0 ClodMesh(mesh, recordArray); mClod[0]->LocalTransform = mesh->LocalTransform; mClod[0]->LocalTransform.SetTranslate(mesh->LocalTransform.GetTranslate() - 150.0f*AVector::UNIT_X); mClod[0]->SetEffectInstance(effect->CreateInstance(texture)); mTrnNode->AttachChild(mClod[0]); mClod[1] = new0 ClodMesh(mesh, recordArray); mClod[1]->LocalTransform = mesh->LocalTransform; mClod[1]->LocalTransform.SetTranslate(mesh->LocalTransform.GetTranslate() + 150.0f*AVector::UNIT_X - 100.0f*AVector::UNIT_Y); mClod[1]->SetEffectInstance(effect->CreateInstance(texture)); mTrnNode->AttachChild(mClod[1]); mActive = mClod[0]; #else IndexBuffer* ibuffer = mesh->GetIndexBuffer(); TriMesh* face = new0 TriMesh(vformat, vbuffer,ibuffer); face->LocalTransform = mesh->LocalTransform; face->LocalTransform.SetTranslate(mesh->LocalTransform.GetTranslate() - 150.0f*AVector::UNIT_X); face->SetEffectInstance(effect->CreateInstance(texture)); mTrnNode->AttachChild(face); face = new0 TriMesh(vformat, vbuffer, ibuffer); face->LocalTransform = mesh->LocalTransform; face->LocalTransform.SetTranslate(mesh->LocalTransform.GetTranslate() + 150.0f*AVector::UNIT_X); face->SetEffectInstance(effect->CreateInstance(texture)); mTrnNode->AttachChild(face); #endif }