예제 #1
0
파일: Sky.cpp 프로젝트: jcrm/DX
void Sky::init(ID3D10Device* device, ID3D10ShaderResourceView* cubemap, float radius){
	md3dDevice = device;
	mCubeMap   = cubemap;
	mVertexType = 1;

	mTech			= fx::SkyFX->GetTechniqueByName("SkyTech");
	mfxWVPVar		= fx::SkyFX->GetVariableByName("gWVP")->AsMatrix();
	mfxWorldVar		= fx::SkyFX->GetVariableByName("gWorld")->AsMatrix();
	mfxCubeMapVar	= fx::SkyFX->GetVariableByName("gCubeMap")->AsShaderResource();

	std::vector<D3DXVECTOR3> vertices;
	IndexList indices;

	BuildGeoSphere(2, radius, vertices, indices);

	VertexList skyVerts(vertices.size());
	for(size_t i = 0; i < vertices.size(); ++i){
		// Scale on y-axis to turn into an ellipsoid to make a flatter Sky surface
		skyVerts[i].pos = 0.5f*vertices[i];
	}
	mNumVertices = skyVerts.size();
	GfxObj::buildVB(skyVerts);

	mNumIndices = (UINT)indices.size();
	mNumFaces = mNumIndices*3;

	GfxObj::buildIB(indices);
}
예제 #2
0
void Sky::Init(std::wstring SkySrcName, float Radius)
{
	mSrcName = SkySrcName;
	mRadius = Radius;

	//Mesh Creation
	std::vector<D3DXVECTOR3> Vertices;
	std::vector<UINT>		 Indices;

	BuildGeoSphere(5, mRadius, Vertices, Indices);

	UINT NumVertices = Vertices.size();
	UINT NumIndices  = Indices.size();
	UINT NumFaces	 = NumIndices / 3;

	SkyVertex* MeshVertices = new SkyVertex[NumVertices];
	DWORD*	   MeshIndices  = new DWORD[NumIndices];
	UINT*	   MeshAtr		= new UINT[NumFaces];

	for(size_t i = 0; i < NumVertices; i++)
		MeshVertices[i].Pos = Vertices[i];

	for(size_t i = 0; i < NumIndices; i++)
		MeshIndices[i] = (DWORD)Indices[i];

	for(size_t i = 0; i < NumFaces; i++)
		MeshAtr[i] = 0;

	D3D10_INPUT_ELEMENT_DESC VertexDesc[] =
	{
		{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, 
		D3D10_INPUT_PER_VERTEX_DATA, 0}
	};

	HR(D3DX10CreateMesh(gd3dDev, VertexDesc, 1, "POSITION", NumVertices, 
		NumFaces, D3DX10_MESH_32_BIT, &mSphere));

	HR(mSphere->SetVertexData(0, MeshVertices));
	HR(mSphere->SetIndexData(MeshIndices, NumIndices));
	HR(mSphere->SetAttributeData(MeshAtr));

	HR(mSphere->GenerateAdjacencyAndPointReps(0.001f));
	HR(mSphere->Optimize(D3DX10_MESHOPT_ATTR_SORT | D3DX10_MESHOPT_VERTEX_CACHE, 
		0, 0));
	HR(mSphere->CommitToDevice());

	delete[] MeshVertices;
	delete[] MeshIndices;
	delete[] MeshAtr;

	//FX Handles
	mfxSkyTech = FX::SkyFX->GetTechniqueByName("SkyTech");
	mfxSkyWVP  = FX::SkyFX->GetVariableByName("gSkyWVP")->AsMatrix();
	mfxCubeTex = FX::SkyFX->GetVariableByName("gCubeTex")->AsShaderResource();

	//Cube Texture
	mCubeTexSRV = GetTexManager().CreateCubeTexure(mSrcName);
}
예제 #3
0
파일: Sky.cpp 프로젝트: JSybrandt/BREAKOUT
void Sky::init(ID3D10Device* device, BREAKOUT* g, float radius)
{
	md3dDevice = device;

	HR(D3DX10CreateShaderResourceViewFromFile(device, 
		L".\\textures\\BackgroundCube.dds", 0, 0, &mCubeMap, 0 ));

	game = g;

	mTech         = g->skyFX->GetTechniqueByName("SkyTech");
	mfxWVPVar     = g->skyFX->GetVariableByName("gWVP")->AsMatrix();
	mfxCubeMapVar = g->skyFX->GetVariableByName("gCubeMap")->AsShaderResource();


	std::vector<D3DXVECTOR3> vertices;
	std::vector<DWORD> indices;

	BuildGeoSphere(2, radius, vertices, indices);

	std::vector<SkyVertex> skyVerts(vertices.size());
	for(size_t i = 0; i < vertices.size(); ++i)
	{
		// Scale on y-axis to turn into an ellipsoid to make a flatter Sky surface
		skyVerts[i].pos = 0.5f*vertices[i];
	}

	D3D10_BUFFER_DESC vbd;
    vbd.Usage = D3D10_USAGE_IMMUTABLE;
	vbd.ByteWidth = sizeof(SkyVertex) * (UINT)skyVerts.size();
    vbd.BindFlags = D3D10_BIND_VERTEX_BUFFER;
    vbd.CPUAccessFlags = 0;
    vbd.MiscFlags = 0;
    D3D10_SUBRESOURCE_DATA vinitData;
    vinitData.pSysMem = &skyVerts[0];
    HR(md3dDevice->CreateBuffer(&vbd, &vinitData, &mVB));

	mNumIndices = (UINT)indices.size();

	D3D10_BUFFER_DESC ibd;
    ibd.Usage = D3D10_USAGE_IMMUTABLE;
	ibd.ByteWidth = sizeof(DWORD) * mNumIndices;
    ibd.BindFlags = D3D10_BIND_INDEX_BUFFER;
    ibd.CPUAccessFlags = 0;
    ibd.MiscFlags = 0;
    D3D10_SUBRESOURCE_DATA iinitData;
    iinitData.pSysMem = &indices[0];
    HR(md3dDevice->CreateBuffer(&ibd, &iinitData, &mIB));
}