void NVUTCamera::SetProjParams(D3DXMATRIX mView, D3DXVECTOR3 vBBox[2]) { // compute projection matrix D3DXVECTOR3 BBox[2]; BBox[0][0] = BBox[0][1] = BBox[0][2] = 1E38f; BBox[1][0] = BBox[1][1] = BBox[1][2] = -1E38f; for (int i = 0; i < 8; ++i) { D3DXVECTOR3 v, v1; v[0] = vBBox[(i & 1) ? 0 : 1][0]; v[1] = vBBox[(i & 2) ? 0 : 1][1]; v[2] = vBBox[(i & 4) ? 0 : 1][2]; D3DXVec3TransformCoord(&v1, &v, &m_mView); for (int j = 0; j < 3; ++j) { BBox[0][j] = min(BBox[0][j], v1[j]); BBox[1][j] = max(BBox[1][j], v1[j]); } } // expand the box a bit for (int j = 0; j < 3; ++j) { BBox[0][j] -= (FLOAT)(abs(BBox[0][j]) * 1e-3); BBox[1][j] += (FLOAT)(abs(BBox[1][j]) * 1e-3); } D3DXMatrixPerspectiveLH(&this->m_mProj, (FLOAT)max(abs(BBox[0][0]), (FLOAT)abs(BBox[1][0])) * 2, (FLOAT)max(abs(BBox[0][1]), (FLOAT)abs(BBox[1][1])) * 2, (FLOAT)max(0.0001, BBox[0][2]), (FLOAT)max(0.0002, BBox[1][2])); }
VOID SetupMatrices() { // world D3DXMATRIXA16 world_matrix; D3DXMatrixIdentity( &world_matrix ); float angle = timeGetTime() / 1000.0f; D3DXMatrixRotationY( &world_matrix, angle ); g_pd3dDevice->SetTransform( D3DTS_WORLD, &world_matrix ); // view D3DXMATRIXA16 view_matrix; D3DXVECTOR3 eye_pos ( 0.0f, 3.0f, -5.0f ); D3DXVECTOR3 look_pos ( 0.0f, 0.0f, 0.0f ); D3DXVECTOR3 upper_vector ( 0.0f, 1.0f, 0.0f ); D3DXMatrixLookAtLH( &view_matrix, &eye_pos, &look_pos, &upper_vector ); g_pd3dDevice->SetTransform( D3DTS_VIEW, &view_matrix ); // projection D3DXMATRIXA16 proj_matrix; float fov = D3DX_PI / 4; float ar = 1.0f; float ncp = 1.0f; float fcp = 100.0f; D3DXMatrixPerspectiveLH( &proj_matrix, fov, ar, ncp, fcp ); g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &proj_matrix ); }
BOOL jcd3d::jcd3d_setup() { cube = new Cube(lpd3dd); D3DLIGHT9 light; ZeroMemory(&light, sizeof(D3DLIGHT9)); light.Type = D3DLIGHT_DIRECTIONAL; light.Ambient = D3DXCOLOR(0.8f, 0.8f, 0.8f, 1.0f); light.Diffuse = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); light.Specular = D3DXCOLOR(0.2f, 0.2f, 0.2f, 1.0f); light.Direction = D3DXVECTOR3(1.0f, -1.0f, 0.0f); lpd3dd->SetLight(0, &light); lpd3dd->LightEnable(0, TRUE); lpmtrl = new D3DMATERIAL9(); lpmtrl->Ambient = D3DXCOLOR(D3DCOLOR_XRGB(255, 255, 255)); lpmtrl->Diffuse = D3DXCOLOR(D3DCOLOR_XRGB(255, 255, 255)); lpmtrl->Specular = D3DXCOLOR(D3DCOLOR_XRGB(255, 255, 255)); lpmtrl->Emissive = D3DXCOLOR(D3DCOLOR_XRGB(0, 0, 0)); lpmtrl->Power = 2.0f; lpd3dd->SetRenderState(D3DRS_NORMALIZENORMALS, TRUE); //lpd3dd->SetRenderState(D3DRS_SPECULARENABLE, TRUE); //lpd3dd->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); D3DXCreateTextureFromFile(lpd3dd, L"cube.jpg", &lptex); lpd3dd->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); lpd3dd->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); lpd3dd->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); D3DXMATRIX proj; D3DXMatrixPerspectiveLH( &proj, D3DX_PI * 0.5f, (FLOAT)WIN_WIDTH / (FLOAT)WIN_HEIGHT, 1.0f, 1000.0f ); lpd3dd->SetTransform(D3DTS_PROJECTION, &proj); return TRUE; }
VOID IImpostorable::GetProjViewMatrices(D3DXMATRIX* pproj, D3DXMATRIX* pview, D3DXVECTOR3* pnewcenter, const D3DXVECTOR3* pEyePt, const D3DXVECTOR3* pWorldUp) { m_Center = (m_Vertices[0].pos + m_Vertices[1].pos + m_Vertices[2].pos + m_Vertices[3].pos) * 0.25f; D3DXVECTOR3 widthVec = m_Vertices[2].pos - m_Vertices[0].pos; D3DXVECTOR3 heightVec = m_Vertices[1].pos - m_Vertices[0].pos; float viewWidth = D3DXVec3Length(&widthVec); float viewHeight = D3DXVec3Length(&heightVec); D3DXVECTOR3 nearPlaneVec = m_Center - (*pEyePt); float imposterNearPlane = D3DXVec3Length(&nearPlaneVec); //float imposterFarPlane = imposterNearPlane + (boundingRadius * 2.0f); float imposterFarPlane = imposterNearPlane + 99999.0f; // // Create Matrices // D3DXMatrixLookAtLH(pview, pEyePt, &m_Center, pWorldUp); D3DXMatrixPerspectiveLH(pproj, viewWidth, viewHeight, imposterNearPlane, imposterFarPlane); *pnewcenter = m_Center; }
static void CalculateLisPSM( const CCameraEntity& cam, Light& light ) { CalculateOrthoShadow( cam, light ); const SVector3& lightDir = light.mWorldMat.getAxisZ(); const SVector3& viewDir = cam.mWorldMat.getAxisZ(); double dotProd = lightDir.dot( viewDir ); if( fabs(dotProd) >= 0.999 ) { // degenerates to uniform shadow map return; } // calculate the hull of body B in world space HullFace bodyB; SMatrix4x4 invCamVP; D3DXMatrixInverse( &invCamVP, NULL, &cam.mWorldMat ); invCamVP *= cam.getProjectionMatrix(); D3DXMatrixInverse( &invCamVP, NULL, &invCamVP ); CalculateFocusedLightHull( invCamVP, lightDir, gCasterBounds, bodyB ); int zzz = bodyB.v.size(); int i, j; /* Frustum camFrustum( cam.getProjectionMatrix() ); std::vector<SVector3> bodyB; bodyB.reserve( gSceneCasters.size()*8 + 8 ); for( i = 0; i < 8; ++i ) bodyB.push_back( camFrustum.pntList[i] ); int ncasters = gSceneCasters.size(); for( i = 0; i < ncasters; ++i ) { const CAABox& aabb = gSceneCasters[i].aabb; for( j = 0; j < 8; ++j ) { SVector3 p; p.x = (j&1) ? aabb.getMin().x : aabb.getMax().x; p.y = (j&2) ? aabb.getMin().y : aabb.getMax().y; p.z = (j&4) ? aabb.getMin().z : aabb.getMax().z; bodyB.push_back( p ); } } */ // calculate basis of light space projection SVector3 ly = -lightDir; SVector3 lx = ly.cross( viewDir ).getNormalized(); SVector3 lz = lx.cross( ly ); SMatrix4x4 lightW; lightW.identify(); lightW.getAxisX() = lx; lightW.getAxisY() = ly; lightW.getAxisZ() = lz; SMatrix4x4 lightV; D3DXMatrixInverse( &lightV, NULL, &lightW ); // rotate bound body points from world into light projection space and calculate AABB there D3DXVec3TransformCoordArray( &bodyB.v[0], sizeof(SVector3), &bodyB.v[0], sizeof(SVector3), &lightV, bodyB.v.size() ); CAABox bodyLBounds; bodyLBounds.setNull(); for( i = 0; i < bodyB.v.size(); ++i ) bodyLBounds.extend( bodyB.v[i] ); float zextent = cam.getZFar() - cam.getZNear(); float zLextent = bodyLBounds.getMax().z - bodyLBounds.getMin().z; if( zLextent < zextent ) zextent = zLextent; // calculate free parameter N double sinGamma = sqrt( 1.0-dotProd*dotProd ); const double n = ( cam.getZNear() + sqrt(cam.getZNear() * (cam.getZNear() + zextent)) ) / sinGamma; // origin in this light space: looking at center of bounds, from distance n SVector3 lightSpaceO = bodyLBounds.getCenter(); lightSpaceO.z = bodyLBounds.getMin().z - n; // go through bound points in light space, and compute projected bound float maxx = 0.0f, maxy = 0.0f, maxz = 0.0f; for( i = 0; i < bodyB.v.size(); ++i ) { SVector3 tmp = bodyB.v[i] - lightSpaceO; assert( tmp.z > 0.0f ); maxx = max( maxx, fabsf(tmp.x / tmp.z) ); maxy = max( maxy, fabsf(tmp.y / tmp.z) ); maxz = max( maxz, tmp.z ); } SVector3 lpos; D3DXVec3TransformCoord( &lpos, &lightSpaceO, &lightW ); lightW.getOrigin() = lpos; SMatrix4x4 lightProj; D3DXMatrixPerspectiveLH( &lightProj, 2.0f*maxx*n, 2.0f*maxy*n, n, maxz ); SMatrix4x4 lsPermute, lsOrtho; lsPermute._11 = 1.f; lsPermute._12 = 0.f; lsPermute._13 = 0.f; lsPermute._14 = 0.f; lsPermute._21 = 0.f; lsPermute._22 = 0.f; lsPermute._23 =-1.f; lsPermute._24 = 0.f; lsPermute._31 = 0.f; lsPermute._32 = 1.f; lsPermute._33 = 0.f; lsPermute._34 = 0.f; lsPermute._41 = 0.f; lsPermute._42 = -0.5f; lsPermute._43 = 1.5f; lsPermute._44 = 1.f; D3DXMatrixOrthoLH( &lsOrtho, 2.f, 1.f, 0.5f, 2.5f ); lsPermute *= lsOrtho; lightProj *= lsPermute; G_RENDERCTX->getCamera().setCameraMatrix( lightW ); SMatrix4x4 lightFinal = G_RENDERCTX->getCamera().getViewMatrix() * lightProj; // unit cube clipping /* { // receiver hull std::vector<SVector3> receiverPts; receiverPts.reserve( gSceneReceivers.size() * 8 ); int nreceivers = gSceneReceivers.size(); for( i = 0; i < nreceivers; ++i ) { const CAABox& aabb = gSceneReceivers[i].aabb; for( j = 0; j < 8; ++j ) { SVector3 p; p.x = (j&1) ? aabb.getMin().x : aabb.getMax().x; p.y = (j&2) ? aabb.getMin().y : aabb.getMax().y; p.z = (j&4) ? aabb.getMin().z : aabb.getMax().z; receiverPts.push_back( p ); } } // transform to light post-perspective space D3DXVec3TransformCoordArray( &receiverPts[0], sizeof(SVector3), &receiverPts[0], sizeof(SVector3), &lightFinal, receiverPts.size() ); CAABox recvBounds; recvBounds.setNull(); for( i = 0; i < receiverPts.size(); ++i ) recvBounds.extend( receiverPts[i] ); recvBounds.getMax().x = min( 1.f, recvBounds.getMax().x ); recvBounds.getMin().x = max(-1.f, recvBounds.getMin().x ); recvBounds.getMax().y = min( 1.f, recvBounds.getMax().y ); recvBounds.getMin().y = max(-1.f, recvBounds.getMin().y ); float boxWidth = recvBounds.getMax().x - recvBounds.getMin().x; float boxHeight = recvBounds.getMax().y - recvBounds.getMin().y; if( !FLT_ALMOST_ZERO(boxWidth) && !FLT_ALMOST_ZERO(boxHeight) ) { float boxX = ( recvBounds.getMax().x + recvBounds.getMin().x ) * 0.5f; float boxY = ( recvBounds.getMax().y + recvBounds.getMin().y ) * 0.5f; SMatrix4x4 clipMatrix( 2.f/boxWidth, 0.f, 0.f, 0.f, 0.f, 2.f/boxHeight, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, -2.f*boxX/boxWidth, -2.f*boxY/boxHeight, 0.f, 1.f ); lightProj *= clipMatrix; } } */ G_RENDERCTX->getCamera().setProjectionMatrix( lightProj ); }
void draw(ID3D11DeviceContext* ctx, ID3D11RenderTargetView* rtv, unsigned width, unsigned height, double time) { D3D11_VIEWPORT vp; memset(&vp, 0, sizeof(vp)); vp.Width = (float)width; vp.Height = (float)height; vp.MaxDepth = 1.0f; if(width != cur_width || height != cur_height) { if(zsv) zsv->Release(); ID3D11Texture2D* zsbuf; D3D11_TEXTURE2D_DESC zsbufd; memset(&zsbufd, 0, sizeof(zsbufd)); zsbufd.Width = width; zsbufd.Height = height; zsbufd.Format = DXGI_FORMAT_D32_FLOAT; zsbufd.ArraySize = 1; zsbufd.MipLevels = 1; zsbufd.SampleDesc.Count = 1; zsbufd.BindFlags = D3D11_BIND_DEPTH_STENCIL; ensure(dev->CreateTexture2D(&zsbufd, 0, &zsbuf)); ensure(dev->CreateDepthStencilView(zsbuf, 0, &zsv)); zsbuf->Release(); } float black[4] = {0, 0, 0, 0}; D3D11_MAPPED_SUBRESOURCE map; ensure(ctx->Map(cb_frame, 0, D3D11_MAP_WRITE_DISCARD, 0, &map)); cb_frame_t* cb_frame_data = (cb_frame_t*)map.pData; D3DXMatrixIdentity(&cb_frame_data->model); D3DXMATRIX view; D3DXVECTOR3 eye(2.0f * (float)sin(time), 0.0f, 2.0f * (float)cos(time)); D3DXVECTOR3 at(0, 0, 0); D3DXVECTOR3 up(0, 1, 0); D3DXMatrixLookAtLH(&view, &eye, &at, &up); D3DXMATRIX proj; D3DXMatrixPerspectiveLH(&proj, 1.1f, 1.1f, 1.0f, 3.0f); cb_frame_data->view_proj = view * proj; float min_tess_factor = 1.0f; cb_frame_data->tess_factor = (1.0f - (float)cos(time)) * ((64.0f - min_tess_factor) / 2.0f) + min_tess_factor; cb_frame_data->disp_scale = 0.9f; //cb_frame_data->disp_scale = (sin(time) + 1.0) / 2.0; cb_frame_data->disp_freq = 5.0f * (float)M_PI; //cb_frame_data->disp_freq = (4.0 + 4.0 * cos(time / 5.0)) * PI; ctx->Unmap(cb_frame, 0); ctx->HSSetConstantBuffers(0, 1, &cb_frame); ctx->DSSetConstantBuffers(0, 1, &cb_frame); //ctx->OMSetBlendState(bs, black, ~0); //ctx->OMSetDepthStencilState(dss, 0); ctx->OMSetRenderTargets(1, &rtv, zsv); //ctx->RSSetState(rs); ctx->RSSetViewports(1, &vp); ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST); ctx->IASetInputLayout(layout); unsigned stride = 3 * 4; unsigned offset = 0; ctx->IASetVertexBuffers(0, 1, &vb, &stride, &offset); ctx->VSSetShader(vs, NULL, 0); ctx->HSSetShader(hs, NULL, 0); ctx->DSSetShader(ds, NULL, 0); ctx->GSSetShader(NULL, NULL, 0); ctx->PSSetShader(ps, NULL, 0); ctx->ClearRenderTargetView(rtv, black); ctx->ClearDepthStencilView(zsv, D3D11_CLEAR_DEPTH, 1.0f, 0); ctx->Draw(3 * 8, 0); }