コード例 #1
0
    i32 CreateRect2D(Resources::CMesh* pMesh, const IInputLayout* pIL, const SRect2DOptions& Opts)
    {
        Vec3 vecScale( 100 ); 
        Vec2 vecWidth( 0, 100 );
        Vec2 vecHeight( 0, 100 );

        IndexBufferPtr pIB = pMesh->CreateIndexBuffer();
        VertexBufferPtr pVB = pMesh->CreateVertexBuffer();

        pVB->SetVertexCount( 4 );
        pVB->SetInputLayout( pIL );
        pVB->SetTopologyType( TopologyTypes::TRIANGLE_LIST );
        pVB->SetUsage( Opts.eUsage );

        pIB->SetIndexCount( 6 );
        pIB->SetUsage( BufferUsages::STATIC );

        pVB->Lock();
        CVertexData& VData = pVB->GetVertexData();

        if( pIL->IsPosition() )
        {
            VData.SetPosition( 0, Vec3( 0,			0,				0 ) );
            VData.SetPosition( 1, Vec3( vecScale.x, 0,				0 ) );
            VData.SetPosition( 2, Vec3( vecScale.x, -vecScale.y,	0 ) );
            VData.SetPosition( 3, Vec3( 0,			-vecScale.y,	0) );
        }

        if( pIL->IsColor() )
        {
            VData.SetColor( 0, Vec4( 1, 1, 1, 1 ) );
            VData.SetColor( 1, Vec4( 1, 1, 1, 1 ) );
            VData.SetColor( 2, Vec4( 1, 1, 1, 1 ) );
            VData.SetColor( 3, Vec4( 1, 1, 1, 1 ) );
        }

        if( pIL->IsTexCoord0() )
        {
            VData.SetTexCoord( 0, 0, Vec2( 0, 1 ) );
            VData.SetTexCoord( 1, 0, Vec2( 1, 1 ) );
            VData.SetTexCoord( 2, 0, Vec2( 0, 1 ) );
            VData.SetTexCoord( 3, 0, Vec2( 0, 0 ) );
        }

        pVB->Unlock();
        pVB->Create();

        pIB->Lock();
        CIndexData& IData = pIB->GetIndexData();

        IData.SetTriangle( 0, 0, 2, 3 );
        IData.SetTriangle( 1, 1, 2, 0 );

        return XST_OK;
    }
コード例 #2
0
ファイル: cMap.cpp プロジェクト: serment7/WuwaFantasy
cMap::cMap(const std::string& _rawpath, const std::string& _texturepath)
{
	ZeroMemory(&m_stMtl, sizeof(D3DMATERIAL9));
	m_stMtl.Ambient = m_stMtl.Diffuse = m_stMtl.Specular = D3DXCOLOR(0.7f, 0.7f, 0.7f, 1.0f);

	SAFE_RELEASE(m_pMesh);
	SAFE_RELEASE(m_pTexture);

	FILE* fp = NULL;
	std::string fullpath = MAP_PATH.substr() + _rawpath.substr();
	std::string texturepath= MAP_PATH.substr() + _texturepath.substr();
	fopen_s(&fp, fullpath.c_str(), "rb");

	m_pTexture = g_pTextureManager->GetTexture(texturepath);

	fseek(fp, 0, SEEK_END);
	int nFileSize = ftell(fp);
	fseek(fp, 0, SEEK_SET);
	int nPixel = nFileSize / m_nBytePerPixel;
	int nHPixel = (int)sqrt((float)nPixel + EPSILON);
	//assert(nHPixel * nHPixel == nPixel && "정사각 형태의 raw파일만 사용 가능함");

	m_nHPixel = nHPixel;

	std::vector<BYTE> vecHeight(nPixel*nHPixel);

	for (int i = 0; i < nPixel; ++i)
	{
		vecHeight[i] = (BYTE)fgetc(fp);
		if (m_nBytePerPixel > 1)
		{
			fseek(fp, m_nBytePerPixel - 1, SEEK_CUR);
		}
	}

	int nTileN = nHPixel - 1;

	m_vecVertex.resize(nPixel);
	for (int z = 0; z < nHPixel; ++z)
	{
		for (int x = 0; x < nHPixel; ++x)
		{
			int i = z * nHPixel + x;

			ST_PNT_VERTEX v;
			v.p = D3DXVECTOR3((float)x, vecHeight[i], (float)z);
			v.u = x / (float)nTileN;
			v.v = z / (float)nTileN;
			v.n = D3DXVECTOR3(0, 1, 0);

			m_vecVertex[i] = v;
		}
	}

	for (int z = 1; z < nTileN; ++z)
	{
		for (int x = 1; x < nTileN; ++x)
		{
			int i = z * nHPixel + x;
			int l = i - 1;
			int r = i + 1;
			int u = i + nHPixel;
			int d = i - nHPixel;

			D3DXVECTOR3 lr = m_vecVertex[r].p - m_vecVertex[l].p;
			D3DXVECTOR3 du = m_vecVertex[u].p - m_vecVertex[d].p;
			D3DXVECTOR3 n;
			D3DXVec3Cross(&n, &du, &lr);
			D3DXVec3Normalize(&n, &n);
			m_vecVertex[i].n = n;
		}
	}

	// 1--3
	// |\ |
	// | \|
	// 0--2
	std::vector<DWORD> vecIndex;
	vecIndex.reserve(nTileN * nTileN * 3 * 2);

	for (int z = 0; z < nTileN; ++z)
	{
		for (int x = 0; x < nTileN; ++x)
		{
			int _0 = (z + 0) * nHPixel + x;
			int _1 = (z + 1) * nHPixel + x;
			int _2 = (z + 0) * nHPixel + x + 1;
			int _3 = (z + 1) * nHPixel + x + 1;
			vecIndex.push_back(_0); vecIndex.push_back(_1); vecIndex.push_back(_2);
			vecIndex.push_back(_3); vecIndex.push_back(_2); vecIndex.push_back(_1);
		}
	}


	D3DXCreateMeshFVF(vecIndex.size() / 3,
		m_vecVertex.size(),
		D3DXMESH_MANAGED | D3DXMESH_32BIT,
		ST_PNT_VERTEX::FVF,
		g_pD3DDevice,
		&m_pMesh);

	ST_PNT_VERTEX* pV = NULL;
	m_pMesh->LockVertexBuffer(0, (LPVOID*)&pV);
	memcpy(pV, &m_vecVertex[0], sizeof(ST_PNT_VERTEX) * m_vecVertex.size());
	m_pMesh->UnlockVertexBuffer();

	DWORD* pI = NULL;
	m_pMesh->LockIndexBuffer(0, (LPVOID*)&pI);
	memcpy(pI, &vecIndex[0], sizeof(DWORD) * vecIndex.size());
	m_pMesh->UnlockIndexBuffer();

	DWORD* pA = NULL;
	m_pMesh->LockAttributeBuffer(0, &pA);
	ZeroMemory(pA, sizeof(DWORD) * m_pMesh->GetNumFaces());
	m_pMesh->UnlockAttributeBuffer();

	std::vector<DWORD> vecAdjBuf(m_pMesh->GetNumFaces() * 3);
	m_pMesh->GenerateAdjacency(0.0f, &vecAdjBuf[0]);

	m_pMesh->OptimizeInplace(
		D3DXMESHOPT_ATTRSORT |
		D3DXMESHOPT_COMPACT |
		D3DXMESHOPT_VERTEXCACHE,
		&vecAdjBuf[0],
		0, 0, 0);

	fclose(fp);
}