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]));
}
예제 #2
0
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 );
}
예제 #3
0
파일: testmain.cpp 프로젝트: chengkehan/lab
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;
}
예제 #4
0
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;
}
예제 #5
0
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 );
}
예제 #6
0
	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);
	}