//---------------------------------------------------------------------------- void FreeFormDeformation::UpdatePolysegments () { VertexBufferAccessor vba; Polysegment* segment; int i0, i1, i2, i = 0; for (i0 = 0; i0 < mQuantity; ++i0) { for (i1 = 0; i1 < mQuantity; ++i1) { for (i2 = 0; i2 < mQuantity-1; ++i2) { segment = StaticCast<Polysegment>( mPolysegmentRoot->GetChild(i)); vba.ApplyTo(segment); vba.Position<Vector3f>(0) = mVolume->GetControlPoint(i0, i1, i2); vba.Position<Vector3f>(1) = mVolume->GetControlPoint(i0, i1, i2+1); mRenderer->Update(segment->GetVertexBuffer()); ++i; } } for (i2 = 0; i2 < mQuantity; ++i2) { for (i1 = 0; i1 < mQuantity-1; ++i1) { segment = StaticCast<Polysegment>( mPolysegmentRoot->GetChild(i)); vba.ApplyTo(segment); vba.Position<Vector3f>(0) = mVolume->GetControlPoint(i0, i1, i2); vba.Position<Vector3f>(1) = mVolume->GetControlPoint(i0, i1+1, i2); mRenderer->Update(segment->GetVertexBuffer()); ++i; } } } for (i0 = 0; i0 < mQuantity-1; ++i0) { for (i1 = 0; i1 < mQuantity; ++i1) { for (i2 = 0; i2 < mQuantity; ++i2) { segment = StaticCast<Polysegment>( mPolysegmentRoot->GetChild(i)); vba.ApplyTo(segment); vba.Position<Vector3f>(0) = mVolume->GetControlPoint(i0, i1, i2); vba.Position<Vector3f>(1) = mVolume->GetControlPoint(i0+1, i1, i2); mRenderer->Update(segment->GetVertexBuffer()); ++i; } } } }
//---------------------------------------------------------------------------- Polysegment* BSplineFitContinuous::ReducedPolysegment (int numCtrlPoints, Vector3d* ctrlPoints, double fraction) { int numLSCtrlPoints; Vector3d* lsCtrlPoints; BSplineReduction3d(numCtrlPoints, ctrlPoints, mDegree, fraction, numLSCtrlPoints, lsCtrlPoints); BSplineCurve3d spline(numLSCtrlPoints, lsCtrlPoints, mDegree, false, true); delete1(lsCtrlPoints); VertexFormat* vformat = VertexFormat::Create(2, VertexFormat::AU_POSITION, VertexFormat::AT_FLOAT3, 0, VertexFormat::AU_COLOR, VertexFormat::AT_FLOAT3, 0); int vstride = vformat->GetStride(); VertexBuffer* vbuffer = new0 VertexBuffer(numCtrlPoints, vstride); VertexBufferAccessor vba(vformat, vbuffer); Float3 blue(0.0f, 0.0f, 1.0f); for (int i = 0; i < numCtrlPoints; ++i) { double t = i/(double)numCtrlPoints; Vector3d pos = spline.GetPosition(t); vba.Position<Float3>(i) = Float3((float)pos[0], (float)pos[1], (float)pos[2]); vba.Color<Float3>(0, i) = blue; } Polysegment* segment = new0 Polysegment(vformat, vbuffer, true); segment->SetEffectInstance(VertexColor3Effect::CreateUniqueInstance()); return segment; }
//---------------------------------------------------------------------------- Polysegment *GeoObjFactory::CreateCameraCtrl() { VertexFormat *vf = PX2_GR.GetVertexFormat(GraphicsRoot::VFT_PC); VertexBufferPtr vb = new0 VertexBuffer(24, vf->GetStride()); Polysegment *sg = new0 Polysegment(vf, vb, false); sg->SetNumSegments(12); sg->UpdateModelSpace(Renderable::GU_MODEL_BOUND_ONLY); sg->SetMaterialInstance(VertexColor4Material::CreateUniqueInstance()); return sg; }
//---------------------------------------------------------------------------- Polysegment* PolyhedronDistance::CreateSegment () { VertexFormat* vformat = VertexFormat::Create(2, VertexFormat::AU_POSITION, VertexFormat::AT_FLOAT3, 0, VertexFormat::AU_COLOR, VertexFormat::AT_FLOAT3, 0); int vstride = vformat->GetStride(); VertexBuffer* vbuffer = new0 VertexBuffer(2, vstride); VertexBufferAccessor vba(vformat, vbuffer); vba.Position<Vector3f>(0) = Vector3f::ZERO; vba.Position<Vector3f>(1) = Vector3f::UNIT_X; vba.Color<Float3>(0, 0) = Float3(1.0f, 1.0f, 1.0f); vba.Color<Float3>(0, 1) = Float3(1.0f, 1.0f, 1.0f); Polysegment* segment = new0 Polysegment(vformat, vbuffer, true); segment->SetEffectInstance(VertexColor3Effect::CreateUniqueInstance()); return segment; }
//---------------------------------------------------------------------------- PX2::Node *GeoObjFactory::CreateScaleCtrl_O() { // node PX2::Node *node = new0 Node; node->LocalTransform.SetUniformScale(2.0f); node->SetName("Scale"); VertexFormat *vf = PX2_GR.GetVertexFormat(GraphicsRoot::VFT_PC); StandardMesh stdMesh(vf); VertexBuffer *vBufferTemp = 0; VertexBufferAccessor vbaTemp; // x PX2::Node *nodeX = new0 Node; nodeX->SetName("Scale_X"); VertexBuffer *vBufferX = new0 VertexBuffer(6, vf->GetStride()); VertexBufferAccessor vbaX(vf, vBufferX); vbaX.Position<Float3>(0) = Float3(0.25f, 0.0f, 0.0f); vbaX.Position<Float3>(1) = Float3(1.125f, 0.0f, 0.0f); vbaX.Color<Float4>(0, 0) = Float4(1.0f, 0.0f, 0.0f, 1.0f); vbaX.Color<Float4>(0, 1) = Float4(1.0f, 0.0f, 0.0f, 1.0f); vbaX.Position<Float3>(2) = Float3(0.5f, 0.0f, 0.0f); vbaX.Position<Float3>(3) = Float3(0.5f, 0.5f, 0.0f); vbaX.Color<Float4>(0, 2) = Float4(0.0f, 1.0f, 0.0f, 1.0f); vbaX.Color<Float4>(0, 3) = Float4(0.0f, 1.0f, 0.0f, 1.0f); vbaX.Position<Float3>(4) = Float3(0.5f, 0.0f, 0.0f); vbaX.Position<Float3>(5) = Float3(0.5f, 0.0f, 0.5f); vbaX.Color<Float4>(0, 4) = Float4(0.0f, 0.0f, 1.0f, 1.0f); vbaX.Color<Float4>(0, 5) = Float4(0.0f, 0.0f, 1.0f, 1.0f); Polysegment *polysegmentX = new0 PX2::Polysegment(vf, vBufferX, false); polysegmentX->SetMaterialInstance( VertexColor4Material::CreateUniqueInstance()); nodeX->AttachChild(polysegmentX); TriMesh *meshX = stdMesh.Box(0.06f, 0.06f, 0.06f); meshX->SetMaterialInstance(VertexColor4Material::CreateUniqueInstance()); //meshX->GetMaterialInstance()->GetPass(0)->GetWireProperty()->Enabled = true; meshX->LocalTransform.SetTranslate(APoint(1.125f, 0.0f, 0.0f)); vBufferTemp = meshX->GetVertexBuffer(); vbaTemp.ApplyTo(vf, vBufferTemp); for (int i = 0; i < vBufferTemp->GetNumElements(); i++) { vbaTemp.Color<Float4>(0, i) = Float4(1.0f, 0.0f, 0.0f, 1.0f); } nodeX->AttachChild(meshX); // y PX2::Node *nodeY = new0 PX2::Node; nodeX->SetName("Scale_Y"); VertexBuffer *vBufferY = new0 VertexBuffer(6, vf->GetStride()); VertexBufferAccessor vbaY(vf, vBufferY); vbaY.Position<Float3>(0) = Float3(0.0f, 0.25f, 0.0f); vbaY.Position<Float3>(1) = Float3(0.0f, 1.125f, 0.0f); vbaY.Color<Float4>(0, 0) = Float4(0.0f, 1.0f, 0.0f, 1.0f); vbaY.Color<Float4>(0, 1) = Float4(0.0f, 1.0f, 0.0f, 1.0f); vbaY.Position<Float3>(2) = Float3(0.0f, 0.5f, 0.0f); vbaY.Position<Float3>(3) = Float3(0.5f, 0.5f, 0.0f); vbaY.Color<Float4>(0, 2) = Float4(1.0f, 0.0f, 0.0f, 1.0f); vbaY.Color<Float4>(0, 3) = Float4(1.0f, 0.0f, 0.0f, 1.0f); vbaY.Position<Float3>(4) = Float3(0.0f, 0.5f, 0.0f); vbaY.Position<Float3>(5) = Float3(0.0f, 0.5f, 0.5f); vbaY.Color<Float4>(0, 4) = Float4(0.0f, 0.0f, 1.0f, 1.0f); vbaY.Color<Float4>(0, 5) = Float4(0.0f, 0.0f, 1.0f, 1.0f); Polysegment *polysegmentY = new0 PX2::Polysegment(vf, vBufferY, false); polysegmentY->SetMaterialInstance( VertexColor4Material::CreateUniqueInstance()); nodeY->AttachChild(polysegmentY); TriMesh *meshY = stdMesh.Box(0.06f, 0.06f, 0.06f); meshY->SetMaterialInstance(VertexColor4Material::CreateUniqueInstance()); //meshY->GetMaterialInstance()->GetPass(0)->GetWireProperty()->Enabled = true; meshY->LocalTransform.SetTranslate(APoint(0.0f, 1.125f, 0.0f)); vBufferTemp = meshY->GetVertexBuffer(); vbaTemp.ApplyTo(vf, vBufferTemp); for (int i = 0; i < vBufferTemp->GetNumElements(); i++) { vbaTemp.Color<Float4>(0, i) = Float4(0.0f, 1.0f, 0.0f, 1.0f); } nodeY->AttachChild(meshY); // z PX2::Node *nodeZ = new0 PX2::Node(); nodeX->SetName("Scale_Z"); VertexBuffer *vBufferZ = new0 VertexBuffer(6, vf->GetStride()); VertexBufferAccessor vbaZ(vf, vBufferZ); vbaZ.Position<Float3>(0) = Float3(0.0f, 0.0f, 0.25f); vbaZ.Position<Float3>(1) = Float3(0.0f, 0.0f, 1.125f); vbaZ.Color<Float4>(0, 0) = Float4(0.0f, 0.0f, 1.0f, 1.0f); vbaZ.Color<Float4>(0, 1) = Float4(0.0f, 0.0f, 1.0f, 1.0f); vbaZ.Position<Float3>(2) = Float3(0.0f, 0.0f, 0.5f); vbaZ.Position<Float3>(3) = Float3(0.5f, 0.0f, 0.5f); vbaZ.Color<Float4>(0, 2) = Float4(1.0f, 0.0f, 0.0f, 1.0f); vbaZ.Color<Float4>(0, 3) = Float4(1.0f, 0.0f, 0.0f, 1.0f); vbaZ.Position<Float3>(4) = Float3(0.0f, 0.0f, 0.5f); vbaZ.Position<Float3>(5) = Float3(0.0f, 0.5f, 0.5f); vbaZ.Color<Float4>(0, 4) = Float4(0.0f, 1.0f, 0.0f, 1.0f); vbaZ.Color<Float4>(0, 5) = Float4(0.0f, 1.0f, 0.0f, 1.0f); Polysegment *polysegmentZ = new0 PX2::Polysegment(vf, vBufferZ, false); polysegmentZ->SetMaterialInstance( VertexColor4Material::CreateUniqueInstance()); nodeZ->AttachChild(polysegmentZ); TriMesh *meshZ = stdMesh.Box(0.06f, 0.06f, 0.06f); meshZ->SetMaterialInstance(VertexColor4Material::CreateUniqueInstance()); //meshZ->GetMaterialInstance()->GetPass(0)->GetWireProperty()->Enabled = true; meshZ->LocalTransform.SetTranslate(APoint(.0f, 0.0f, 1.125f)); vBufferTemp = meshZ->GetVertexBuffer(); vbaTemp.ApplyTo(vf, vBufferTemp); for (int i = 0; i < vBufferTemp->GetNumElements(); i++) { vbaTemp.Color<Float4>(0, i) = Float4(0.0f, 0.0f, 1.0f, 1.0f); } nodeZ->AttachChild(meshZ); // XYZ node->AttachChild(nodeX); node->AttachChild(nodeY); node->AttachChild(nodeZ); return node; }
//---------------------------------------------------------------------------- PX2::Node *GeoObjFactory::CreateTranslateCtrl_O() { // node PX2::Node *node = new0 Node; node->LocalTransform.SetUniformScale(2.0f); node->SetName("Translate"); VertexFormat *vf = PX2_GR.GetVertexFormat(GraphicsRoot::VFT_PC); StandardMesh stdMesh(vf); VertexBuffer *vBufferTemp = 0; VertexBufferAccessor vbaTemp; // x PX2::Node *nodeX = new0 Node; nodeX->SetName("Translate_X"); VertexBuffer *vBufferX = new0 VertexBuffer(6, vf->GetStride()); VertexBufferAccessor vbaX(vf, vBufferX); vbaX.Position<Float3>(0) = Float3(0.25f, 0.0f, 0.0f); vbaX.Position<Float3>(1) = Float3(1.125f, 0.0f, 0.0f); vbaX.Color<Float4>(0, 0) = Float4(1.0f, 0.0f, 0.0f, 1.0f); vbaX.Color<Float4>(0, 1) = Float4(1.0f, 0.0f, 0.0f, 1.0f); vbaX.Position<Float3>(2) = Float3(0.5f, 0.0f, 0.0f); vbaX.Position<Float3>(3) = Float3(0.5f, 0.5f, 0.0f); vbaX.Color<Float4>(0, 2) = Float4(0.0f, 1.0f, 0.0f, 1.0f); vbaX.Color<Float4>(0, 3) = Float4(0.0f, 1.0f, 0.0f, 1.0f); vbaX.Position<Float3>(4) = Float3(0.5f, 0.0f, 0.0f); vbaX.Position<Float3>(5) = Float3(0.5f, 0.0f, 0.5f); vbaX.Color<Float4>(0, 4) = Float4(0.0f, 0.0f, 1.0f, 1.0f); vbaX.Color<Float4>(0, 5) = Float4(0.0f, 0.0f, 1.0f, 1.0f); Polysegment *polysegmentX = new0 PX2::Polysegment(vf, vBufferX, false); polysegmentX->SetMaterialInstance( VertexColor4Material::CreateUniqueInstance()); nodeX->AttachChild(polysegmentX); TriMesh *meshX = stdMesh.Disk(3, 20, 0.1f); meshX->SetMaterialInstance(VertexColor4Material::CreateUniqueInstance()); //meshX->GetMaterialInstance()->GetPass(0)->GetWireProperty()->Enabled = true; meshX->LocalTransform.SetRotate(HMatrix().MakeRotation(AVector::UNIT_Y, -Mathf::HALF_PI)); meshX->LocalTransform.SetTranslate(APoint(1.125f, 0.0f, 0.0f)); vBufferTemp = meshX->GetVertexBuffer(); vbaTemp.ApplyTo(vf, vBufferTemp); for (int i = 0; i < vBufferTemp->GetNumElements(); i++) { vbaTemp.Color<Float4>(0, i) = Float4(1.0f, 0.0f, 0.0f, 1.0f); } nodeX->AttachChild(meshX); TriFan *fanX = stdMesh.Cone(20, 0.1f, 0.45f); fanX->SetMaterialInstance(VertexColor4Material::CreateUniqueInstance()); //fanX->GetMaterialInstance()->GetPass(0)->GetWireProperty()->Enabled = true; fanX->LocalTransform.SetRotate(HMatrix().MakeRotation(AVector::UNIT_Y, Mathf::HALF_PI)); fanX->LocalTransform.SetTranslate(APoint(1.125f, 0.0f, 0.0f)); vBufferTemp = fanX->GetVertexBuffer(); vbaTemp.ApplyTo(vf, vBufferTemp); for (int i = 0; i < vBufferTemp->GetNumElements(); i++) { vbaTemp.Color<Float4>(0, i) = Float4(1.0f, 0.0f, 0.0f, 1.0f); } nodeX->AttachChild(fanX); // y PX2::Node *nodeY = new0 PX2::Node; nodeX->SetName("Translate_Y"); VertexBuffer *vBufferY = new0 VertexBuffer(6, vf->GetStride()); VertexBufferAccessor vbaY(vf, vBufferY); vbaY.Position<Float3>(0) = Float3(0.0f, 0.25f, 0.0f); vbaY.Position<Float3>(1) = Float3(0.0f, 1.125f, 0.0f); vbaY.Color<Float4>(0, 0) = Float4(0.0f, 1.0f, 0.0f, 1.0f); vbaY.Color<Float4>(0, 1) = Float4(0.0f, 1.0f, 0.0f, 1.0f); vbaY.Position<Float3>(2) = Float3(0.0f, 0.5f, 0.0f); vbaY.Position<Float3>(3) = Float3(0.5f, 0.5f, 0.0f); vbaY.Color<Float4>(0, 2) = Float4(1.0f, 0.0f, 0.0f, 1.0f); vbaY.Color<Float4>(0, 3) = Float4(1.0f, 0.0f, 0.0f, 1.0f); vbaY.Position<Float3>(4) = Float3(0.0f, 0.5f, 0.0f); vbaY.Position<Float3>(5) = Float3(0.0f, 0.5f, 0.5f); vbaY.Color<Float4>(0, 4) = Float4(0.0f, 0.0f, 1.0f, 1.0f); vbaY.Color<Float4>(0, 5) = Float4(0.0f, 0.0f, 1.0f, 1.0f); Polysegment *polysegmentY = new0 PX2::Polysegment(vf, vBufferY, false); polysegmentY->SetMaterialInstance( VertexColor4Material::CreateUniqueInstance()); nodeY->AttachChild(polysegmentY); TriMesh *meshY = stdMesh.Disk(3, 20, 0.1f); meshY->SetMaterialInstance(VertexColor4Material::CreateUniqueInstance()); //meshY->GetMaterialInstance()->GetPass(0)->GetWireProperty()->Enabled = true; meshY->LocalTransform.SetRotate(HMatrix().MakeRotation(AVector::UNIT_X, Mathf::HALF_PI)); meshY->LocalTransform.SetTranslate(APoint(0.0f, 1.125f, 0.0f)); vBufferTemp = meshY->GetVertexBuffer(); vbaTemp.ApplyTo(vf, vBufferTemp); for (int i = 0; i < vBufferTemp->GetNumElements(); i++) { vbaTemp.Color<Float4>(0, i) = Float4(0.0f, 1.0f, 0.0f, 1.0f); } nodeY->AttachChild(meshY); TriFan *fanY = stdMesh.Cone(20, 0.1f, 0.45f); fanY->SetMaterialInstance(VertexColor4Material::CreateUniqueInstance()); //fanY->GetMaterialInstance()->GetPass(0)->GetWireProperty()->Enabled = true; fanY->LocalTransform.SetRotate(HMatrix().MakeRotation(AVector::UNIT_X, -Mathf::HALF_PI)); fanY->LocalTransform.SetTranslate(APoint(0.0f, 1.125f, 0.0f)); vBufferTemp = fanY->GetVertexBuffer(); vbaTemp.ApplyTo(vf, vBufferTemp); for (int i = 0; i < vBufferTemp->GetNumElements(); i++) { vbaTemp.Color<Float4>(0, i) = Float4(0.0f, 1.0f, 0.0f, 1.0f); } nodeY->AttachChild(fanY); // z PX2::Node *nodeZ = new0 PX2::Node(); nodeX->SetName("Translate_Z"); VertexBuffer *vBufferZ = new0 VertexBuffer(6, vf->GetStride()); VertexBufferAccessor vbaZ(vf, vBufferZ); vbaZ.Position<Float3>(0) = Float3(0.0f, 0.0f, 0.25f); vbaZ.Position<Float3>(1) = Float3(0.0f, 0.0f, 1.125f); vbaZ.Color<Float4>(0, 0) = Float4(0.0f, 0.0f, 1.0f, 1.0f); vbaZ.Color<Float4>(0, 1) = Float4(0.0f, 0.0f, 1.0f, 1.0f); vbaZ.Position<Float3>(2) = Float3(0.0f, 0.0f, 0.5f); vbaZ.Position<Float3>(3) = Float3(0.5f, 0.0f, 0.5f); vbaZ.Color<Float4>(0, 2) = Float4(1.0f, 0.0f, 0.0f, 1.0f); vbaZ.Color<Float4>(0, 3) = Float4(1.0f, 0.0f, 0.0f, 1.0f); vbaZ.Position<Float3>(4) = Float3(0.0f, 0.0f, 0.5f); vbaZ.Position<Float3>(5) = Float3(0.0f, 0.5f, 0.5f); vbaZ.Color<Float4>(0, 4) = Float4(0.0f, 1.0f, 0.0f, 1.0f); vbaZ.Color<Float4>(0, 5) = Float4(0.0f, 1.0f, 0.0f, 1.0f); Polysegment *polysegmentZ = new0 PX2::Polysegment(vf, vBufferZ, false); polysegmentZ->SetMaterialInstance( VertexColor4Material::CreateUniqueInstance()); nodeZ->AttachChild(polysegmentZ); TriMesh *meshZ = stdMesh.Disk(3, 20, 0.1f); meshZ->SetMaterialInstance(VertexColor4Material::CreateUniqueInstance()); //meshZ->GetMaterialInstance()->GetPass(0)->GetWireProperty()->Enabled = true; meshZ->LocalTransform.SetTranslate(APoint(.0f, 0.0f, 1.125f)); meshZ->LocalTransform.SetRotate(HMatrix().MakeRotation(AVector::UNIT_X, Mathf::PI)); vBufferTemp = meshZ->GetVertexBuffer(); vbaTemp.ApplyTo(vf, vBufferTemp); for (int i = 0; i < vBufferTemp->GetNumElements(); i++) { vbaTemp.Color<Float4>(0, i) = Float4(0.0f, 0.0f, 1.0f, 1.0f); } nodeZ->AttachChild(meshZ); TriFan *fanZ = stdMesh.Cone(20, 0.1f, 0.45f); fanZ->SetMaterialInstance(VertexColor4Material::CreateUniqueInstance()); //fanZ->GetMaterialInstance()->GetPass(0)->GetWireProperty()->Enabled = true; fanZ->LocalTransform.SetTranslate(APoint(0.0f, 0.0f, 1.125f)); vBufferTemp = fanZ->GetVertexBuffer(); vbaTemp.ApplyTo(vf, vBufferTemp); for (int i = 0; i < vBufferTemp->GetNumElements(); i++) { vbaTemp.Color<Float4>(0, i) = Float4(0.0f, 0.0f, 1.0f, 1.0f); } nodeZ->AttachChild(fanZ); // xy PX2::Node *nodeXY = new0 Node; nodeXY->SetName("Translate_XY"); TriMesh *meshXY = stdMesh.Rectangle(2, 2, 0.25f, 0.25f); meshXY->LocalTransform.SetTranslate(APoint(0.25f, 0.25f, 0.0f)); VertexColor4Material *matXY = new0 VertexColor4Material(); matXY->GetAlphaProperty(0, 0)->BlendEnabled = true; matXY->GetCullProperty(0, 0)->Enabled = false; meshXY->SetMaterialInstance(matXY->CreateInstance()); vBufferTemp = meshXY->GetVertexBuffer(); vbaTemp.ApplyTo(vf, vBufferTemp); for (int i = 0; i < vBufferTemp->GetNumElements(); i++) { vbaTemp.Color<Float4>(0, i) = Float4(1.0f, 1.0f, 0.0f, 0.0f); } nodeXY->AttachChild(meshXY); // yz PX2::Node *nodeYZ = new0 Node; nodeYZ->SetName("Translate_YZ"); TriMesh *meshYZ = stdMesh.Rectangle(2, 2, 0.25f, 0.25f); meshYZ->LocalTransform.SetTranslate(APoint(0.25f, 0.25f, 0.0f)); meshYZ->LocalTransform.SetRotate(Matrix3f().MakeEulerXYZ(0.0f, -Mathf::HALF_PI, 0.0f)); VertexColor4Material *matYZ = new0 VertexColor4Material(); matYZ->GetAlphaProperty(0, 0)->BlendEnabled = true; matYZ->GetCullProperty(0, 0)->Enabled = false; meshYZ->SetMaterialInstance(matYZ->CreateInstance()); vBufferTemp = meshYZ->GetVertexBuffer(); vbaTemp.ApplyTo(vf, vBufferTemp); for (int i = 0; i < vBufferTemp->GetNumElements(); i++) { vbaTemp.Color<Float4>(0, i) = Float4(1.0f, 1.0f, 0.0f, 0.0f); } nodeYZ->AttachChild(meshYZ); // xz PX2::Node *nodeXZ = new0 Node; nodeXZ->SetName("Translate_XZ"); TriMesh *meshXZ = stdMesh.Rectangle(2, 2, 0.25f, 0.25f); meshXZ->LocalTransform.SetRotate(Matrix3f().MakeEulerXYZ(Mathf::HALF_PI, 0.0f, 0.0f)); meshXZ->LocalTransform.SetTranslate(APoint(0.25f, 0.0f, 0.25f)); VertexColor4Material *matXZ = new0 VertexColor4Material(); matXZ->GetAlphaProperty(0, 0)->BlendEnabled = true; matXZ->GetCullProperty(0, 0)->Enabled = false; meshXZ->SetMaterialInstance(matXZ->CreateInstance()); vBufferTemp = meshXZ->GetVertexBuffer(); vbaTemp.ApplyTo(vf, vBufferTemp); for (int i = 0; i < vBufferTemp->GetNumElements(); i++) { vbaTemp.Color<Float4>(0, i) = Float4(1.0f, 1.0f, 0.0f, 0.0f); } nodeXZ->AttachChild(meshXZ); // XYZ node->AttachChild(nodeX); node->AttachChild(nodeY); node->AttachChild(nodeZ); node->AttachChild(nodeXY); node->AttachChild(nodeYZ); node->AttachChild(nodeXZ); return node; }
//---------------------------------------------------------------------------- PX2::Node *GeoObjFactory::CreateRolateCtrl_P() { int axisSamples = 4; int radialSamples = 12; float radial = 0.05f; float height = radial*4.0f; // node PX2::Node *node = new0 Node; node->LocalTransform.SetUniformScale(2.0f); node->SetName("Rolate"); VertexFormat *vf = PX2_GR.GetVertexFormat(GraphicsRoot::VFT_PC); StandardMesh stdMesh(vf); VertexBuffer *vBufferTemp = 0; VertexBufferAccessor vbaTemp; // x PX2::Node *nodeX = new0 Node; nodeX->SetName("Rolate_X"); VertexBuffer *vBufferX = new0 VertexBuffer(6, vf->GetStride()); VertexBufferAccessor vbaX(vf, vBufferX); vbaX.Position<Float3>(0) = Float3(0.25f, 0.0f, 0.0f); vbaX.Position<Float3>(1) = Float3(1.125f, 0.0f, 0.0f); vbaX.Color<Float4>(0, 0) = Float4::RED; vbaX.Color<Float4>(0, 1) = Float4::RED; vbaX.Position<Float3>(2) = Float3(0.5f, 0.0f, 0.0f); vbaX.Position<Float3>(3) = Float3(0.5f, 0.5f, 0.0f); vbaX.Color<Float4>(0, 2) = Float4::GREEN; vbaX.Color<Float4>(0, 3) = Float4::GREEN; vbaX.Position<Float3>(4) = Float3(0.5f, 0.0f, 0.0f); vbaX.Position<Float3>(5) = Float3(0.5f, 0.0f, 0.5f); vbaX.Color<Float4>(0, 4) = Float4::RED; vbaX.Color<Float4>(0, 5) = Float4::RED; Polysegment *polysegmentX = new0 PX2::Polysegment(vf, vBufferX, false); polysegmentX->SetMaterialInstance( VertexColor4Material::CreateUniqueInstance()); nodeX->AttachChild(polysegmentX); TriMesh *meshX = stdMesh.Cylinder(axisSamples, radialSamples, radial, height, false); meshX->SetMaterialInstance(VertexColor4Material::CreateUniqueInstance()); meshX->LocalTransform.SetRotate(HMatrix().MakeRotation(AVector::UNIT_Y, Mathf::HALF_PI)); meshX->LocalTransform.SetTranslate(APoint(1.125f, 0.0f, 0.0f)); vBufferTemp = meshX->GetVertexBuffer(); vbaTemp.ApplyTo(vf, vBufferTemp); for (int i = 0; i < vBufferTemp->GetNumElements(); i++) { vbaTemp.Color<Float4>(0, i) = Float4::RED; } nodeX->AttachChild(meshX); // y PX2::Node *nodeY = new0 PX2::Node; nodeX->SetName("Rolate_Y"); VertexBuffer *vBufferY = new0 VertexBuffer(6, vf->GetStride()); VertexBufferAccessor vbaY(vf, vBufferY); vbaY.Position<Float3>(0) = Float3(0.0f, 0.25f, 0.0f); vbaY.Position<Float3>(1) = Float3(0.0f, 1.125f, 0.0f); vbaY.Color<Float4>(0, 0) = Float4::GREEN; vbaY.Color<Float4>(0, 1) = Float4::GREEN; vbaY.Position<Float3>(2) = Float3(0.0f, 0.5f, 0.0f); vbaY.Position<Float3>(3) = Float3(0.5f, 0.5f, 0.0f); vbaY.Color<Float4>(0, 2) = Float4::GREEN; vbaY.Color<Float4>(0, 3) = Float4::GREEN; vbaY.Position<Float3>(4) = Float3(0.0f, 0.5f, 0.0f); vbaY.Position<Float3>(5) = Float3(0.0f, 0.5f, 0.5f); vbaY.Color<Float4>(0, 4) = Float4::GREEN; vbaY.Color<Float4>(0, 5) = Float4::GREEN; Polysegment *polysegmentY = new0 PX2::Polysegment(vf, vBufferY, false); polysegmentY->SetMaterialInstance( VertexColor4Material::CreateUniqueInstance()); nodeY->AttachChild(polysegmentY); TriMesh *meshY = stdMesh.Cylinder(axisSamples, radialSamples, radial, height, false); meshY->SetMaterialInstance(VertexColor4Material::CreateUniqueInstance()); meshY->LocalTransform.SetRotate(HMatrix().MakeRotation(AVector::UNIT_X, Mathf::HALF_PI)); meshY->LocalTransform.SetTranslate(APoint(0.0f, 1.125f, 0.0f)); vBufferTemp = meshY->GetVertexBuffer(); vbaTemp.ApplyTo(vf, vBufferTemp); for (int i = 0; i < vBufferTemp->GetNumElements(); i++) { vbaTemp.Color<Float4>(0, i) = Float4(0.0f, 1.0f, 0.0f, 1.0f); } nodeY->AttachChild(meshY); // z PX2::Node *nodeZ = new0 PX2::Node(); nodeX->SetName("Rolate_Z"); VertexBuffer *vBufferZ = new0 VertexBuffer(6, vf->GetStride()); VertexBufferAccessor vbaZ(vf, vBufferZ); vbaZ.Position<Float3>(0) = Float3(0.0f, 0.0f, 0.25f); vbaZ.Position<Float3>(1) = Float3(0.0f, 0.0f, 1.125f); vbaZ.Color<Float4>(0, 0) = Float4::BLUE; vbaZ.Color<Float4>(0, 1) = Float4::BLUE; vbaZ.Position<Float3>(2) = Float3(0.0f, 0.0f, 0.5f); vbaZ.Position<Float3>(3) = Float3(0.5f, 0.0f, 0.5f); vbaZ.Color<Float4>(0, 2) = Float4::BLUE; vbaZ.Color<Float4>(0, 3) = Float4::BLUE; vbaZ.Position<Float3>(4) = Float3(0.0f, 0.0f, 0.5f); vbaZ.Position<Float3>(5) = Float3(0.0f, 0.5f, 0.5f); vbaZ.Color<Float4>(0, 4) = Float4::BLUE; vbaZ.Color<Float4>(0, 5) = Float4::BLUE; Polysegment *polysegmentZ = new0 PX2::Polysegment(vf, vBufferZ, false); polysegmentZ->SetMaterialInstance( VertexColor4Material::CreateUniqueInstance()); nodeZ->AttachChild(polysegmentZ); TriMesh *meshZ = stdMesh.Cylinder(axisSamples, radialSamples, radial, height, false); meshZ->SetMaterialInstance(VertexColor4Material::CreateUniqueInstance()); meshZ->LocalTransform.SetTranslate(APoint(.0f, 0.0f, 1.125f)); vBufferTemp = meshZ->GetVertexBuffer(); vbaTemp.ApplyTo(vf, vBufferTemp); for (int i = 0; i < vBufferTemp->GetNumElements(); i++) { vbaTemp.Color<Float4>(0, i) = Float4::BLUE; } nodeZ->AttachChild(meshZ); // XYZ node->AttachChild(nodeX); node->AttachChild(nodeY); node->AttachChild(nodeZ); return node; }
//---------------------------------------------------------------------------- void EditRenderView_TimeLine::_RefreshGrid(bool doScale) { Polysegment *gird = PX2_EDIT.GetTimeLineEdit()->GetGridPoly(); PX2_UNUSED(doScale); int width = (int)mSize.Width; int height = (int)mSize.Height; if (width <= 0 && height <= 0) return; Camera *camera = mUIViewGrid->GetCamera(); APoint pos = camera->GetPosition(); float dMin = 0.0f; float dMax = 0.0f; float uMin = 0.0f; float uMax = 0.0f; float rMin = 0.0f; float rMax = 0.0f; camera->GetFrustum(dMin, dMax, uMin, uMax, rMin, rMax); if (0.0f == rMax || 0.0f == uMax || 0.0f == dMax) return; float inLength = rMax - rMin; float outLength = uMax - uMin; inLength = Mathf::FAbs(inLength); outLength = Mathf::FAbs(outLength); mPixelOverCamIn = width / inLength; mPixelOverCamOut = height / outLength; int minPixelsPerInGrid = 35; int minPixelsPerOutGrid = 25; float minGridSpacing = 0.001f; int gridNum = 0; float inGridSpacing = minGridSpacing; while (inGridSpacing*mPixelOverCamIn < minPixelsPerInGrid) { inGridSpacing = minGridSpacing * _GetGridSpacing(gridNum); gridNum++; } mUPerGrid = inGridSpacing; gridNum = 0; float outGridSpacing = minGridSpacing; while (outGridSpacing*mPixelOverCamOut < minPixelsPerOutGrid) { outGridSpacing = minGridSpacing * _GetGridSpacing(gridNum); gridNum++; } mVPerGrid = outGridSpacing; mXStart = pos.X() + rMin; mXEnd = pos.X() + rMax; mZStart = pos.Z() + uMin; mZEnd = pos.Z() + uMax; Float3 gray(0.62f, 0.62f, 0.62f); int segNum = 0; mFontStrs.clear(); int iTemp = 4; int zTemp = 4; VertexBufferAccessor vba(gird); float zPosTemp = 0.0f; while (zPosTemp < mZEnd) { zPosTemp += mVPerGrid; vba.Position<Float3>(2 * segNum) = Float3(mXStart, 1.0f, zPosTemp); vba.Color<Float3>(0, 2 * segNum) = gray; vba.Position<Float3>(2 * segNum + 1) = Float3(mXEnd, 1.0f, zPosTemp); vba.Color<Float3>(0, 2 * segNum + 1) = gray; mRenderer->SetCamera(mUIViewGrid->GetCamera()); Vector2f scrv = mUIViewGrid->PointWorldToViewPort(APoint(0.0f, 0.0f, zPosTemp)); FontStr fs; fs.x = iTemp + (int)mLeftWidth; fs.y = height - (int)scrv.Y(); fs.str = StringHelp::FloatToString(zPosTemp); mFontStrs.push_back(fs); segNum++; } zPosTemp = 0.0f; while (zPosTemp > mZStart) { zPosTemp -= mVPerGrid; vba.Position<Float3>(2 * segNum) = Float3(mXStart, 1.0f, zPosTemp); vba.Color<Float3>(0, 2 * segNum) = gray; vba.Position<Float3>(2 * segNum + 1) = Float3(mXEnd, 1.0f, zPosTemp); vba.Color<Float3>(0, 2 * segNum + 1) = gray; Vector2f scrv = mUIViewGrid->PointWorldToViewPort(APoint(0.0f, 0.0f, zPosTemp)); FontStr fs; fs.x = iTemp + (int)mLeftWidth; fs.y = height - (int)scrv.Y(); fs.str = StringHelp::FloatToString(zPosTemp); mFontStrs.push_back(fs); segNum++; } float xPosTemp = 0.0f; while (xPosTemp < mXEnd) { xPosTemp += mUPerGrid; vba.Position<Float3>(2 * segNum) = Float3(xPosTemp, 1.0f, mZStart); vba.Color<Float3>(0, 2 * segNum) = gray; vba.Position<Float3>(2 * segNum + 1) = Float3(xPosTemp, 1.0f, mZEnd); vba.Color<Float3>(0, 2 * segNum + 1) = gray; Vector2f scrv = mUIViewGrid->PointWorldToViewPort(APoint(xPosTemp, 0.0f, 0.0f)); FontStr fs; fs.x = (int)scrv.X() + iTemp; fs.y = height - zTemp; fs.str = StringHelp::FloatToString(xPosTemp); mFontStrs.push_back(fs); segNum++; } xPosTemp = 0.0f; while (xPosTemp > mXStart) { xPosTemp -= mUPerGrid; vba.Position<Float3>(2 * segNum) = Float3(xPosTemp, 1.0f, mZStart); vba.Color<Float3>(0, 2 * segNum) = gray; vba.Position<Float3>(2 * segNum + 1) = Float3(xPosTemp, 1.0f, mZEnd); vba.Color<Float3>(0, 2 * segNum + 1) = gray; Vector2f scrv = mUIViewGrid->PointWorldToViewPort(APoint(xPosTemp, 0.0f, 0.0f)); FontStr fs; fs.x = (int)scrv.X() + iTemp; fs.y = height - zTemp; fs.str = StringHelp::FloatToString(xPosTemp); mFontStrs.push_back(fs); segNum++; } Float3 zeroLineColorRed = Float3::MakeColor(150, 28, 36); Float3 zeroLineColorBlue = Float3::MakeColor(63, 72, 175); vba.Position<Float3>(2 * segNum) = Float3(mXStart, 1.0f, 0.0f); vba.Color<Float3>(0, 2 * segNum) = zeroLineColorRed; vba.Position<Float3>(2 * segNum + 1) = Float3(mXEnd, 1.0f, 0.0f); vba.Color<Float3>(0, 2 * segNum + 1) = zeroLineColorRed; segNum++; vba.Position<Float3>(2 * segNum) = Float3(0.0f, 1.0f, mZStart); vba.Color<Float3>(0, 2 * segNum) = zeroLineColorBlue; vba.Position<Float3>(2 * segNum + 1) = Float3(0.0f, 1.0f, mZEnd); vba.Color<Float3>(0, 2 * segNum + 1) = zeroLineColorBlue; segNum++; Vector2f scrv = mUIViewGrid->PointWorldToViewPort(APoint::ORIGIN); FontStr fs; fs.x = iTemp + (int)mLeftWidth; fs.y = height - (int)scrv.Y(); fs.str = "0.0"; mFontStrs.push_back(fs); FontStr fs1; fs1.x = (int)scrv.X() + iTemp; fs1.y = height - zTemp; fs1.str = "0.0"; mFontStrs.push_back(fs1); gird->SetNumSegments(segNum); gird->UpdateModelSpace(Renderable::GU_MODEL_BOUND_ONLY); if (mRenderer) mRenderer->Update(gird->GetVertexBuffer()); if (doScale) { float rWidth = 2.0f * rMax; float scaleX = rWidth / 22.5f; float uHeight = 2.0f * uMax; float scaleZ = uHeight / (((float)mSize.Height / (float)mSize.Width)*22.5f); PX2_EDIT.GetTimeLineEdit()->SetCtrlsScale(Float2(scaleX, scaleZ)); } }
//---------------------------------------------------------------------------- void FreeFormDeformation::CreatePolylines () { // Generate the polylines that connect adjacent control points. mPolysegmentRoot = new0 Node(); mTrnNode->AttachChild(mPolysegmentRoot); VertexColor3Effect* effect = new0 VertexColor3Effect(); VertexFormat* vformat = VertexFormat::Create(2, VertexFormat::AU_POSITION, VertexFormat::AT_FLOAT3, 0, VertexFormat::AU_COLOR, VertexFormat::AT_FLOAT3, 0); int vstride = vformat->GetStride(); VertexBufferAccessor vba; VertexBuffer* vbuffer; Polysegment* segment; int i0, i1, i2; for (i0 = 0; i0 < mQuantity; ++i0) { for (i1 = 0; i1 < mQuantity; ++i1) { for (i2 = 0; i2 < mQuantity-1; ++i2) { vbuffer = new0 VertexBuffer(2, vstride); vba.ApplyTo(vformat, vbuffer); vba.Position<Vector3f>(0) = mVolume->GetControlPoint(i0, i1, i2); vba.Position<Vector3f>(1) = mVolume->GetControlPoint(i0, i1, i2+1); vba.Color<Float3>(0, 0) = Float3(0.0f, 0.0f, 0.75f); vba.Color<Float3>(0, 1) = Float3(0.0f, 0.0f, 0.75f); segment = new0 Polysegment(vformat, vbuffer, true); segment->SetEffectInstance(effect->CreateInstance()); mPolysegmentRoot->AttachChild(segment); } } for (i2 = 0; i2 < mQuantity; ++i2) { for (i1 = 0; i1 < mQuantity-1; ++i1) { vbuffer = new0 VertexBuffer(2, vstride); vba.ApplyTo(vformat, vbuffer); vba.Position<Vector3f>(0) = mVolume->GetControlPoint(i0, i1, i2); vba.Position<Vector3f>(1) = mVolume->GetControlPoint(i0, i1+1, i2); vba.Color<Float3>(0, 0) = Float3(0.0f, 0.75f, 0.0f); vba.Color<Float3>(0, 1) = Float3(0.0f, 0.75f, 0.0f); segment = new0 Polysegment(vformat, vbuffer, true); segment->SetEffectInstance(effect->CreateInstance()); mPolysegmentRoot->AttachChild(segment); } } } for (i0 = 0; i0 < mQuantity-1; ++i0) { for (i1 = 0; i1 < mQuantity; ++i1) { for (i2 = 0; i2 < mQuantity; ++i2) { vbuffer = new0 VertexBuffer(2, vstride); vba.ApplyTo(vformat, vbuffer); vba.Position<Vector3f>(0) = mVolume->GetControlPoint(i0, i1, i2); vba.Position<Vector3f>(1) = mVolume->GetControlPoint(i0+1, i1, i2); vba.Color<Float3>(0,0) = Float3(0.75f, 0.0f, 0.0f); vba.Color<Float3>(0,1) = Float3(0.75f, 0.0f, 0.0f); segment = new0 Polysegment(vformat, vbuffer, true); segment->SetEffectInstance(effect->CreateInstance()); mPolysegmentRoot->AttachChild(segment); } } } }