Ejemplo n.º 1
0
//----------------------------------------------------------------------------
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);
}
Ejemplo n.º 2
0
//----------------------------------------------------------------------------
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);
}
Ejemplo n.º 3
0
//----------------------------------------------------------------------------
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;
}