예제 #1
0
void C3DCubeModel::DrawModel(wzMatrix* pView, wzMatrix* pProj, wzVector3* gap)
{
	if(!m_isCreated)
		return;

	wzMatrix wvpMatans;
	wzVector4 modelColor = VEC4_INIT(1.0f,1.0f,1.0f,1.0f);
	wzVector3 lightColor = VEC3_INIT(1.0f,1.0f,1.0f);
	wzVector3 lightDirection = VEC3_INIT(0.6f,0.7f,1.0f);

	// Matrix multiply
	wzMatrixIdentity(&wvpMatans);
	wzMatrixMultiply(&wvpMatans, pProj, &wvpMatans);
	
	if(gap != NULL) {
		wzMatrix drawcalc;
		wzMatrixTranslation(&drawcalc,gap->x, gap->y, gap->z);
		wzMatrixMultiply(&wvpMatans, &drawcalc, &wvpMatans);
	}

	wzMatrixMultiply(&wvpMatans, pView, &wvpMatans);

	// Shader
	wzUseShader(&m_shader);
	wzUniformMatrix("u_worldViewProjMatrix",&wvpMatans);
	// Color
	wzUniformVector4("u_diffuse",&modelColor);
	wzUniformVector3("u_lightdiffuse",&lightColor);
	wzUniformVector3("u_lightdir",&lightDirection);
	// Drawing
	wzDrawMesh(&m_cube);
}
//Draw
void COculusVR::DrawScreen()
{
	//clear
	wzClear();

	// Adjust eye position and rotation from controls, maintaining y position from HMD.
	static float BodyYaw(3.141592f);
	static Vector3f HeadPos(0.0f, 0.0f, -5.0f);
    static ovrTrackingState HmdState;
	static ovrPosef eyeRenderPose[2];

    ovrVector3f hmdToEyeViewOffset[2] = { EyeRenderDesc[0].HmdToEyeViewOffset, EyeRenderDesc[1].HmdToEyeViewOffset };
    ovrHmd_GetEyePoses(Hmd, 0, hmdToEyeViewOffset, eyeRenderPose, &HmdState);

	/* debug
		wzSetSpriteScSize(1920, 1080);
		wzSetSpritePosition(0.0f, 0.0f, 0.0f);
		wzSetSpriteColor(1.0f, 1.0f, 1.0f, 1.0f);
		wzSetSpriteTexCoord(0.0f, 0.0f, 1.0f, 1.0f);
		wzSetSpriteSizeLeftUp((float)1920, (float)1080);
		wzSetSpriteTexture(&m_screenTex);
		wzSpriteDraw();	//Draw
	*/

	// Setup shader
	wzUseShader(&LensShader);
	wzSetTexture("texture0", &m_screenTex, 0);

	for ( int eyeNum = 0; eyeNum < 2; eyeNum++ )
	{
		wzVector2 uvScale = {UVScaleOffset[eyeNum][0].x,-UVScaleOffset[eyeNum][0].y};
		wzVector2 uvOffset = {UVScaleOffset[eyeNum][1].x,UVScaleOffset[eyeNum][1].y};
		wzMatrix rotStart,rotEnd;
		wzUniformVector2("eyeToSourceUVscale", &uvScale);
		wzUniformVector2("eyeToSourceUVoffset", &uvOffset);

 		ovrMatrix4f timeWarpMatrices[2];
		ovrHmd_GetEyeTimewarpMatrices(Hmd, (ovrEyeType)eyeNum, eyeRenderPose[eyeNum], timeWarpMatrices);
		memcpy(&rotStart.m,&timeWarpMatrices[0],sizeof(ovrMatrix4f));
		memcpy(&rotEnd.m,&timeWarpMatrices[1],sizeof(ovrMatrix4f));
		wzUniformMatrix("eyeRotationStart", &rotStart);	//Nb transposed when set
		wzUniformMatrix("eyeRotationEnd", &rotEnd);
		
		//Draw Mesh
		wzDrawMesh(&MeshBuffer[eyeNum]);
	}

	//DK2 Latency Tester
	unsigned char latencyColor[3];
	ovrBool drawDk2LatencyQuad = ovrHmd_GetLatencyTest2DrawColor(Hmd, latencyColor);
	if(drawDk2LatencyQuad)
    {
		const int latencyQuadSize = 20; // only needs to be 1-pixel, but larger helps visual debugging
		wzSetViewport(Hmd->Resolution.w - latencyQuadSize, 0, latencyQuadSize, latencyQuadSize);
		wzSetClearColor(latencyColor[0] / 255.0f, latencyColor[1] / 255.0f, latencyColor[2] / 255.0f,0.0f);
		wzClear();
	}
}