void CBaseShader::SetFixedFunctionTextureScale( MaterialMatrixMode_t textureTransform, int scaleVar )
{
	Assert( !IsSnapshotting() );

	// handle scrolling of base texture
	Vector2D vScale;
	s_ppParams[scaleVar]->GetVecValue( vScale.Base(), 2 );
	if( vScale[0] != 0.0f || vScale[1] != 0.0f )
	{
		s_pShaderAPI->MatrixMode( textureTransform );

		// only do the upper 3x3 since this is a 2D matrix
		float mat[16];
		mat[0] = vScale[0];	mat[1] = 0.0f;		mat[2] = 0.0f;
		mat[4] = 0.0f;		mat[5] = vScale[1];	mat[6] = 0.0f;
		mat[8] = 0.0f;		mat[9] = 0.0f;		mat[10] = 1.0f;

		// Better set the stuff we don't set with some sort of value!
		mat[3] = mat[7] = mat[11] = 0;
		mat[12] = mat[13] = mat[14] = 0;
		mat[15] = 1;

		s_pShaderAPI->LoadMatrix( mat );
	}
	else
	{
		LoadIdentity( textureTransform );
	}
}
Example #2
0
//-----------------------------------------------------------------------------
// Attribute types related to vector math
//-----------------------------------------------------------------------------
bool Serialize( CUtlBuffer &buf, const Vector2D &src )
{
	if ( buf.IsText() )
	{
		SerializeFloats( buf, 2, src.Base() );
	}
	else
	{
		buf.PutFloat( src.x );
		buf.PutFloat( src.y );
	}
	return buf.IsValid();
}
void CTextureTransformProxy::OnBind( void *pC_BaseEntity )
{
    Vector2D center( 0.5, 0.5 );
    Vector2D translation( 0, 0 );

    VMatrix mat, temp;

    if (m_pCenterVar)
    {
        m_pCenterVar->GetVecValue( center.Base(), 2 );
    }
    MatrixBuildTranslation( mat, -center.x, -center.y, 0.0f );

    if (m_pScaleVar)
    {
        Vector2D scale;
        m_pScaleVar->GetVecValue( scale.Base(), 2 );
        MatrixBuildScale( temp, scale.x, scale.y, 1.0f );
        MatrixMultiply( temp, mat, mat );
    }

    if (m_pRotateVar)
    {
        float angle = m_pRotateVar->GetFloatValue( );
        MatrixBuildRotateZ( temp, angle );
        MatrixMultiply( temp, mat, mat );
    }
    MatrixBuildTranslation( temp, center.x, center.y, 0.0f );
    MatrixMultiply( temp, mat, mat );

    if (m_pTranslateVar)
    {
        m_pTranslateVar->GetVecValue( translation.Base(), 2 );
        MatrixBuildTranslation( temp, translation.x, translation.y, 0.0f );
        MatrixMultiply( temp, mat, mat );
    }

    m_pResult->SetMatrixValue( mat );

    if ( ToolsEnabled() )
    {
        ToolFramework_RecordMaterialParams( GetMaterial() );
    }
}
Example #4
0
// ----------------------------------------------------------------------------- //
// Adds shadow rendering data to a particular mesh builder
// ----------------------------------------------------------------------------- //
int DispInfo_AddShadowsToMeshBuilder( CMeshBuilder& meshBuilder,
                                      DispShadowHandle_t h, int baseIndex )
{
#ifndef SWDS
    if ( !r_DrawDisp.GetBool() )
    {
        return baseIndex;
    }

    CDispShadowDecal* pShadowDecal = &s_DispShadowDecals[h];
    int shadow = pShadowDecal->m_Shadow;
    ShadowInfo_t const& info = g_pShadowMgr->GetInfo( shadow );

    // It had better be computed by now...
    Assert( pShadowDecal->m_Flags & CDispDecalBase::FRAGMENTS_COMPUTED );

#ifdef _DEBUG
    int triCount = 0;
    int vertCount = 0;
#endif

    DispShadowFragmentHandle_t f = pShadowDecal->m_FirstFragment;
    while ( f != DISP_SHADOW_FRAGMENT_HANDLE_INVALID )
    {
        CDispShadowFragment& fragment = s_DispShadowFragments[f];

        // Add in the vertices + indices, use two loops to minimize tests...
        int i;
        for ( i = 0; i < fragment.m_nVerts - 2; ++i )
        {
            meshBuilder.Position3fv( fragment.m_Verts[i].Base() );

            // Transform + offset the texture coords
            Vector2D texCoord;
            Vector2DMultiply( fragment.m_TCoords[i].AsVector2D(), info.m_TexSize, texCoord );
            texCoord += info.m_TexOrigin;
            meshBuilder.TexCoord2fv( 0, texCoord.Base() );

            unsigned char c = g_pShadowMgr->ComputeDarkness( fragment.m_TCoords[i].z, info );
            meshBuilder.Color4ub( c, c, c, c );

            meshBuilder.AdvanceVertex();

            meshBuilder.Index( baseIndex );
            meshBuilder.AdvanceIndex();
            meshBuilder.Index( i + baseIndex + 1 );
            meshBuilder.AdvanceIndex();
            meshBuilder.Index( i + baseIndex + 2 );
            meshBuilder.AdvanceIndex();

#ifdef _DEBUG
            ++triCount;
            ++vertCount;
#endif
        }

        for ( ; i < fragment.m_nVerts; ++i )
        {
            meshBuilder.Position3fv( fragment.m_Verts[i].Base() );

            // Transform + offset the texture coords
            Vector2D texCoord;
            Vector2DMultiply( fragment.m_TCoords[i].AsVector2D(), info.m_TexSize, texCoord );
            texCoord += info.m_TexOrigin;
            meshBuilder.TexCoord2fv( 0, texCoord.Base() );

            unsigned char c = g_pShadowMgr->ComputeDarkness( fragment.m_TCoords[i].z, info );
            meshBuilder.Color4ub( c, c, c, c );

            meshBuilder.AdvanceVertex();

#ifdef _DEBUG
            ++vertCount;
#endif
        }

        baseIndex += fragment.m_nVerts;

        f = s_DispShadowFragments.Next(f);
    }

#ifdef _DEBUG
    Assert( triCount == pShadowDecal->m_nTris );
    Assert( vertCount == pShadowDecal->m_nVerts );
#endif

    return baseIndex;
#else
    return 0;
#endif
}
void CHLSL_Mesh::CreateCylinder( float size, int subdiv )
{
	subdiv /= 2;

	delete [] m_Vertices;
	delete [] m_Triangles;

	int num_verts_u = subdiv + 1;
	int num_verts_v = subdiv + 1;
	int num_verts_side = num_verts_u * num_verts_v;
	int num_verts_top = 1 + num_verts_u - 1;
	m_iNumVertices = num_verts_side + num_verts_top * 2;

	int num_tris_u = (num_verts_u-1);
	int num_tris_v = (num_verts_v-1);
	int num_tris_side = num_tris_u * num_tris_v * 2;
	int num_tris_top = num_tris_u;
	m_iNumTriangles = num_tris_side + num_tris_top * 2;

	m_Vertices = new CHLSL_Vertex[ m_iNumVertices ];
	m_Triangles = new CHLSL_Triangle[ m_iNumTriangles ];

	QAngle rotate( 0, 0, 0 );

	float yaw_step = 360.0f / (num_verts_u-1);
	float up_step = size * 2.0f / (num_verts_v-1);
	float size_radius = size * 0.5f;

	Vector fwd, right, up, pos;

/// verts for side
	for ( int vert_u = 0; vert_u < num_verts_u; vert_u++ )
	{
		AngleVectors( rotate, &fwd, &right, &up );

		pos = up * size + fwd * size_radius;

		for ( int vert_v = 0; vert_v < num_verts_v; vert_v++ )
		{
			int vindex = vert_u * num_verts_v +
				vert_v;

			Assert( vindex < m_iNumVertices );

			CHLSL_Vertex &vert = m_Vertices[ vindex ];

			Q_memcpy( vert.normal, fwd.Base(), sizeof( float ) * 3 );
			Q_memcpy( vert.pos, pos.Base(), sizeof( float ) * 3 );

			vert.uv[0][0] = vert_u / (float)( num_verts_u - 1 );
			vert.uv[0][1] = vert_v / (float)( num_verts_v - 1 );

			pos -= up * up_step;
		}

		rotate.y += yaw_step;
	}

/// verts for top/bottom
	for ( int v_side = 0; v_side < 2; v_side++ )
	{
		rotate.y = 0;
		float sign = (v_side==1) ? -1.0f : 1.0f;

		up.Init( 0, 0, sign );
		Vector height = up * size;

		for ( int v_u = 0; v_u < num_verts_top; v_u++ )
		{
			int vindex = num_verts_side +
				v_side * num_verts_top +
				v_u;

			Assert( vindex < m_iNumVertices );

			CHLSL_Vertex &vert = m_Vertices[ vindex ];

			Vector2D uv;
			Vector pos = height;

			if ( v_u > 0 )
			{
				AngleVectors( rotate, &fwd, NULL, NULL );
				pos += fwd * size_radius;
				uv.x = -sign * fwd.x * 0.5f + 0.5f;
				uv.y = fwd.y * 0.5f + 0.5f;
				rotate.y += yaw_step * sign;
			}
			else
				uv.Init( 0.5f, 0.5f );

			Q_memcpy( vert.pos, pos.Base(), sizeof( float ) * 3 );
			Q_memcpy( vert.normal, up.Base(), sizeof( float ) * 3 );
			Q_memcpy( vert.uv, uv.Base(), sizeof( float ) * 2 );
		}
	}

/// tris for side
	for ( int tri_u = 0; tri_u < num_tris_u; tri_u++ )
	{
		for ( int tri_v = 0; tri_v < num_tris_v; tri_v++ )
		{
			int tri_0 = tri_u * num_tris_v +
				tri_v;
			int tri_1 = tri_0 + num_tris_side / 2;

			Assert( tri_0 < m_iNumTriangles );
			Assert( tri_1 < m_iNumTriangles );

			CHLSL_Triangle &t0 = m_Triangles[ tri_0 ];
			CHLSL_Triangle &t1 = m_Triangles[ tri_1 ];

			int v00 = tri_u * num_verts_v +
				tri_v;
			int v01 = v00 + 1;
			int v10 = (tri_u+1) * num_verts_v +
				tri_v;
			int v11 = v10 + 1;

			Assert( v00 < m_iNumVertices );
			Assert( v01 < m_iNumVertices );
			Assert( v10 < m_iNumVertices );
			Assert( v11 < m_iNumVertices );

			t0.vertices[ 0 ] = &m_Vertices[ v00 ];
			t0.vertices[ 1 ] = &m_Vertices[ v10 ];
			t0.vertices[ 2 ] = &m_Vertices[ v01 ];

			t1.vertices[ 0 ] = &m_Vertices[ v10 ];
			t1.vertices[ 1 ] = &m_Vertices[ v11 ];
			t1.vertices[ 2 ] = &m_Vertices[ v01 ];
		}
	}

/// tris for top
	for ( int dir = 0; dir < 2; dir++ )
	{
		int v_mid = num_verts_side +
			dir * num_verts_top;

		Assert( v_mid < m_iNumVertices );

		for ( int tri_n = 0; tri_n < num_tris_top; tri_n++ )
		{
			int tIndex = num_tris_side +
				dir * num_tris_top +
				tri_n;

			Assert( tIndex < m_iNumTriangles );

			CHLSL_Triangle &t = m_Triangles[ tIndex ];

			int v00 = v_mid + tri_n + 1;
			int v10 = (tri_n < (num_tris_top-1)) ? v00 + 1 : v_mid + 1;

			Assert( v00 < m_iNumVertices );
			Assert( v10 < m_iNumVertices );

			t.vertices[ 0 ] = &m_Vertices[ v00 ];
			t.vertices[ 1 ] = &m_Vertices[ v_mid ];
			t.vertices[ 2 ] = &m_Vertices[ v10 ];
		}
	}


	GenerateTangentSpace();
}