//---------------------------------------------------------------------------- void Fluids3D::UpdateIndexBuffer () { VertexBufferAccessor vba(mCube); APoint camPos = mCamera->GetPosition(); const int numTriangles = mNumIndices/3; int* currentIndex = mIndices; mTriangles.clear(); for (int t = 0; t < numTriangles; ++t) { Triangle tri; tri.mIndex0 = *currentIndex++; tri.mIndex1 = *currentIndex++; tri.mIndex2 = *currentIndex++; #ifdef USE_PARTICLES float alpha = vba.Color<Float4>(0, tri.mIndex0)[3]; if (alpha == 0.0f) { continue; } #else float alpha0 = vba.Color<Float4>(0, tri.mIndex0)[3]; float alpha1 = vba.Color<Float4>(0, tri.mIndex1)[3]; float alpha2 = vba.Color<Float4>(0, tri.mIndex2)[3]; if (alpha0 == 0.0f && alpha1 == 0.0f && alpha2 == 0.0f) { continue; } #endif Vector3f scaledCenter = vba.Position<Vector3f>(tri.mIndex0) + vba.Position<Vector3f>(tri.mIndex1) + vba.Position<Vector3f>(tri.mIndex2); APoint output = mCube->WorldTransform*APoint(scaledCenter); AVector diff = output - camPos; tri.mNegSqrDistance = -diff.SquaredLength(); mTriangles.insert(tri); } IndexBuffer* ibuffer = mCube->GetIndexBuffer(); int* indices = (int*)ibuffer->GetData(); ibuffer->SetNumElements(3*(int)mTriangles.size()); std::multiset<Triangle>::iterator iter = mTriangles.begin(); std::multiset<Triangle>::iterator end = mTriangles.end(); for (/**/; iter != end; ++iter) { *indices++ = iter->mIndex0; *indices++ = iter->mIndex1; *indices++ = iter->mIndex2; } mRenderer->Update(ibuffer); }
//---------------------------------------------------------------------------- Jungler::Jungler (Texture2D *tex, int maxNum, JunglerType type) : mTexture(tex), mMaxNum(maxNum), mJunglerType(type) { VertexFormat *vf = VertexFormat::Create(3, VertexFormat::AU_POSITION, VertexFormat::AT_FLOAT3, 0, VertexFormat::AU_NORMAL, VertexFormat::AT_FLOAT3, 0, VertexFormat::AU_TEXCOORD, VertexFormat::AT_FLOAT2, 0); SetVertexFormat(vf); int vNum = mMaxNum * msJunVertxNum[mJunglerType]; int iNum = mMaxNum * msJunIndexNum[mJunglerType]; VertexBuffer *vBuffer = new0 VertexBuffer(vNum, mVFormat->GetStride()); IndexBuffer *iBuffer = new0 IndexBuffer(iNum, 2); vBuffer->SetNumElements((int)mPoses.size()*4); iBuffer->SetNumElements((int)mPoses.size()*6); SetVertexBuffer(vBuffer); SetIndexBuffer(iBuffer); }
//---------------------------------------------------------------------------- void Font::RenderText (TriMesh *mesh, float depth) { VertexFormat *vFormat = mesh->GetVertexFormat(); VertexBuffer *vBuffer = mesh->GetVertexBuffer(); IndexBuffer *iBuffer = mesh->GetIndexBuffer(); if (!vBuffer) { vBuffer = new0 VertexBuffer(4*mShowNum, vFormat->GetStride(), Buffer::BU_DYNAMIC); iBuffer = new0 IndexBuffer(6*mShowNum, 2); unsigned short *indices = (unsigned short*)iBuffer->GetData(); for (int i=0; i<mShowNum; i++) { unsigned short v0 = i*4 + 0; unsigned short v1 = i*4 + 1; unsigned short v2 = i*4 + 2; unsigned short v3 = i*4 + 3; *indices++ = v0; *indices++ = v1; *indices++ = v2; *indices++ = v0; *indices++ = v2; *indices++ = v3; } mesh->SetVertexBuffer(vBuffer); mesh->SetIndexBuffer(iBuffer); } else { int vertexNum = vBuffer->GetNumElements(); if (vertexNum < 4*mShowNum) { vBuffer = new0 VertexBuffer(4*mShowNum, vFormat->GetStride(), Buffer::BU_DYNAMIC); iBuffer = new0 IndexBuffer(6*mShowNum, 2); unsigned short *indices = (unsigned short*)iBuffer->GetData(); for (int i=0; i<mShowNum; i++) { unsigned short v0 = i*4 + 0; unsigned short v1 = i*4 + 1; unsigned short v2 = i*4 + 2; unsigned short v3 = i*4 + 3; *indices++ = v0; *indices++ = v1; *indices++ = v2; *indices++ = v0; *indices++ = v2; *indices++ = v3; } mesh->SetVertexBuffer(vBuffer); mesh->SetIndexBuffer(iBuffer); } } VertexBufferAccessor vba(vFormat, vBuffer); for (int i=0; i<mShowNum; i++) { FontDrawRect &rect = mDrawRects[i]; vba.Position<Float3>(4*i) = Float3(rect.Rect.Left, depth, rect.Rect.Bottom); vba.Color<Float4>(0, 4*i) = rect.Color; vba.TCoord<Float2>(0, 4*i) = Float2(rect.RectUV.Left, rect.RectUV.Bottom); vba.Position<Float3>(4*i+1) = Float3(rect.Rect.Right, depth, rect.Rect.Bottom); vba.Color<Float4>(0, 4*i+1) = rect.Color; vba.TCoord<Float2>(0, 4*i+1)= Float2(rect.RectUV.Right, rect.RectUV.Bottom); vba.Position<Float3>(4*i+2) = Float3(rect.Rect.Right, depth, rect.Rect.Top); vba.Color<Float4>(0, 4*i+2) = rect.Color; vba.TCoord<Float2>(0, 4*i+2)= Float2(rect.RectUV.Right, rect.RectUV.Top); vba.Position<Float3>(4*i+3) = Float3(rect.Rect.Left, depth, rect.Rect.Top); vba.Color<Float4>(0, 4*i+3) = rect.Color; vba.TCoord<Float2>(0, 4*i+3)= Float2(rect.RectUV.Left, rect.RectUV.Top); } vBuffer->SetNumElements(4*mShowNum); iBuffer->SetNumElements(6*mShowNum); mesh->UpdateModelSpace(Renderable::GU_MODEL_BOUND_ONLY); Renderer::UpdateAll(vBuffer); Renderer::UpdateAll(iBuffer); mShowNum = 0; }