Skip to content
Permalink
Browse files

YES, OpenVR implementation is good!

  • Loading branch information
demonixis committed Nov 12, 2017
1 parent 6962c3b commit 73220208aa4d66a2d8c017d2f0eab0831f3a6a57
@@ -85,6 +85,7 @@
<Compile Include="Scripts\ShadowMapViewer.cs" />
<Compile Include="Scripts\SimplePath.cs" />
<Compile Include="Scripts\UIWidgetDemo.cs" />
<Compile Include="Scripts\VRSwitcher.cs" />
<Compile Include="Scripts\WeightMapViewer.cs" />
<Compile Include="Scenes\ProceduralTerrainWater.cs" />
<Compile Include="Scenes\HeightmapDemo.cs" />
@@ -26,6 +26,7 @@ public override void Initialize()
var orbit = cameraGo.AddComponent<OrbitController>();
orbit.KeyboardEnabled = false;
cameraGo.AddComponent<DemoBehaviour>();
cameraGo.AddComponent<VRSwitcher>();
Add(cameraGo);

// Light
@@ -7,6 +7,7 @@
using C3DE.Utils;
using C3DE.VR;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace C3DE.Demo.Scenes
{
@@ -62,21 +63,25 @@ public override void Unload()

private void BuildScene()
{
var lightGo = GameObjectFactory.CreateLight(LightType.Directional);
var lightGo = GameObjectFactory.CreateLight(LightType.Directional, Color.LightSteelBlue, 0.5f);
lightGo.Transform.Position = new Vector3(-15, 15, 15);
lightGo.Transform.Rotation = new Vector3(-1, 1, 0);
lightGo.Transform.Rotation = new Vector3(-1, -1, 0);
lightGo.AddComponent<DemoBehaviour>();
lightGo.AddComponent<LightMover>();
Add(lightGo);

// Terrain
var terrainMaterial = new StandardMaterial(scene);
terrainMaterial.MainTexture = GraphicsHelper.CreateBorderTexture(Color.LightGreen, Color.LightSeaGreen, 128, 128, 4);
terrainMaterial.Shininess = 10;
terrainMaterial.Tiling = new Vector2(64);
terrainMaterial.MainTexture = Application.Content.Load<Texture2D>("Textures/Terrain/Grass");
terrainMaterial.Shininess = 150;
terrainMaterial.Tiling = new Vector2(16);
terrainMaterial.EmissiveTexture = terrainMaterial.MainTexture;
terrainMaterial.EmissiveEnabled = true;

var terrainGo = GameObjectFactory.CreateTerrain();
var terrain = terrainGo.GetComponent<Terrain>();
terrain.Renderer.Geometry.Size = new Vector3(2);
terrain.Renderer.Geometry.TextureRepeat = new Vector2(4);
terrain.Renderer.Geometry.Build();
terrain.Flatten();
terrain.Renderer.Material = terrainMaterial;
@@ -90,7 +95,7 @@ private void BuildScene()
for (var i = 0; i < 10; i++)
{
var go = new GameObject("Cube " + i);
go.Transform.Position = RandomHelper.GetVector3(-20, 0.5f, -20, 20, 0.5f, 20);
go.Transform.Position = RandomHelper.GetVector3(-20, 1, -20, 20, 1, 20);
Add(go);
var renderer = go.AddComponent<MeshRenderer>();
renderer.Geometry = new CubeGeometry();
@@ -0,0 +1,67 @@
using C3DE.Components;
using C3DE.Graphics.Rendering;
using C3DE.VR;
using C3DE.UI;
using Microsoft.Xna.Framework;
using System;

namespace C3DE.Demo.Scripts
{
public class VRSwitcher : Behaviour
{
private bool _vrEnabled = false;
public Action<bool> VRChanged;

public override void Start()
{
base.Start();
_vrEnabled = Application.Engine.Renderer is VRRenderer;
}

public override void OnGUI(GUI ui)
{
base.OnGUI(ui);

if (ui.Button(new Rectangle(10, 10, 100, 30), "Toggle VR"))
Toggle();
}

private void Toggle()
{
_vrEnabled = Application.Engine.Renderer is VRRenderer;
_vrEnabled = !_vrEnabled;

if (_vrEnabled)
{
var vrDevice = GetService();
if (vrDevice.TryInitialize() == 0)
{
var vrRenderer = new VRRenderer(Application.GraphicsDevice, vrDevice);
vrRenderer.StereoPreview = false;
Application.Engine.Renderer = vrRenderer;
}
else
_vrEnabled = false;
}
else
Application.Engine.Renderer = new ForwardRenderer(Application.GraphicsDevice);

VRChanged?.Invoke(true);
}

private VRService GetService()
{
#if DESKTOPGL
return new OSVRService(Application.Engine);
#else
return new OpenVRService(Application.Engine);
#endif
}

public override void OnDestroy()
{
if (_vrEnabled)
Application.Engine.Renderer = new ForwardRenderer(Application.GraphicsDevice);
}
}
}
@@ -46,13 +46,10 @@ public override void Render(Scene scene)
camera.projection = _vrDevice.GetProjectionMatrix(eye);
camera.view = _vrDevice.GetViewMatrix(eye, playerMatrix);

if (camera.transform.Parent != null)
camera.view *= Matrix.Invert(camera.transform.Parent.world);

RenderShadowMaps(scene);
RenderObjects(scene, camera);
//renderPostProcess(scene.postProcessPasses);
//RenderUI(scene.Behaviours);
RenderPostProcess(scene.postProcessPasses);
RenderUI(scene.Behaviours);
}

_vrDevice.SubmitRenderTargets(renderTargetEye[0], renderTargetEye[1]);
@@ -22,6 +22,8 @@ public class OpenVRService : VRService
private Matrix _leftControllerPose;
private Matrix _rightControllerPose;

public override SpriteEffects PreviewRenderEffect => SpriteEffects.FlipHorizontally;

public OpenVRService(Game game)
: base(game)
{
@@ -65,7 +67,7 @@ public override RenderTarget2D CreateRenderTargetForEye(int eye)
uint height = 0;
_hmd.GetRecommendedRenderTargetSize(ref width, ref height);

var renderTarget = new RenderTarget2D(Game.GraphicsDevice, (int)width, (int)height, false, SurfaceFormat.ColorSRgb, DepthFormat.Depth24Stencil8);
var renderTarget = new RenderTarget2D(Game.GraphicsDevice, (int)width, (int)height, false, SurfaceFormat.ColorSRgb, DepthFormat.Depth24Stencil8, 2, RenderTargetUsage.PreserveContents);

_textures[eye] = new Texture_t();

@@ -98,8 +100,8 @@ public override Matrix GetProjectionMatrix(int eye)

public override Matrix GetViewMatrix(int eye, Matrix playerPose)
{
var view = _hmd.GetEyeToHeadTransform((EVREye)eye).ToXNA();
return _hmdPose * view;
var matrixEyePos = _hmd.GetEyeToHeadTransform((EVREye)eye).ToXNA();
return matrixEyePos * Matrix.Invert(_hmdPose);
}

public override float GetRenderTargetAspectRatio(int eye) => 1.0f;
@@ -12,7 +12,7 @@ public abstract class VRService : GameComponent
/// Gets or sets the preview render effect.
/// </summary>
/// <value>The preview render effect.</value>
public SpriteEffects PreviewRenderEffect { get; protected set; } = SpriteEffects.None;
public virtual SpriteEffects PreviewRenderEffect { get; protected set; } = SpriteEffects.None;

/// <summary>
/// Gets or sets the distortion correction effect.

0 comments on commit 7322020

Please sign in to comment.
You can’t perform that action at this time.