Skip to content

Commit

Permalink
fix: doesn't crash :-)
Browse files Browse the repository at this point in the history
but doesn't render distortion yet
  • Loading branch information
ricardoquesada committed Apr 20, 2016
1 parent 2f81936 commit e7e5080
Show file tree
Hide file tree
Showing 5 changed files with 157 additions and 7 deletions.
74 changes: 74 additions & 0 deletions cocosvr/Eye.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
//
// Eye.cpp
// cocosVR
//
// Created by Ricardo Quesada on 4/19/16.
//
//

#include "Eye.h"

#include "FieldOfView.h"
#include "Viewport.h"


Eye::Eye(Type eyeType) :
_type(eyeType),
_eyeView(cocos2d::Mat4::IDENTITY),
_projectionChanged(true),
_perspective(cocos2d::Mat4::IDENTITY),
_lastZNear(0),
_lastZFar(0)
{
_viewport = new Viewport();
_fov = new FieldOfView();
}

Eye::~Eye()
{
if (_viewport != nullptr) { delete _viewport; }
if (_fov != nullptr) { delete _fov; }
}

Eye::Type Eye::type()
{
return _type;
}

cocos2d::Mat4 Eye::eyeView()
{
return _eyeView;
}

void Eye::setEyeView(const cocos2d::Mat4& eyeView)
{
_eyeView = eyeView;
}

cocos2d::Mat4 Eye::perspective(float zNear, float zFar)
{
if (!_projectionChanged && _lastZNear == zNear && _lastZFar == zFar)
{
return _perspective;
}
_perspective = fov()->toPerspectiveMatrix(zNear, zFar);
_lastZNear = zNear;
_lastZFar = zFar;
_projectionChanged = false;
return _perspective;
}

Viewport *Eye::viewport()
{
return _viewport;
}

FieldOfView *Eye::fov()
{
return _fov;
}

void Eye::setProjectionChanged()
{
_projectionChanged = true;
}
54 changes: 54 additions & 0 deletions cocosvr/Eye.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
//
// Eye.hpp
// cocosVR
//
// Created by Ricardo Quesada on 4/19/16.
//
//

#ifndef Eye_hpp
#define Eye_hpp

#include "math/Mat4.h"

class FieldOfView;
class Viewport;


class Eye
{
public:

typedef enum
{
TypeMonocular = 0,
TypeLeft = 1,
TypeRight = 2
} Type;

Eye(Type eye);
~Eye();

Type type();

cocos2d::Mat4 eyeView();
void setEyeView(const cocos2d::Mat4& eyeView);
cocos2d::Mat4 perspective(float zNear, float zFar);

Viewport *viewport();
FieldOfView *fov();

void setProjectionChanged();

private:
Type _type;
cocos2d::Mat4 _eyeView;
Viewport *_viewport;
FieldOfView *_fov;
bool _projectionChanged;
cocos2d::Mat4 _perspective;
float _lastZNear;
float _lastZFar;
};

#endif /* Eye_hpp */
20 changes: 15 additions & 5 deletions cocosvr/OVRRenderer-generic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "ScreenParams.h"
#include "Viewport.h"
#include "FieldOfView.h"
#include "Eye.h"

USING_NS_CC;

Expand Down Expand Up @@ -48,6 +49,7 @@ OVRRenderer::~OVRRenderer()
bool OVRRenderer::init(cocos2d::CameraFlag flag)
{
CCLOG("OVRRenderer::init");
setupVR();

for (int eye = 0; eye < EYE_NUM; eye++)
{
Expand All @@ -72,6 +74,16 @@ bool OVRRenderer::init(cocos2d::CameraFlag flag)
return true;
}

void OVRRenderer::setupVR()
{
_headMountedDisplay = new HeadMountedDisplay((UIScreenIgnore*)nullptr);
_monocularEye = new Eye(Eye::TypeMonocular);
_leftEye = new Eye(Eye::TypeLeft);
_rightEye = new Eye(Eye::TypeRight);

fovDidChange(_leftEye->fov(), _rightEye->fov(), 0.042);
}

void OVRRenderer::setupGLProgram()
{
const GLchar *vertexShader =
Expand Down Expand Up @@ -333,18 +345,16 @@ void OVRRenderer::updateViewports(Viewport *leftViewport, Viewport *rightViewpor
_viewportsChanged = false;
}

void OVRRenderer::fovDidChange(HeadMountedDisplay *headMountedDisplay,
FieldOfView *leftEyeFov,
FieldOfView *rightEyeFov,
float virtualEyeToScreenDistance)
void OVRRenderer::fovDidChange(FieldOfView *leftEyeFov,
FieldOfView *rightEyeFov,
float virtualEyeToScreenDistance)
{
if (_drawingFrame)
{
CCLOG("Cannot change FOV while rendering a frame.");
return;
}

_headMountedDisplay = headMountedDisplay;
_leftEyeViewport = initViewportForEye(leftEyeFov, 0.0f);
_rightEyeViewport = initViewportForEye(rightEyeFov, _leftEyeViewport.width);
_metersPerTanAngle = virtualEyeToScreenDistance;
Expand Down
8 changes: 6 additions & 2 deletions cocosvr/OVRRenderer-generic.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ class DistortionMesh;
class HeadMountedDisplay;
class Viewport;
class FieldOfView;
class Eye;

struct EyeViewport
{
Expand All @@ -32,11 +33,11 @@ class OVRRenderer : public cocos2d::Node
void setOffsetRot(const cocos2d::Quaternion &rot);
void setResolutionScale(float scale);
void updateViewports(Viewport *leftViewport, Viewport *rightViewport);
void fovDidChange(HeadMountedDisplay *headMountedDisplay,
FieldOfView *leftEyeFov,
void fovDidChange(FieldOfView *leftEyeFov,
FieldOfView *rightEyeFov,
float virtualEyeToScreenDistance);
private:
void setupVR();
bool init(cocos2d::CameraFlag flag);
EyeViewport initViewportForEye(FieldOfView *eyeFieldOfView, float xOffset);
int setupRenderTextureAndRenderbuffer(int width, int height);
Expand All @@ -58,6 +59,9 @@ class OVRRenderer : public cocos2d::Node
GLboolean _cullFaceEnabled;
GLboolean _scissorTestEnabled;
HeadMountedDisplay* _headMountedDisplay;
Eye* _monocularEye;
Eye* _leftEye;
Eye* _rightEye;
DistortionMesh* _leftEyeDistortionMesh;
DistortionMesh* _rightEyeDistortionMesh;
EyeViewport _leftEyeViewport;
Expand Down
8 changes: 8 additions & 0 deletions samples/proj.ios_mac/cocosVR.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,8 @@
5087E78617EB970100C73F5D /* Icon-76.png in Resources */ = {isa = PBXBuildFile; fileRef = 5087E77B17EB970100C73F5D /* Icon-76.png */; };
5087E78917EB974C00C73F5D /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5087E78817EB974C00C73F5D /* AppKit.framework */; };
5087E78B17EB975400C73F5D /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5087E78A17EB975400C73F5D /* OpenGL.framework */; };
50DD05AA1CC70B290080240F /* Eye.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 50DD05A81CC70B290080240F /* Eye.cpp */; };
50DD05AB1CC70B290080240F /* Eye.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 50DD05A81CC70B290080240F /* Eye.cpp */; };
50EF629617ECD46A001EB2F8 /* Icon-40.png in Resources */ = {isa = PBXBuildFile; fileRef = 50EF629217ECD46A001EB2F8 /* Icon-40.png */; };
50EF629717ECD46A001EB2F8 /* Icon-58.png in Resources */ = {isa = PBXBuildFile; fileRef = 50EF629317ECD46A001EB2F8 /* Icon-58.png */; };
50EF629817ECD46A001EB2F8 /* Icon-80.png in Resources */ = {isa = PBXBuildFile; fileRef = 50EF629417ECD46A001EB2F8 /* Icon-80.png */; };
Expand Down Expand Up @@ -225,6 +227,8 @@
5087E77C17EB970100C73F5D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
5087E78817EB974C00C73F5D /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
5087E78A17EB975400C73F5D /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; };
50DD05A81CC70B290080240F /* Eye.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Eye.cpp; sourceTree = "<group>"; };
50DD05A91CC70B290080240F /* Eye.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Eye.h; sourceTree = "<group>"; };
50EF629217ECD46A001EB2F8 /* Icon-40.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-40.png"; sourceTree = "<group>"; };
50EF629317ECD46A001EB2F8 /* Icon-58.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-58.png"; sourceTree = "<group>"; };
50EF629417ECD46A001EB2F8 /* Icon-80.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-80.png"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -458,6 +462,8 @@
50366C9A1CC07AE2008854D8 /* FieldOfView.h */,
502E112E1CC1AE0500BE9D7F /* Viewport.cpp */,
502E112F1CC1AE0500BE9D7F /* Viewport.h */,
50DD05A81CC70B290080240F /* Eye.cpp */,
50DD05A91CC70B290080240F /* Eye.h */,
);
name = cocosvr;
path = ../../cocosvr;
Expand Down Expand Up @@ -646,6 +652,7 @@
5076BBC41CBC60A1006DABD2 /* AppDelegate.cpp in Sources */,
50366C8B1CC04F00008854D8 /* DistortionMesh.cpp in Sources */,
50366C9B1CC07AE2008854D8 /* FieldOfView.cpp in Sources */,
50DD05AA1CC70B290080240F /* Eye.cpp in Sources */,
5076BBC91CBC60A1006DABD2 /* PlayerController.cpp in Sources */,
5076BBC51CBC60A1006DABD2 /* HelloWorldScene.cpp in Sources */,
50366C931CC079E7008854D8 /* CardboardDeviceParams.cpp in Sources */,
Expand Down Expand Up @@ -680,6 +687,7 @@
5076BBD11CBC6116006DABD2 /* Panther.cpp in Sources */,
50366C981CC079F7008854D8 /* ScreenParams.cpp in Sources */,
5076BBD31CBC6116006DABD2 /* ProgressView.cpp in Sources */,
50DD05AB1CC70B290080240F /* Eye.cpp in Sources */,
502E11311CC1AE0500BE9D7F /* Viewport.cpp in Sources */,
5076BBD51CBC6116006DABD2 /* Tiger.cpp in Sources */,
5076BBCD1CBC6116006DABD2 /* AppDelegate.cpp in Sources */,
Expand Down

0 comments on commit e7e5080

Please sign in to comment.