Пример #1
0
    void MainLoop()
    {
	    Layer[0] = new VRLayer(Session);

        // Make a duplicate of the left eye texture, and a place to save renderpose
	    ovrPosef extraRenderPose;
	    OculusTexture extraRenderTexture;
        if (!extraRenderTexture.Init(Session, Layer[0]->pEyeRenderTexture[0]->SizeW, Layer[0]->pEyeRenderTexture[0]->SizeH))
            return;
		//Need to commit it at least once here, or its possible when going into '1'
		//to have the SDK use it before any texture has been committed
		extraRenderTexture.Commit(); 


	    while (HandleMessages())
	    {
            // Keep a clock of what's happening
            static int clock = 0;
            ++clock;

            // Adjust speed, because we only want movement at certain junctures
            float speed = 1;
            if (DIRECTX.Key['1'])
            {
                if ((clock % 2) != 0) speed = 0;
                else                  speed *= 2;
            }
            ActionFromInput(speed);

            // Get Eye poses, but into a temporary buffer,
            ovrPosef tempEyeRenderPose[2];
            Layer[0]->GetEyePoses(tempEyeRenderPose);

            // Now find out player yaw at this time
            XMVECTOR playerOrientation = MainCam->Rot;

            // And, we're going to store the player orientations from when we render
            static XMVECTOR playerOrientationAtRender[2];
            static XMVECTOR extraOrientationAtRender;

            for (int eye = 0; eye < 2; ++eye)
            {
                if (DIRECTX.Key['1'])
                {
                    // Don't do this eye
                    if ((clock & 1) != eye) continue;

                    // This situation, use the extra buffer, and we're done
                    if (((clock % 4) == 2) && (eye == 0))
                    {
                        extraRenderPose = tempEyeRenderPose[eye];
                        extraOrientationAtRender = playerOrientation;
                        auto rtv = extraRenderTexture.GetRTV();
						Layer[0]->RenderSceneToEyeBuffer(MainCam, RoomScene, eye, rtv, &extraRenderPose);
						extraRenderTexture.Commit(); 
                        continue;
                    }
                }

                // Otherwise, operate as usual
                Layer[0]->EyeRenderPose[eye] = tempEyeRenderPose[eye];
                playerOrientationAtRender[eye] = playerOrientation;
                Layer[0]->RenderSceneToEyeBuffer(MainCam, RoomScene, eye);
            }

            // If this situation is true, then want to use left texture and pose
		    XMVECTOR diffQuat[2] = { XMQuaternionIdentity(), XMQuaternionIdentity() };
            if ((DIRECTX.Key['1']) && (((clock % 4) == 0) || ((clock % 4) == 3)))
            {
                if (!DIRECTX.Key['2']) diffQuat[0] = XMQuaternionMultiply(XMQuaternionInverse(extraOrientationAtRender), playerOrientation);
			    if (!DIRECTX.Key['2']) diffQuat[1] = XMQuaternionMultiply(XMQuaternionInverse(playerOrientationAtRender[1]), playerOrientation);
                Layer[0]->PrepareLayerHeader(&extraRenderTexture, &extraRenderPose, diffQuat);
            }
            else
            {
			    if (!DIRECTX.Key['2']) diffQuat[0] = XMQuaternionMultiply(XMQuaternionInverse(playerOrientationAtRender[0]), playerOrientation);
			    if (!DIRECTX.Key['2']) diffQuat[1] = XMQuaternionMultiply(XMQuaternionInverse(playerOrientationAtRender[1]), playerOrientation);
                Layer[0]->PrepareLayerHeader(0, 0, diffQuat);
            }

            DistortAndPresent(1);
	    }
    }
Пример #2
0
		Quaternion inverse() const
		{
			return Quaternion(XMQuaternionInverse(*this));
		}
Пример #3
0
			inline void XM_CALLCONV inverse(){
				this->v = XMQuaternionInverse(this->v);
			}
Пример #4
0
			inline this_type XM_CALLCONV inversed() const
			{
				this_type ret;
				ret.v = XMQuaternionInverse(this->v);
				return ret;
			}
Пример #5
0
Quaternion Quaternion::Invert(const Quaternion& q)
{
    return Quaternion(XMQuaternionInverse(q.ToSIMD()));
}