//---------------------------------------------------------------------------- VisualEffectInstance* LightAmbEffect::CreateUniqueInstance (Light* light, Material* material) { LightAmbEffect* effect = new0 LightAmbEffect(); return effect->CreateInstance(light, material); }
//---------------------------------------------------------------------------- void FreeFormDeformation::CreateControlBoxes () { // Generate small boxes to represent the control points. mControlRoot = new0 Node(); mTrnNode->AttachChild(mControlRoot); // Create a single box to be shared by each control point box. const float halfWidth = 0.02f; VertexFormat* vformat = VertexFormat::Create(1, VertexFormat::AU_POSITION, VertexFormat::AT_FLOAT3, 0); int vstride = vformat->GetStride(); VertexBuffer* vbuffer = new0 VertexBuffer(8, vstride); VertexBufferAccessor vba(vformat, vbuffer); vba.Position<Vector3f>(0) = Vector3f(-halfWidth, -halfWidth, -halfWidth); vba.Position<Vector3f>(1) = Vector3f(+halfWidth, -halfWidth, -halfWidth); vba.Position<Vector3f>(2) = Vector3f(+halfWidth, +halfWidth, -halfWidth); vba.Position<Vector3f>(3) = Vector3f(-halfWidth, +halfWidth, -halfWidth); vba.Position<Vector3f>(4) = Vector3f(-halfWidth, -halfWidth, +halfWidth); vba.Position<Vector3f>(5) = Vector3f(+halfWidth, -halfWidth, +halfWidth); vba.Position<Vector3f>(6) = Vector3f(+halfWidth, +halfWidth, +halfWidth); vba.Position<Vector3f>(7) = Vector3f(-halfWidth, +halfWidth, +halfWidth); IndexBuffer* ibuffer = new0 IndexBuffer(36, sizeof(int)); int* indices = (int*)ibuffer->GetData(); indices[ 0] = 0; indices[ 1] = 2; indices[ 2] = 1; indices[ 3] = 0; indices[ 4] = 3; indices[ 5] = 2; indices[ 6] = 4; indices[ 7] = 5; indices[ 8] = 6; indices[ 9] = 4; indices[10] = 6; indices[11] = 7; indices[12] = 0; indices[13] = 5; indices[14] = 4; indices[15] = 0; indices[16] = 1; indices[17] = 5; indices[18] = 3; indices[19] = 7; indices[20] = 6; indices[21] = 3; indices[22] = 6; indices[23] = 2; indices[24] = 1; indices[25] = 2; indices[26] = 6; indices[27] = 1; indices[28] = 6; indices[29] = 5; indices[30] = 0; indices[31] = 4; indices[32] = 7; indices[33] = 0; indices[34] = 7; indices[35] = 3; // Create the materials and light to be attached to each box. Material* materialActive = new0 Material(); materialActive->Emissive = Float4(0.0f, 0.0f, 0.0f, 1.0f); materialActive->Ambient = Float4(1.0f, 0.0f, 0.0f, 1.0f); materialActive->Diffuse = Float4(1.0f, 0.0f, 0.0f, 1.0f); materialActive->Specular = Float4(0.0f, 0.0f, 0.0f, 1.0f); Material* materialInactive = new0 Material(); materialInactive->Emissive = Float4(0.0f, 0.0f, 0.0f, 1.0f); materialInactive->Ambient = Float4(0.75f, 0.75f, 0.75f, 1.0f); materialInactive->Diffuse = Float4(0.75f, 0.75f, 0.75f, 1.0f); materialInactive->Specular = Float4(0.0f, 0.0f, 0.0f, 1.0f); Light* light = new0 Light(Light::LT_AMBIENT); light->Ambient = Float4(1.0f, 1.0f, 1.0f, 1.0f); light->Diffuse = Float4(1.0f, 1.0f, 1.0f, 1.0f); light->Specular = Float4(0.0f, 0.0f, 0.0f, 1.0f); LightAmbEffect* effect = new0 LightAmbEffect(); mControlActive = effect->CreateInstance(light, materialActive); mControlInactive = effect->CreateInstance(light, materialInactive); for (int i0 = 0; i0 < mQuantity; ++i0) { for (int i1 = 0; i1 < mQuantity; ++i1) { for (int i2 = 0; i2 < mQuantity; ++i2) { TriMesh* box = new0 TriMesh(vformat, vbuffer, ibuffer); Vector3f ctrl = mVolume->GetControlPoint(i0, i1, i2); box->LocalTransform.SetTranslate(ctrl); // Encode the indices in the name for later use. This will // allow fast lookup of volume control points. char name[32]; sprintf(name, "%d %d %d", i0, i1, i2); box->SetName(name); box->SetEffectInstance(mControlInactive); mControlRoot->AttachChild(box); } } } }