Exemplo n.º 1
0
void DrawFastSphere( CMeshBuilder &meshBuilder, const Vector &center, float radius, int r, int g, int b )
{
	int i;

	int offset = meshBuilder.GetCurrentVertex();

	Vector pos;
	for (i = 0; i < 51; i++)
	{
		pos.x = g_FastSpherePosData[i][0] + center.x + g_FastSpherePosData[i][5] * radius;
		pos.y = g_FastSpherePosData[i][1] + center.y + g_FastSpherePosData[i][6] * radius;
		pos.z = g_FastSpherePosData[i][2] + center.z + g_FastSpherePosData[i][7] * radius;

		meshBuilder.Position3fv( pos.Base() );
		meshBuilder.Normal3fv( &g_FastSpherePosData[i][5] );
		meshBuilder.TexCoord2fv( 0, &g_FastSpherePosData[i][3] );
		meshBuilder.Color3ub( 255, 255, 255 );
		meshBuilder.AdvanceVertex();
	}

	for (i = 0; i < 84; i++)
	{
		meshBuilder.FastIndex( g_FastSphereTriData[i][0] + offset );
		meshBuilder.FastIndex( g_FastSphereTriData[i][1] + offset );
		meshBuilder.FastIndex( g_FastSphereTriData[i][2] + offset );
	}
}
Exemplo n.º 2
0
void FX_DrawLineFade( const Vector &start, const Vector &end, float scale, IMaterial *pMaterial, const color32 &color, float fadeDist )
{
    Vector			lineDir, viewDir;
    //Get the proper orientation for the line
    VectorSubtract( end, start, lineDir );
    VectorSubtract( end, CurrentViewOrigin(), viewDir );

    float lineLength = lineDir.Length();
    float t0 = 0.25f;
    float t1 = 0.75f;
    if ( lineLength > 0 )
    {
        t0 = fadeDist / lineLength;
        t0 = clamp( t0, 0.0f, 0.25f );
        t1 = 1.0f - t0;
    }

    Vector cross = lineDir.Cross( viewDir );

    VectorNormalize( cross );

    CMatRenderContextPtr pRenderContext( materials );

    //Bind the material
    IMesh* pMesh = pRenderContext->GetDynamicMesh( true, NULL, NULL, pMaterial );
    CMeshBuilder meshBuilder;

    Vector			tmp;
    meshBuilder.Begin( pMesh, MATERIAL_TRIANGLES, 8, 24 );

    //		2			5
    // 0	1			4	 7
    //		3			6

    // 0,2,1 - 0,1,3 - 7,4,5 - 7,6,4 - 1,4,6, 1,6,3 - 1,5,4 - 1,2,5

    // v0
    meshBuilder.Position3fv( start.Base() );
    meshBuilder.TexCoord2f( 0, 0.5f, 0.0f );
    meshBuilder.Color4ub( 0, 0, 0, 0 );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();
    // v1
    Vector v1 = start + t0 * lineDir;
    meshBuilder.Position3fv( v1.Base() );
    meshBuilder.TexCoord2f( 0, 0.5f, t0 );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();
    // v2
    tmp = v1 - scale*cross;
    meshBuilder.Position3fv( tmp.Base() );
    meshBuilder.TexCoord2f( 0, 1.0f, t0 );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();
    // v3
    tmp = v1 + scale*cross;
    meshBuilder.Position3fv( tmp.Base() );
    meshBuilder.TexCoord2f( 0, 0.0f, t0 );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();
    // v4
    Vector v4 = start + t1 * lineDir;
    meshBuilder.Position3fv( v4.Base() );
    meshBuilder.TexCoord2f( 0, 0.5f, t1 );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();
    // v5
    tmp = v4 - scale*cross;
    meshBuilder.Position3fv( tmp.Base() );
    meshBuilder.TexCoord2f( 0, 1.0f, t1 );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();
    // v6
    tmp = v4 + scale*cross;
    meshBuilder.Position3fv( tmp.Base() );
    meshBuilder.TexCoord2f( 0, 0.0f, t1 );
    meshBuilder.Color4ub( color.r, color.g, color.b, color.a );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();
    // v7
    meshBuilder.Position3fv( end.Base() );
    meshBuilder.TexCoord2f( 0, 0.5f, 1.0f );
    meshBuilder.Color4ub( 0, 0, 0, 0 );
    meshBuilder.Normal3fv( cross.Base() );
    meshBuilder.AdvanceVertex();


    // triangles - 0,2,1 - 0,1,3 - 7,4,5 - 7,6,4 - 1,4,6, 1,6,3 - 1,5,4 - 1,2,5
    meshBuilder.FastIndex( 0 );
    meshBuilder.FastIndex( 2 );
    meshBuilder.FastIndex( 1 );
    meshBuilder.FastIndex( 0 );
    meshBuilder.FastIndex( 1 );
    meshBuilder.FastIndex( 3 );

    meshBuilder.FastIndex( 7 );
    meshBuilder.FastIndex( 4 );
    meshBuilder.FastIndex( 5 );
    meshBuilder.FastIndex( 7 );
    meshBuilder.FastIndex( 6 );
    meshBuilder.FastIndex( 4 );

    meshBuilder.FastIndex( 1 );
    meshBuilder.FastIndex( 4 );
    meshBuilder.FastIndex( 6 );
    meshBuilder.FastIndex( 1 );
    meshBuilder.FastIndex( 6 );
    meshBuilder.FastIndex( 3 );
    meshBuilder.FastIndex( 1 );
    meshBuilder.FastIndex( 5 );
    meshBuilder.FastIndex( 4 );
    meshBuilder.FastIndex( 1 );
    meshBuilder.FastIndex( 2 );
    meshBuilder.FastIndex( 5 );

    meshBuilder.End();
    pMesh->Draw();
}
//-----------------------------------------------------------------------------
// Tests dynamic buffers
//-----------------------------------------------------------------------------
void CMaterialSystemTestApp::TestDynamicBuffers( IMatRenderContext *pMatRenderContext, bool bBuffered )
{
	CreateWireframeMaterial();

	g_pMaterialSystem->BeginFrame( 0 );

	pMatRenderContext->Bind( m_pMaterial );
	IMesh *pMesh = pMatRenderContext->GetDynamicMesh( bBuffered );

	// clear (so that we can make sure that we aren't getting results from the previous quad)
	pMatRenderContext->ClearColor3ub( RandomInt( 0, 100 ), RandomInt( 0, 100 ), RandomInt( 190, 255 ) );
	pMatRenderContext->ClearBuffers( true, true );

	static unsigned char s_pColors[4][4] = 
	{
		{ 255,   0,   0, 255 },
		{   0, 255,   0, 255 },
		{   0,   0, 255, 255 },
		{ 255, 255, 255, 255 },
	};

	static int nCount = 0;

	const int nLoopCount = 8;
	float flWidth = 2.0f / nLoopCount;
	for ( int i = 0; i < nLoopCount; ++i )
	{
		CMeshBuilder mb;
		mb.Begin( pMesh, MATERIAL_TRIANGLES, 4, 6 );

		mb.Position3f( -1.0f + i * flWidth, -1.0f, 0.5f );
		mb.Normal3f( 0.0f, 0.0f, 1.0f );
		mb.Color4ubv( s_pColors[nCount++ % 4] );
		mb.AdvanceVertex();

		mb.Position3f( -1.0f + i * flWidth + flWidth, -1.0f, 0.5f );
		mb.Normal3f( 0.0f, 0.0f, 1.0f );
		mb.Color4ubv( s_pColors[nCount++ % 4] );
		mb.AdvanceVertex();

		mb.Position3f( -1.0f + i * flWidth + flWidth,  1.0f, 0.5f );
		mb.Normal3f( 0.0f, 0.0f, 1.0f );
		mb.Color4ubv( s_pColors[nCount++ % 4] );
		mb.AdvanceVertex();

		mb.Position3f( -1.0f + i * flWidth,  1.0f, 0.5f );
		mb.Normal3f( 0.0f, 0.0f, 1.0f );
		mb.Color4ubv( s_pColors[nCount++ % 4] );
		mb.AdvanceVertex();

		++nCount;

		mb.FastIndex( 0 );
		mb.FastIndex( 2 );
		mb.FastIndex( 1 );
		mb.FastIndex( 0 );
		mb.FastIndex( 3 );
		mb.FastIndex( 2 );

		mb.End( true );

		pMesh->Draw( );
	}

	++nCount;

	g_pMaterialSystem->EndFrame();
	g_pMaterialSystem->SwapBuffers();

	DestroyMaterial();
}
//-----------------------------------------------------------------------------
// Paints a regular texture
//-----------------------------------------------------------------------------
void CVMTPreviewPanel::DrawRectangle( void )
{		     
	// Get the aspect ratio of the material
	int tw = m_Material->GetMappingWidth();
 	int th = m_Material->GetMappingHeight();

	if ( tw <= 0 || th <= 0 )
		return;

	int w, h;
	GetSize( w, h );
	if ( w == 0 || h == 0 )
		return;

 	SetupOrthoMatrix( w, h );
	SetupLightingState();

	CMatRenderContextPtr pRenderContext( MaterialSystem() );

	pRenderContext->MatrixMode( MATERIAL_VIEW );
	pRenderContext->LoadIdentity();

	pRenderContext->MatrixMode( MATERIAL_MODEL );
	pRenderContext->LoadIdentity();

	IMesh* pMesh = pRenderContext->GetDynamicMesh();

	CMeshBuilder meshBuilder;
	meshBuilder.Begin( pMesh, MATERIAL_TRIANGLE_STRIP, 4, 4 );

	bool bIsUsingLightmap = m_Material->GetPropertyFlag( MATERIAL_PROPERTY_NEEDS_LIGHTMAP );
	bool bIsUsingBumpedLightmap = m_Material->GetPropertyFlag( MATERIAL_PROPERTY_NEEDS_BUMPED_LIGHTMAPS );

	int nLightmapWidth = m_pLightmapTexture->GetActualWidth();
	float flHalfLuxel = 0.5f / nLightmapWidth;
	Vector2D halfTexel( 0.5f / tw, 0.5f / th );

	Vector vecNormal( 0.0f, 0.0f, 1.0f );
	Vector4D vecTangentS( 1.0f, 0.0f, 0.0f, 1.0f );
	Vector vecTangentT;
	CrossProduct( vecNormal, vecTangentS.AsVector3D(), vecTangentT );

	float screenaspect = (float)tw / (float)th;
	float aspect = (float)w / (float)h;

	float ratio = screenaspect / aspect;
	   
	// Screen is wider, need bars at top and bottom
	int x2, y2;
	int x, y;
	x = y = 0;
	int nXBorder = w > 15 ? 5 : w / 3;
	int nYBorder = h > 15 ? 5 : h / 3;
	w -= 2 * nXBorder;
	h -= 2 * nYBorder;
	if ( ratio > 1.0f )
	{
		int usetall = (float)w / screenaspect;
		y = ( h - usetall ) / 2;
		h = usetall;
	}
	// Screen is narrower, need bars at left/right
	else
	{
		int usewide = (float)h * screenaspect;
		x = ( w - usewide ) / 2;
		w = usewide;
	}
	x += nXBorder;
	y += nYBorder;

	x2 = x+w; y2 = y+h;

	float u = halfTexel.x;
	float v = halfTexel.y;

	float u1_l, u1_r, v1_t, v1_b;
	float u2_l, u2_r, v2_t, v2_b;

	u1_l = u2_l = u;
	u1_r = u2_r = 1.0f - u;
	v1_t = v2_t = v;
	v1_b = v2_b = 1.0f - v;

	if ( bIsUsingLightmap )
	{
		u1_l = v1_t = flHalfLuxel;
		u1_r = v1_b = 0.25 - flHalfLuxel;
		if ( bIsUsingBumpedLightmap )
		{
			u2_l = u2_r = 0.25f;
			v2_t = v2_b = 0.0f;
		}
	}
	  
	meshBuilder.Position3f( x, y2, 0.0f );
	meshBuilder.Normal3fv( vecNormal.Base() );
	meshBuilder.Color4ub( 255, 0, 0, 255 );
	meshBuilder.TexCoord2f( 0, u, v );
	meshBuilder.TexCoord2f( 1, u1_l, v1_t );
	meshBuilder.TexCoord2f( 2, u2_l, v2_t );
	meshBuilder.TangentS3fv( vecTangentS.Base() );
	meshBuilder.TangentT3fv( vecTangentT.Base() );
	meshBuilder.BoneWeight( 0, 1.0f );
	meshBuilder.BoneMatrix( 0, 0 );
	meshBuilder.UserData( vecTangentS.Base() );
	meshBuilder.AdvanceVertex();
				    
	meshBuilder.Position3f( x, y, 0.0f );
	meshBuilder.Normal3fv( vecNormal.Base() );
	meshBuilder.Color4ub( 255, 255, 255, 64 );
	meshBuilder.TexCoord2f( 0, u, 1.0f - v );
	meshBuilder.TexCoord2f( 1, u1_l, v1_b );
	meshBuilder.TexCoord2f( 2, u2_l, v2_b );
	meshBuilder.TangentS3fv( vecTangentS.Base() );
	meshBuilder.TangentT3fv( vecTangentT.Base() );
	meshBuilder.BoneWeight( 0, 1.0f );
	meshBuilder.BoneMatrix( 0, 0 );
	meshBuilder.UserData( vecTangentS.Base() );
	meshBuilder.AdvanceVertex();
			    
	meshBuilder.Position3f( x2, y2, 0.0f );
	meshBuilder.Normal3fv( vecNormal.Base() );
	meshBuilder.Color4ub( 0, 0, 255, 255 );
	meshBuilder.TexCoord2f( 0, 1.0f - u, v );
	meshBuilder.TexCoord2f( 1, u1_r, v1_t );
	meshBuilder.TexCoord2f( 2, u2_r, v2_t );
	meshBuilder.TangentS3fv( vecTangentS.Base() );
	meshBuilder.TangentT3fv( vecTangentT.Base() );
	meshBuilder.BoneWeight( 0, 1.0f );
	meshBuilder.BoneMatrix( 0, 0 );
	meshBuilder.UserData( vecTangentS.Base() );
	meshBuilder.AdvanceVertex();

	meshBuilder.Position3f( x2, y, 0.0f );
	meshBuilder.Normal3fv( vecNormal.Base() );
	meshBuilder.Color4ub( 0, 255, 0, 64 );
	meshBuilder.TexCoord2f( 0, 1.0f - u, 1.0f - v );
	meshBuilder.TexCoord2f( 1, u1_r, v1_b );
	meshBuilder.TexCoord2f( 2, u2_r, v2_b );
	meshBuilder.TangentS3fv( vecTangentS.Base() );
	meshBuilder.TangentT3fv( vecTangentT.Base() );
	meshBuilder.BoneWeight( 0, 1.0f );
	meshBuilder.BoneMatrix( 0, 0 );
	meshBuilder.UserData( vecTangentS.Base() );
	meshBuilder.AdvanceVertex();
						  
	meshBuilder.FastIndex( 0 );
	meshBuilder.FastIndex( 1 );
	meshBuilder.FastIndex( 2 );
	meshBuilder.FastIndex( 3 );

	meshBuilder.End();
	pMesh->Draw();
}
//-----------------------------------------------------------------------------
// Draw a sphere
//-----------------------------------------------------------------------------
void CVMTPreviewPanel::RenderSphere( const Vector &vCenter, float flRadius, int nTheta, int nPhi )
{
	int nVertices =  nTheta * nPhi;
	int nIndices = 2 * ( nTheta + 1 ) * ( nPhi - 1 );
	
	CMatRenderContextPtr pRenderContext( MaterialSystem() );

	IMesh* pMesh = pRenderContext->GetDynamicMesh();

	CMeshBuilder meshBuilder;
	meshBuilder.Begin( pMesh, MATERIAL_TRIANGLE_STRIP, nVertices, nIndices );

	bool bIsUsingLightmap = m_Material->GetPropertyFlag( MATERIAL_PROPERTY_NEEDS_LIGHTMAP );
	bool bIsUsingBumpedLightmap = m_Material->GetPropertyFlag( MATERIAL_PROPERTY_NEEDS_BUMPED_LIGHTMAPS );

	int nLightmapWidth = m_pLightmapTexture->GetActualWidth();
	float flHalfLuxel = 0.5f / nLightmapWidth;

	//
	// Build the index buffer.
	//
	int i, j;
	for ( i = 0; i < nPhi; ++i )
	{
		for ( j = 0; j < nTheta; ++j )
		{
			float u = j / ( float )(nTheta - 1);
			float v = i / ( float )(nPhi - 1);
			float theta = ( j != nTheta-1 ) ? 2.0f * M_PI * u : 0.0f;
			float phi = M_PI * v;

			Vector vecPos;
			vecPos.x = flRadius * sin(phi) * cos(theta);
			vecPos.y = flRadius * sin(phi) * sin(theta); 
			vecPos.z = flRadius * cos(phi);
			    
			Vector vecNormal = vecPos;
			VectorNormalize( vecNormal );

			Vector4D vecTangentS;
			Vector vecTangentT;
			vecTangentS.Init( vecPos.z, -vecPos.x, 0.0f, 1.0f );
			if ( VectorNormalize( vecTangentS.AsVector3D() ) == 0.0f )
			{
				vecTangentS.Init( 1.0f, 0.0f, 0.0f, 1.0f );
			}

			CrossProduct( vecNormal, vecTangentS.AsVector3D(), vecTangentT );

			unsigned char red = (int)( u * 255.0f );
			unsigned char green = (int)( v * 255.0f );
			unsigned char blue = (int)( v * 255.0f );
			unsigned char alpha = (int)( v * 255.0f );

			vecPos += vCenter;

			float u1, u2, v1, v2;
			u1 = u2 = u;
			v1 = v2 = v;

			if ( bIsUsingLightmap )
			{
				u1 = RemapVal( u1, 0.0f, 1.0f, flHalfLuxel, 0.25 - flHalfLuxel );

				if ( bIsUsingBumpedLightmap )
				{
					u2 = 0.25f;
					v2 = 0.0f;
				}
			}
					  
			meshBuilder.Position3fv( vecPos.Base() );
			meshBuilder.Normal3fv( vecNormal.Base() );
			meshBuilder.Color4ub( red, green, blue, alpha );
			meshBuilder.TexCoord2f( 0, 2.0f * u, v );
			meshBuilder.TexCoord2f( 1, u1, v1 );
			meshBuilder.TexCoord2f( 2, u2, v2 );
			meshBuilder.TangentS3fv( vecTangentS.Base() );
			meshBuilder.TangentT3fv( vecTangentT.Base() );
			meshBuilder.BoneWeight( 0, 1.0f );
			meshBuilder.BoneMatrix( 0, 0 );
			meshBuilder.UserData( vecTangentS.Base() );
			meshBuilder.AdvanceVertex();
		}
	}

	//
	// Emit the triangle strips.
	//
	int idx = 0;
	for ( i = 0; i < nPhi - 1; ++i )
	{
		for ( j = 0; j < nTheta; ++j )
		{
			idx = nTheta * i + j;

			meshBuilder.FastIndex( idx );
			meshBuilder.FastIndex( idx + nTheta );
		}

		//
		// Emit a degenerate triangle to skip to the next row without
		// a connecting triangle.
		//
		if ( i < nPhi - 2 )
		{
			meshBuilder.FastIndex( idx + 1 );
			meshBuilder.FastIndex( idx + 1 + nTheta );
		}
	}

	meshBuilder.End();
	pMesh->Draw();
}