コード例 #1
0
ファイル: ShaderLoader.cpp プロジェクト: wolves3d/idea
EResult CompileShader(
	const char *	szFileName,
	const char *	szSource,
	const char *	szEntryPoint,
	const char *	szProfile,
	ID3D10Blob **	ppShaderByteCode )
{
	if ( ( NULL == szFileName ) || ( NULL == szSource ) || ( NULL == ppShaderByteCode ) )
		return R_INVALID_ARG;

	size_t nSize = strlen( szSource );

	if ( 0 == nSize )
		return R_INVALID_ARG;

	ID3D10Blob * pErrorMsg = NULL;

	HRESULT hRes = D3D10CompileShader(
		szSource,			// file data
		nSize,				// file data size
		NULL,				// file name (set to null if prev args not null)
		NULL,				// macro array (defines)
		NULL,				// ? include
		szEntryPoint,
		szProfile,
		0,					// shader compile flags
		ppShaderByteCode,	
		&pErrorMsg );

	if ( FAILED( hRes ) )
	{
		if ( NULL != pErrorMsg )
		{
			const char * szErr = Va(
				"\tShader compilation failed, file \"%s\"\n\t\t%s",
				szFileName, (const char *)pErrorMsg->GetBufferPointer() );

			SysWrite( szErr );
			DEBUG_MSG( szErr );
		}

		return R_GENERIC_ERROR;
	}

	return R_OK;
}
コード例 #2
0
float Ship::Cth(){
	return (8./PI()) * Tprop() / (1.025 * pow(Va() * Dprop(), 2.));
}
コード例 #3
0
ファイル: ShaderConfig.cpp プロジェクト: wolves3d/idea
void CShaderCfgLoader::FinalizeRes( TResource * pRes )
{
	pRes->eState = TResource::FAILED;

	//--------------------------------------------------------------------------
	// Tip: Check XMLWrapper
	//--------------------------------------------------------------------------
	IXMLWrapper * pWrapper = (IXMLWrapper *)g_pSystem->GetInterface( IT_UTIL );

	if ( !pWrapper )
		return;

	CXMLElement * pRoot = NULL;
	pWrapper->LoadXMLFromMem( (char *)pRes->pBuffer, pRes->nSize, &pRoot );
	DEL_ARRAY( pRes->pBuffer );
	//pRes->pResource = pRoot;

	//--------------------------------------------------------------------------
	// Tip: Check root element name
	//--------------------------------------------------------------------------
	CStr sName( pRoot->GetName() );

	if ( !sName.Compare( "Shaders" ) )
	{
		DEL( pRoot );
		return;
	}

	//--------------------------------------------------------------------------
	// Tip: Parsing shaders
	//--------------------------------------------------------------------------
	for ( size_t i = 0; i < pRoot->GetNumChilds(); ++i )
	{
		//----------------------------------------------------------------------
		// Tip: New shader
		//----------------------------------------------------------------------
		CXMLElement * pShaderBranch = pRoot->GetChild( i );
		CStr sPath( "Shaders/" );
		sPath.Add( pShaderBranch->GetName() );

//		const CStr		sShader( pShaderBranch->GetName() );
//		CBaseShader	*	pShader	= NEW CBaseShader( sShader.GetString() );
//		CXMLAttr *		pProgPath = pShaderBranch->GetAttr( "ProgramPath" );
//		CStr			sProgPath( pProgPath->GetValue() );

		SysWrite( Va( "\tshader %s", pShaderBranch->GetName() ) );

		IVertexDecl *	pDecl = NULL;
		TUniform	*	pUniforms = NULL;
		uint			nUnfmCount = 0;

		//----------------------------------------------------------------------
		// Tip: Parse shader data
		//----------------------------------------------------------------------
		for ( size_t j = 0; j < pShaderBranch->GetNumChilds(); ++j )
		{
			CXMLElement *	pStruct = pShaderBranch->GetChild( j );
			const CStr		sStruct( pStruct->GetName() );

			if ( sStruct.Compare( "VertexFormat" ) )
			{
				pDecl = ParseVertexFormat( pStruct );
			}
			else if ( sStruct.Compare( "Constants" ) )
			{
/*
				pShader->m_nUniformCount	= 1;
				pShader->m_pUniforms		= NEW CBaseShader::TUniform [ pShader->m_nUniformCount ];

				pShader->m_pUniforms[ 0 ].sName	= "vColorMod";
				pShader->m_pUniforms[ 0 ].eType	= TYPE_VEC4;
				pShader->m_pUniforms[ 0 ].nLoc	= pShader->GetUniformLoc( pShader->m_pUniforms[ 0 ].sName );
				pShader->m_pUniforms[ 0 ].nCount	= 1;

				m_ppShaders[ UI_SHADER ] = pShader;
*/
				nUnfmCount = ParseConstants( pStruct, &pUniforms );
				//pShader->ParseMaps( pStruct );
			}
		}

		g_pRenderer->CreateShader( sPath.GetString(), pDecl, pUniforms, nUnfmCount );
	}

	DEL( pRoot );

	pRes->eState = TResource::LOADED;
}
コード例 #4
0
ファイル: Shader.cpp プロジェクト: wolves3d/idea
bool CRendererD3D::CreateShader( const char * szPath, IVertexDecl * pDecl, TUniform * pUnfms, uint nUnfmCount )
{
		TResource * pShaderRes  = NULL;

	g_pResManager->Request( Va( "%s/hlsl.vsh", szPath ), &pShaderRes );
	g_pResManager->Request( Va( "%s/hlsl.psh", szPath ), &pShaderRes );

	uint			nConstBufferSize = 96;

	CShader * pShader = static_cast<CShader *>( pShaderRes->pResource );



	// Tip: Create our vertex input layout ---------------------------------

	const D3D10_INPUT_ELEMENT_DESC layout_ui[] =
	{
		{ "POSITION",	0, DXGI_FORMAT_R32G32_FLOAT, 0, 0,  D3D10_INPUT_PER_VERTEX_DATA, 0 },
		{ "TEXCOORD",	0, DXGI_FORMAT_R32G32_FLOAT, 0, 8,  D3D10_INPUT_PER_VERTEX_DATA, 0 },
//		{ "COLOR",		0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 16,  D3D10_INPUT_PER_VERTEX_DATA, 0 },
	};

	const D3D10_INPUT_ELEMENT_DESC layout_line[] =
	{
		{ "POSITION",  0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0,  D3D10_INPUT_PER_VERTEX_DATA, 0 },
		{ "COLOR",  0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12,  D3D10_INPUT_PER_VERTEX_DATA, 0 },
	};

	/*
	D3D10_INPUT_ELEMENT_DESC * pLayout = NEW D3D10_INPUT_ELEMENT_DESC [ pDecl->GetAttrCount() ];

	for ( uint n = 0; n < pDecl->GetAttrCount(); ++n )
	{
		TVertexAttr * pAttr = pDecl->GetAttr();
		pLayout[ n ].SemanticName = pAttr->szName
	}*/

	const D3D10_INPUT_ELEMENT_DESC * pLay = NULL;
	uint nCount = 0;

	if ( CStr::FinishWith( szPath, "UI" ) )
	{
		pLay = layout_ui;
		nCount = 2;
	}
	else if ( CStr::FinishWith( szPath, "Line" ) )
	{
		pLay = layout_line;
		nCount = 2;
	}

	if ( pLay )
	{
		HRESULT hRes = g_pDevice->CreateInputLayout(
			pLay,
			nCount,
			pShader->m_pByteCodeVS->GetBufferPointer(),
			pShader->m_pByteCodeVS->GetBufferSize(),
			&pShader->m_pLayout );

		if ( FAILED( hRes ) )
		{
			return false; // fixme
		}
	}

	g_pDevice->IASetInputLayout	( pShader->m_pLayout );

	pShader->m_pVDecl = pDecl;

	//----------------------------------------------------------------


	g_pDevice->VSSetShader		( pShader->m_pVS );
	g_pDevice->GSSetShader		( NULL );
	g_pDevice->PSSetShader		( pShader->m_pPS );

	pShader->m_ppConstBuffers = NEW ID3D10Buffer * [ 1 ];

	D3D10_BUFFER_DESC bd;
	ZeroMemory( &bd, sizeof( D3D10_BUFFER_DESC ) );
	bd.Usage			= D3D10_USAGE_DYNAMIC;
	bd.ByteWidth		= nConstBufferSize;
	bd.BindFlags		= D3D10_BIND_CONSTANT_BUFFER;
	bd.CPUAccessFlags	= D3D10_CPU_ACCESS_WRITE ; // set 0 to setup data at alloc only
	bd.MiscFlags		= 0;
	g_pDevice->CreateBuffer( &bd, NULL, pShader->m_ppConstBuffers );

	g_pDevice->VSSetConstantBuffers( 0, 1, pShader->m_ppConstBuffers );

	//--------------------------------

	pShader->m_sName.Set( szPath + CStr::GetSize( "Shaders" ) );
	m_ShaderList.Add( pShader );

	return true;
}
コード例 #5
0
ファイル: ModelLoader.cpp プロジェクト: wolves3d/idea
void CModel::LoadObjects( const char * szFile )
{
    const int nFileVer = 1;

    IFile * pFile;

    if ( R_OK != g_pVfs->OpenFile( &pFile, szFile,  VFS_BINARY | VFS_READ ) )
    {
        SysWrite( Va( "Failed to open model file \"%s\"", szFile ) );
        return;
    }


    TModelFileHdr tFileHdr;

    //--------------------------------------------------------------------------
    // Tip: Читаем заголовок MODEL файла
    //--------------------------------------------------------------------------
    if ( !g_pVfs->CheckRead( pFile, &tFileHdr, sizeof( TModelFileHdr ) ) )
    {
        // invalid file
        goto error_label;
    }

    if (	/*( 0 != strcmp( "MDL ", (char *)&tFileHdr.nSign ) ) ||*/
        ( 0 == tFileHdr.nNumObjects ) ||
        ( nFileVer != tFileHdr.nVersion ) ||
        ( sizeof( TModelFileHdr ) != tFileHdr.nHeaderSize ) )
    {
        // invalid file or no objects
        goto error_label;
    }

    m_nNumObjects	= tFileHdr.nNumObjects;
    m_pObjects		= NEW CObject [ m_nNumObjects ];

    if ( NULL == m_pObjects )
        goto error_label;

    //--------------------------------------------------------------------------
    // Tip: Читаем mesh
    //--------------------------------------------------------------------------
    {
        TObjectHdr tMeshHdr;
        g_pVfs->Read( pFile, &tMeshHdr, sizeof( TObjectHdr ) );
    }

    m_pShape = g_pEngine->CreateMesh();
    m_pShape->LoadFromStream( pFile );

    m_pBoneMatrices	= NEW mat4[ m_nNumObjects ];

    //--------------------------------------------------------------------------
    // Tip: Читаем объекты
    //--------------------------------------------------------------------------
    for ( uint nObj = 0; nObj < m_nNumObjects; ++nObj )
    {
        TObjectHdr tObjHdr;
        CObject * pObject = m_pObjects + nObj;

        // Читаем заголовок объекта
        if ( sizeof ( TObjectHdr ) != g_pVfs->Read( pFile, &tObjHdr, sizeof( TObjectHdr ) ) )
        {
            goto error_label;
        }

        pObject->SetParentName( tObjHdr.szParent );
        pObject->SetName( tObjHdr.szName );
        pObject->SetScale( tObjHdr.vScale );
        pObject->SetPos( tObjHdr.vPos );
        pObject->SetRot( tObjHdr.qRot );

        ////////////////////////////////////////////////////////////////////////

        /*switch ( tObjHdr.eType )
        {
        	default:
        	{
        		g_pVfs->Seek( pFile, tObjHdr.nShapeBlockSize, VFS_SEEK_CUR );
        		continue;
        	}
        }*/
    }

    RebuildHierarchy();
    g_pVfs->CloseFile( &pFile );
    return;

    //--------------------------------------------------------------------------
    // Tip: Поведение кода в случае ошибки при разборе файла
    //--------------------------------------------------------------------------
error_label:

    m_nNumObjects = 0;
    g_pVfs->CloseFile( &pFile );
}