void CCubeTexture::Load() { IDirect3DCubeTexture9* tex; if(D3DXCreateCubeTextureFromFileA(((CD3DRenderer*)g_Renderer)->GetDevice(), mUrl.Name.c_str(), &tex) != S_OK) { LogErrorAlways("Failed to load cube texture data from %s", mUrl.Name.c_str()); throw ResourceException("Resource loading failed"); } mTexture = tex; // Reload params D3DSURFACE_DESC desc; memset(&desc, 0, sizeof(D3DSURFACE_DESC)); HR(tex->GetLevelDesc(0, &desc)); mSurfaceDesc.Width = desc.Width; mSurfaceDesc.Height = desc.Height; mSurfaceDesc.Format = FromDXFormat(desc.Format); mSurfaceDesc.Type = SFC_CUBETEXTURE; }
HRESULT InitScene() { HRESULT hr; SetWindowText(hwnd, TITLE); MYVALID(D3DXLoadMeshFromX("../media/meshes/sky.X", D3DXMESH_MANAGED, device, NULL, NULL, NULL, NULL, &skymesh)); MYVALID(D3DXLoadMeshFromX("../media/meshes/box.X", D3DXMESH_MANAGED, device, NULL, NULL, NULL, NULL, &mesh)); MYVALID(D3DXCreateTextureFromFileA(device, "../media/textures/fire.png", &texture1)); MYVALID(D3DXCreateTextureFromFileA(device, "../media/textures/stones.jpg", &texture2)); MYVALID(D3DXCreateCubeTextureFromFileA(device, "../media/textures/sky4.dds", &skytex)); MYVALID(device->CreateTexture(512, 512, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &text, NULL)); MYVALID(DXCreateEffect("../media/shaders/skinning.fx", device, &effect)); MYVALID(DXCreateEffect("../media/shaders/sky.fx", device, &skyeffect)); system1.Initialize(device, 500); system1.ParticleTexture = texture1; // load dwarfs dwarfs[0].Effect = effect; dwarfs[0].Method = SM_Shader; dwarfs[0].Path = "../media/meshes/dwarf/"; MYVALID(dwarfs[0].Load(device, "../media/meshes/dwarf/dwarf.X")); dwarfs[0].Clone(dwarfs[1]); dwarfs[0].Clone(dwarfs[2]); dwarfs[0].Clone(dwarfs[3]); dwarfs[0].Clone(dwarfs[4]); dwarfs[0].Clone(dwarfs[5]); D3DXVECTOR3 scale(0.1f, 0.1f, 0.1f); D3DXVECTOR3 trans; D3DXQUATERNION rot; // dwarf 0 trans = D3DXVECTOR3(-1, 0, 1); D3DXQuaternionRotationYawPitchRoll(&rot, -0.785f, 0, 0); D3DXMatrixTransformation(&dwarfmatrices[0], NULL, NULL, &scale, NULL, &rot, &trans); // dwarf 1 trans = D3DXVECTOR3(-1, 0, -1); D3DXQuaternionRotationYawPitchRoll(&rot, -2.356f, 0, 0); D3DXMatrixTransformation(&dwarfmatrices[1], NULL, NULL, &scale, NULL, &rot, &trans); // dwarf 2 trans = D3DXVECTOR3(1, 0, -1); D3DXQuaternionRotationYawPitchRoll(&rot, 2.356f, 0, 0); D3DXMatrixTransformation(&dwarfmatrices[2], NULL, NULL, &scale, NULL, &rot, &trans); // dwarf 3 trans = D3DXVECTOR3(1, 0, 1); D3DXQuaternionRotationYawPitchRoll(&rot, 0.785f, 0, 0); D3DXMatrixTransformation(&dwarfmatrices[3], NULL, NULL, &scale, NULL, &rot, &trans); // dwarf 4 trans = D3DXVECTOR3(-0.2f, 0, -0.2f); D3DXQuaternionRotationYawPitchRoll(&rot, -1.57f, 0, 0); D3DXMatrixTransformation(&dwarfmatrices[4], NULL, NULL, &scale, NULL, &rot, &trans); // dwarf 5 trans = D3DXVECTOR3(0.2f, 0, 0); D3DXQuaternionRotationYawPitchRoll(&rot, -1.57f, 0, 0); D3DXMatrixTransformation(&dwarfmatrices[5], NULL, NULL, &scale, NULL, &rot, &trans); // skins DwarfSkin(0, 1, 1, 3, 1, 1, 3, 0); DwarfSkin(1, 2, 0, 1, 3, 3, 1, 1); DwarfSkin(2, 3, 2, 2, 2, 1, 2, 3); DwarfSkin(3, 1, 3, 2, 1, 3, 0, 2); DwarfSkin(4, 1, 1, 3, 3, 2, 2, 1); DwarfSkin(5, 0, 0, 1, 2, 3, 0, 1); // 0, 1, 2 - dead // 3, 5 - stand // 4 - jump // 6 - cheer with weapon // 7 - cheer with one hand // 8 - cheer with both hands dwarfs[0].SetAnimation(6); dwarfs[1].SetAnimation(8); dwarfs[2].SetAnimation(7); dwarfs[3].SetAnimation(4); dwarfs[4].SetAnimation(2); dwarfs[5].SetAnimation(1); // other device->SetRenderState(D3DRS_LIGHTING, false); device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); DXRenderText(HELP_TEXT, text, 512, 512); cameraangle = D3DXVECTOR2(0.785f, 0.785f); // sound if( SUCCEEDED(InitXAudio2()) ) { firesound = streamer.LoadSound(xaudio2, "../media/sound/fire.ogg"); // create streaming thread and load music worker.Attach<AudioStreamer>(&streamer, &AudioStreamer::Update); worker.Start(); music = streamer.LoadSoundStream(xaudio2, "../media/sound/painkiller.ogg"); } if( music ) { music->GetVoice()->SetVolume(4); music->Play(); } if( firesound ) { firesound->GetVoice()->SetVolume(0.7f); firesound->Play(); } return S_OK; }
bool CAXModel::Load(const char* strFileName) { this->Unload(); m_strFile = strFileName; LPD3DXBUFFER pAdjacencyBuffer = NULL; LPD3DXBUFFER pMtrlBuffer = NULL; if (FAILED(D3DXLoadMeshFromXA(m_strFile.c_str(), D3DXMESH_MANAGED, APROJECT_WINDOW->GetD3DDevice(), &pAdjacencyBuffer, &pMtrlBuffer, NULL, &m_dwNumMaterials, &m_pMeshObject))) return false; // Optimize the mesh for performance if (FAILED(m_pMeshObject->OptimizeInplace(D3DXMESHOPT_COMPACT | D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_VERTEXCACHE, (DWORD*)pAdjacencyBuffer->GetBufferPointer(), NULL, NULL, NULL))) { SAFE_RELEASE(pAdjacencyBuffer); SAFE_RELEASE(pMtrlBuffer); return false; } D3DXMATERIAL* d3dxMtrls = (D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer(); do { if (d3dxMtrls && m_dwNumMaterials > 0) { // Allocate memory for the materials and textures m_pMaterials = new D3DMATERIAL9[m_dwNumMaterials]; if (m_pMaterials == NULL) break; m_pTextures = new LPDIRECT3DBASETEXTURE9[m_dwNumMaterials]; if (m_pTextures == NULL) break; m_strMaterials = new CHAR[m_dwNumMaterials][MAX_PATH]; if (m_strMaterials == NULL) break; // Copy each material and create its texture for (DWORD i = 0; i < m_dwNumMaterials; i++) { // Copy the material m_pMaterials[i] = d3dxMtrls[i].MatD3D; m_pTextures[i] = NULL; // Create a texture if (d3dxMtrls[i].pTextureFilename) { strcpy_s(m_strMaterials[i], MAX_PATH, d3dxMtrls[i].pTextureFilename); CHAR strTexture[MAX_PATH]; D3DXIMAGE_INFO ImgInfo; // First attempt to look for texture in the same folder as the input folder. int p = 0; strcpy_s(strTexture, MAX_PATH, m_strFile.c_str()); for (DWORD j = 0; j < strlen(strTexture); j++) { if (strTexture[j] == '/') p = j; } strTexture[p + 1] = 0; strcat_s(strTexture, MAX_PATH, d3dxMtrls[i].pTextureFilename); // Inspect the texture file to determine the texture type. if (FAILED(D3DXGetImageInfoFromFileA(strTexture, &ImgInfo))) continue; // Call the appropriate loader according to the texture type. switch (ImgInfo.ResourceType) { case D3DRTYPE_TEXTURE: { IDirect3DTexture9* pTex; if (SUCCEEDED(D3DXCreateTextureFromFileA(APROJECT_WINDOW->GetD3DDevice(), strTexture, &pTex))) { pTex->QueryInterface(IID_IDirect3DBaseTexture9, (LPVOID*)&m_pTextures[i]); pTex->Release(); } break; } case D3DRTYPE_CUBETEXTURE: { IDirect3DCubeTexture9* pTex; if (SUCCEEDED(D3DXCreateCubeTextureFromFileA(APROJECT_WINDOW->GetD3DDevice(), strTexture, &pTex))) { pTex->QueryInterface(IID_IDirect3DBaseTexture9, (LPVOID*)&m_pTextures[i]); pTex->Release(); } break; } case D3DRTYPE_VOLUMETEXTURE: { IDirect3DVolumeTexture9* pTex; if (SUCCEEDED(D3DXCreateVolumeTextureFromFileA(APROJECT_WINDOW->GetD3DDevice(), strTexture, &pTex))) { pTex->QueryInterface(IID_IDirect3DBaseTexture9, (LPVOID*)&m_pTextures[i]); pTex->Release(); } break; } } } } } } while (0); // Extract data from m_pMesh for easy access D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE]; m_dwNumVertices = m_pMeshObject->GetNumVertices(); m_dwNumFaces = m_pMeshObject->GetNumFaces(); m_dwBytesPerVertex = m_pMeshObject->GetNumBytesPerVertex(); m_pMeshObject->GetIndexBuffer(&m_pIB); m_pMeshObject->GetVertexBuffer(&m_pVB); m_pMeshObject->GetDeclaration(decl); APROJECT_WINDOW->GetD3DDevice()->CreateVertexDeclaration(decl, &m_pDecl); SAFE_RELEASE(pAdjacencyBuffer); SAFE_RELEASE(pMtrlBuffer); return true; }
HRESULT InitScene() { HRESULT hr; D3DCAPS9 caps; SetWindowText(hwnd, TITLE); device->GetDeviceCaps(&caps); if( caps.VertexShaderVersion < D3DVS_VERSION(2, 0) || caps.PixelShaderVersion < D3DPS_VERSION(2, 0) ) { MYERROR("This demo requires Shader Model 2.0 capable video card"); return E_FAIL; } palm = new DXObject(device); sandplane = new DXObject(device); waterplane = new DXObject(device); if( !palm->Load("../media/meshes/palm.qm") ) { MYERROR("Could not load palm"); return E_FAIL; } if( !sandplane->CreatePlane(50, 50, 10, 10) ) { MYERROR("Could not create sand plane"); return E_FAIL; } if( !waterplane->CreatePlane(50, 50, 5, 5) ) { MYERROR("Could not create water plane"); return E_FAIL; } waterplane->GenerateTangentFrame(); MYVALID(D3DXLoadMeshFromXA("../media/meshes/sky.X", D3DXMESH_MANAGED, device, NULL, NULL, NULL, NULL, &skymesh)); MYVALID(D3DXCreateCubeTextureFromFileA(device, "../media/textures/sky7.dds", &skytex)); MYVALID(D3DXCreateTextureFromFileA(device, "../media/textures/bark.jpg", &bark)); MYVALID(D3DXCreateTextureFromFileA(device, "../media/textures/leaf.jpg", &leaves)); MYVALID(D3DXCreateTextureFromFileA(device, "../media/textures/sand.jpg", &sand)); MYVALID(D3DXCreateTextureFromFileA(device, "../media/textures/wave2.png", &waves)); MYVALID(DXCreateEffect("../media/shaders/ambient.fx", device, &ambient)); MYVALID(DXCreateEffect("../media/shaders/blinnphong.fx", device, &specular)); MYVALID(DXCreateEffect("../media/shaders/water.fx", device, &water)); MYVALID(DXCreateEffect("../media/shaders/simplebloom.fx", device, &bloom)); MYVALID(DXCreateEffect("../media/shaders/godray.fx", device, &godray)); MYVALID(DXCreateEffect("../media/shaders/sky.fx", device, &skyeffect)); MYVALID(device->CreateTexture(screenwidth, screenheight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &refraction, NULL)); MYVALID(device->CreateTexture(screenwidth, screenheight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &reflection, NULL)); MYVALID(device->CreateTexture(screenwidth, screenheight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8, D3DPOOL_DEFAULT, &occluders, NULL)); MYVALID(device->CreateTexture(screenwidth, screenheight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8, D3DPOOL_DEFAULT, &blurtex, NULL)); MYVALID(device->CreateTexture(screenwidth, screenheight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &sceneldr, NULL)); MYVALID(device->CreateTexture(screenwidth / 2, screenheight / 2, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &bloomtex1, NULL)); MYVALID(device->CreateTexture(screenwidth / 2, screenheight / 2, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &bloomtex2, NULL)); refraction->GetSurfaceLevel(0, &refractsurf); reflection->GetSurfaceLevel(0, &reflectsurf); occluders->GetSurfaceLevel(0, &occludersurf); blurtex->GetSurfaceLevel(0, &blursurf); sceneldr->GetSurfaceLevel(0, &sceneldrsurf); bloomtex1->GetSurfaceLevel(0, &bloomsurf1); bloomtex2->GetSurfaceLevel(0, &bloomsurf2); D3DVERTEXELEMENT9 elem[] = { { 0, 0, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITIONT, 0 }, { 0, 16, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, D3DDECL_END() }; MYVALID(device->CreateVertexDeclaration(elem, &quaddecl)); cameraangle = D3DXVECTOR2(-1.13f * D3DX_PI, 0.55f); return S_OK; }