diff --git a/build/cocos2d_libs.xcodeproj/project.pbxproj b/build/cocos2d_libs.xcodeproj/project.pbxproj index cbd41c6288..3145eb2644 100644 --- a/build/cocos2d_libs.xcodeproj/project.pbxproj +++ b/build/cocos2d_libs.xcodeproj/project.pbxproj @@ -1426,6 +1426,12 @@ 5027253B190BF1B900AAF4ED /* cocos2d.h in Headers */ = {isa = PBXBuildFile; fileRef = 50272538190BF1B900AAF4ED /* cocos2d.h */; }; 5027253C190BF1B900AAF4ED /* cocos2d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 50272539190BF1B900AAF4ED /* cocos2d.cpp */; }; 5027253D190BF1B900AAF4ED /* cocos2d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 50272539190BF1B900AAF4ED /* cocos2d.cpp */; }; + 502AF9781D0711B8006AF256 /* CCVRGenericHeadTracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 502AF9771D0711B8006AF256 /* CCVRGenericHeadTracker.cpp */; }; + 502AF9791D0711C9006AF256 /* CCVRGenericHeadTracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 502AF9771D0711B8006AF256 /* CCVRGenericHeadTracker.cpp */; }; + 502AF97A1D0711CA006AF256 /* CCVRGenericHeadTracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 502AF9771D0711B8006AF256 /* CCVRGenericHeadTracker.cpp */; }; + 5030C0421CE6DF8B00C5D3E7 /* CCVRGenericHeadTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 5030C03E1CE6DF8B00C5D3E7 /* CCVRGenericHeadTracker.h */; }; + 5030C0431CE6DF8B00C5D3E7 /* CCVRGenericHeadTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 5030C03E1CE6DF8B00C5D3E7 /* CCVRGenericHeadTracker.h */; }; + 5030C0441CE6DF8B00C5D3E7 /* CCVRGenericHeadTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 5030C03E1CE6DF8B00C5D3E7 /* CCVRGenericHeadTracker.h */; }; 5034CA21191D591100CE6051 /* ccShader_PositionTextureColorAlphaTest.frag in Headers */ = {isa = PBXBuildFile; fileRef = 5034C9FB191D591000CE6051 /* ccShader_PositionTextureColorAlphaTest.frag */; }; 5034CA22191D591100CE6051 /* ccShader_PositionTextureColorAlphaTest.frag in Headers */ = {isa = PBXBuildFile; fileRef = 5034C9FB191D591000CE6051 /* ccShader_PositionTextureColorAlphaTest.frag */; }; 5034CA2B191D591100CE6051 /* ccShader_PositionTextureA8Color.vert in Headers */ = {isa = PBXBuildFile; fileRef = 5034CA00191D591000CE6051 /* ccShader_PositionTextureA8Color.vert */; }; @@ -1461,6 +1467,18 @@ 5034CA4A191D591100CE6051 /* ccShader_Label_df.frag in Headers */ = {isa = PBXBuildFile; fileRef = 5034CA0F191D591000CE6051 /* ccShader_Label_df.frag */; }; 5034CA4B191D591100CE6051 /* ccShader_Label_df_glow.frag in Headers */ = {isa = PBXBuildFile; fileRef = 5034CA10191D591000CE6051 /* ccShader_Label_df_glow.frag */; }; 5034CA4C191D591100CE6051 /* ccShader_Label_df_glow.frag in Headers */ = {isa = PBXBuildFile; fileRef = 5034CA10191D591000CE6051 /* ccShader_Label_df_glow.frag */; }; + 503D4F631CE29D4E0054A2D1 /* CCVRDistortionMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 503D4F611CE29D4E0054A2D1 /* CCVRDistortionMesh.cpp */; }; + 503D4F641CE29D4E0054A2D1 /* CCVRDistortionMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 503D4F611CE29D4E0054A2D1 /* CCVRDistortionMesh.cpp */; }; + 503D4F651CE29D4E0054A2D1 /* CCVRDistortionMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 503D4F611CE29D4E0054A2D1 /* CCVRDistortionMesh.cpp */; }; + 503D4F661CE29D4E0054A2D1 /* CCVRDistortionMesh.h in Headers */ = {isa = PBXBuildFile; fileRef = 503D4F621CE29D4E0054A2D1 /* CCVRDistortionMesh.h */; }; + 503D4F671CE29D4E0054A2D1 /* CCVRDistortionMesh.h in Headers */ = {isa = PBXBuildFile; fileRef = 503D4F621CE29D4E0054A2D1 /* CCVRDistortionMesh.h */; }; + 503D4F681CE29D4E0054A2D1 /* CCVRDistortionMesh.h in Headers */ = {isa = PBXBuildFile; fileRef = 503D4F621CE29D4E0054A2D1 /* CCVRDistortionMesh.h */; }; + 503D4F6B1CE2BDBE0054A2D1 /* CCVRDistortion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 503D4F691CE2BDBE0054A2D1 /* CCVRDistortion.cpp */; }; + 503D4F6C1CE2BDBE0054A2D1 /* CCVRDistortion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 503D4F691CE2BDBE0054A2D1 /* CCVRDistortion.cpp */; }; + 503D4F6D1CE2BDBE0054A2D1 /* CCVRDistortion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 503D4F691CE2BDBE0054A2D1 /* CCVRDistortion.cpp */; }; + 503D4F6E1CE2BDBE0054A2D1 /* CCVRDistortion.h in Headers */ = {isa = PBXBuildFile; fileRef = 503D4F6A1CE2BDBE0054A2D1 /* CCVRDistortion.h */; }; + 503D4F6F1CE2BDBE0054A2D1 /* CCVRDistortion.h in Headers */ = {isa = PBXBuildFile; fileRef = 503D4F6A1CE2BDBE0054A2D1 /* CCVRDistortion.h */; }; + 503D4F701CE2BDBE0054A2D1 /* CCVRDistortion.h in Headers */ = {isa = PBXBuildFile; fileRef = 503D4F6A1CE2BDBE0054A2D1 /* CCVRDistortion.h */; }; 503DD8E01926736A00CD74DD /* CCApplication-ios.h in Headers */ = {isa = PBXBuildFile; fileRef = 503DD8CE1926736A00CD74DD /* CCApplication-ios.h */; }; 503DD8E11926736A00CD74DD /* CCApplication-ios.mm in Sources */ = {isa = PBXBuildFile; fileRef = 503DD8CF1926736A00CD74DD /* CCApplication-ios.mm */; }; 503DD8E21926736A00CD74DD /* CCCommon-ios.mm in Sources */ = {isa = PBXBuildFile; fileRef = 503DD8D01926736A00CD74DD /* CCCommon-ios.mm */; }; @@ -3811,6 +3829,15 @@ 50ED2BE119BEAF7900A0AB90 /* UIEditBoxImpl-win32.h in Headers */ = {isa = PBXBuildFile; fileRef = 50ED2BDC19BEAF7900A0AB90 /* UIEditBoxImpl-win32.h */; }; 50ED2BE419BEAF7900A0AB90 /* UIEditBoxImpl-win32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 50ED2BDE19BEAF7900A0AB90 /* UIEditBoxImpl-win32.cpp */; }; 50ED2BE519BEAF7900A0AB90 /* UIEditBoxImpl-win32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 50ED2BDE19BEAF7900A0AB90 /* UIEditBoxImpl-win32.cpp */; }; + 50F965511CD0360000ADE813 /* CCVRGenericRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 50F9654E1CD0360000ADE813 /* CCVRGenericRenderer.cpp */; }; + 50F965521CD0360000ADE813 /* CCVRGenericRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 50F9654E1CD0360000ADE813 /* CCVRGenericRenderer.cpp */; }; + 50F965531CD0360000ADE813 /* CCVRGenericRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 50F9654E1CD0360000ADE813 /* CCVRGenericRenderer.cpp */; }; + 50F965541CD0360000ADE813 /* CCVRGenericRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = 50F9654F1CD0360000ADE813 /* CCVRGenericRenderer.h */; }; + 50F965551CD0360000ADE813 /* CCVRGenericRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = 50F9654F1CD0360000ADE813 /* CCVRGenericRenderer.h */; }; + 50F965561CD0360000ADE813 /* CCVRGenericRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = 50F9654F1CD0360000ADE813 /* CCVRGenericRenderer.h */; }; + 50F965571CD0360000ADE813 /* CCVRProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 50F965501CD0360000ADE813 /* CCVRProtocol.h */; }; + 50F965581CD0360000ADE813 /* CCVRProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 50F965501CD0360000ADE813 /* CCVRProtocol.h */; }; + 50F965591CD0360000ADE813 /* CCVRProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 50F965501CD0360000ADE813 /* CCVRProtocol.h */; }; 52B47A2E1A5349A3004E4C60 /* HttpAsynConnection-apple.h in Headers */ = {isa = PBXBuildFile; fileRef = 52B47A291A5349A3004E4C60 /* HttpAsynConnection-apple.h */; }; 52B47A2F1A5349A3004E4C60 /* HttpAsynConnection-apple.m in Sources */ = {isa = PBXBuildFile; fileRef = 52B47A2A1A5349A3004E4C60 /* HttpAsynConnection-apple.m */; }; 52B47A301A5349A3004E4C60 /* HttpClient-apple.mm in Sources */ = {isa = PBXBuildFile; fileRef = 52B47A2B1A5349A3004E4C60 /* HttpClient-apple.mm */; }; @@ -6403,6 +6430,8 @@ 5012169F1AC473AD009A4BEA /* CCMaterial.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCMaterial.h; sourceTree = ""; }; 50272538190BF1B900AAF4ED /* cocos2d.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cocos2d.h; path = ../cocos/cocos2d.h; sourceTree = ""; }; 50272539190BF1B900AAF4ED /* cocos2d.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cocos2d.cpp; path = ../cocos/cocos2d.cpp; sourceTree = ""; }; + 502AF9771D0711B8006AF256 /* CCVRGenericHeadTracker.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = CCVRGenericHeadTracker.cpp; sourceTree = ""; }; + 5030C03E1CE6DF8B00C5D3E7 /* CCVRGenericHeadTracker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCVRGenericHeadTracker.h; sourceTree = ""; }; 5034C9FB191D591000CE6051 /* ccShader_PositionTextureColorAlphaTest.frag */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = ccShader_PositionTextureColorAlphaTest.frag; sourceTree = ""; }; 5034CA00191D591000CE6051 /* ccShader_PositionTextureA8Color.vert */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = ccShader_PositionTextureA8Color.vert; sourceTree = ""; }; 5034CA01191D591000CE6051 /* ccShader_PositionTextureA8Color.frag */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = ccShader_PositionTextureA8Color.frag; sourceTree = ""; }; @@ -6425,6 +6454,10 @@ 5034CA61191D91CF00CE6051 /* ccShader_PositionTextureColor.frag */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.glsl; path = ccShader_PositionTextureColor.frag; sourceTree = ""; }; 5034CA62191D91CF00CE6051 /* ccShader_PositionTextureColor_noMVP.vert */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.glsl; path = ccShader_PositionTextureColor_noMVP.vert; sourceTree = ""; }; 5034CA63191D91CF00CE6051 /* ccShader_PositionTextureColor_noMVP.frag */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.glsl; path = ccShader_PositionTextureColor_noMVP.frag; sourceTree = ""; }; + 503D4F611CE29D4E0054A2D1 /* CCVRDistortionMesh.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCVRDistortionMesh.cpp; sourceTree = ""; }; + 503D4F621CE29D4E0054A2D1 /* CCVRDistortionMesh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCVRDistortionMesh.h; sourceTree = ""; }; + 503D4F691CE2BDBE0054A2D1 /* CCVRDistortion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCVRDistortion.cpp; sourceTree = ""; }; + 503D4F6A1CE2BDBE0054A2D1 /* CCVRDistortion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCVRDistortion.h; sourceTree = ""; }; 503DD8CE1926736A00CD74DD /* CCApplication-ios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CCApplication-ios.h"; sourceTree = ""; }; 503DD8CF1926736A00CD74DD /* CCApplication-ios.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "CCApplication-ios.mm"; sourceTree = ""; }; 503DD8D01926736A00CD74DD /* CCCommon-ios.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "CCCommon-ios.mm"; sourceTree = ""; }; @@ -6690,6 +6723,9 @@ 50E6D33318E174130051CA34 /* UIVBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIVBox.h; sourceTree = ""; }; 50ED2BDC19BEAF7900A0AB90 /* UIEditBoxImpl-win32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIEditBoxImpl-win32.h"; sourceTree = ""; }; 50ED2BDE19BEAF7900A0AB90 /* UIEditBoxImpl-win32.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "UIEditBoxImpl-win32.cpp"; sourceTree = ""; }; + 50F9654E1CD0360000ADE813 /* CCVRGenericRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCVRGenericRenderer.cpp; sourceTree = ""; }; + 50F9654F1CD0360000ADE813 /* CCVRGenericRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCVRGenericRenderer.h; sourceTree = ""; }; + 50F965501CD0360000ADE813 /* CCVRProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCVRProtocol.h; sourceTree = ""; }; 50FCEB6A18C72017004AD434 /* ButtonReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ButtonReader.cpp; sourceTree = ""; }; 50FCEB6B18C72017004AD434 /* ButtonReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ButtonReader.h; sourceTree = ""; }; 50FCEB6D18C72017004AD434 /* CheckBoxReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CheckBoxReader.cpp; sourceTree = ""; }; @@ -7788,6 +7824,7 @@ 1551A340158F2AB200E66CFE /* Products */, 500DC89819105D41007B91BF /* renderer */, 1AAF5849180E40B8000584C8 /* storage */, + 50F9654D1CD0360000ADE813 /* vr */, 2905F9E618CF08D000240AA3 /* ui */, ); sourceTree = ""; @@ -9900,6 +9937,23 @@ path = apple; sourceTree = ""; }; + 50F9654D1CD0360000ADE813 /* vr */ = { + isa = PBXGroup; + children = ( + 502AF9771D0711B8006AF256 /* CCVRGenericHeadTracker.cpp */, + 50F9654E1CD0360000ADE813 /* CCVRGenericRenderer.cpp */, + 50F9654F1CD0360000ADE813 /* CCVRGenericRenderer.h */, + 50F965501CD0360000ADE813 /* CCVRProtocol.h */, + 503D4F611CE29D4E0054A2D1 /* CCVRDistortionMesh.cpp */, + 503D4F621CE29D4E0054A2D1 /* CCVRDistortionMesh.h */, + 503D4F691CE2BDBE0054A2D1 /* CCVRDistortion.cpp */, + 503D4F6A1CE2BDBE0054A2D1 /* CCVRDistortion.h */, + 5030C03E1CE6DF8B00C5D3E7 /* CCVRGenericHeadTracker.h */, + ); + name = vr; + path = ../cocos/vr; + sourceTree = ""; + }; 50FCEB6818C72017004AD434 /* WidgetReader */ = { isa = PBXGroup; children = ( @@ -11378,6 +11432,7 @@ 298C75D71C0465D1006BAE63 /* CCStencilStateManager.hpp in Headers */, B6DD2FDB1B04825B00E47F5F /* DetourLocalBoundary.h in Headers */, B6CAB3491AF9AA1A00B9B856 /* gim_clip_polygon.h in Headers */, + 503D4F661CE29D4E0054A2D1 /* CCVRDistortionMesh.h in Headers */, B677B0DB1B18492D006762CB /* CCNavMeshUtils.h in Headers */, B6CAAFE41AF9A9E100B9B856 /* CCPhysics3D.h in Headers */, 15AE1A7F19AAD40300C27E9E /* b2DistanceJoint.h in Headers */, @@ -11582,6 +11637,7 @@ B6CAB3271AF9AA1A00B9B856 /* btGImpactBvh.h in Headers */, 15AE198D19AAD36E00C27E9E /* CheckBoxReader.h in Headers */, B29A7E0919EE1B7700872B35 /* AttachmentLoader.h in Headers */, + 50F965541CD0360000ADE813 /* CCVRGenericRenderer.h in Headers */, 1A01C68818F57BE800EFE3A6 /* CCBool.h in Headers */, B29A7E3319EE1B7700872B35 /* SlotData.h in Headers */, B665E2741AA80A6500DDB1C5 /* CCPUDoPlacementParticleEventHandler.h in Headers */, @@ -11852,6 +11908,7 @@ B6CAB3A51AF9AA1A00B9B856 /* btConeTwistConstraint.h in Headers */, 15AE181E19AAD2F700C27E9E /* CCBundle3DData.h in Headers */, 1A5702F8180BCE750088DEC7 /* CCTMXTiledMap.h in Headers */, + 503D4F6E1CE2BDBE0054A2D1 /* CCVRDistortion.h in Headers */, B665E2801AA80A6500DDB1C5 /* CCPUDoScaleEventHandlerTranslator.h in Headers */, 5034CA21191D591100CE6051 /* ccShader_PositionTextureColorAlphaTest.frag in Headers */, D0FD03491A3B51AA00825BB5 /* CCAllocatorBase.h in Headers */, @@ -11869,6 +11926,7 @@ 15AE191019AAD35000C27E9E /* CCInputDelegate.h in Headers */, B665E4301AA80A6600DDB1C5 /* CCPUVelocityMatchingAffectorTranslator.h in Headers */, 50864CA91C7BC1B000B3BAB1 /* cpDampedRotarySpring.h in Headers */, + 5030C0421CE6DF8B00C5D3E7 /* CCVRGenericHeadTracker.h in Headers */, 15AE184C19AAD30800C27E9E /* SimpleAudioEngine.h in Headers */, 50ABBDA11925AB4100A911A9 /* CCGroupCommand.h in Headers */, 50864C911C7BC1B000B3BAB1 /* chipmunk_private.h in Headers */, @@ -12186,6 +12244,7 @@ 50ABBEB11925AB6F00A911A9 /* CCUserDefault.h in Headers */, B29A7DEF19EE1B7700872B35 /* SkeletonBounds.h in Headers */, D0FD034D1A3B51AA00825BB5 /* CCAllocatorDiagnostics.h in Headers */, + 50F965571CD0360000ADE813 /* CCVRProtocol.h in Headers */, 50ABBEC71925AB6F00A911A9 /* etc1.h in Headers */, B6CAB27B1AF9AA1A00B9B856 /* SphereTriangleDetector.h in Headers */, B29A7E3519EE1B7700872B35 /* AnimationStateData.h in Headers */, @@ -12337,6 +12396,7 @@ 507B3D691C31BDD30067B53E /* CCPUDoPlacementParticleEventHandler.h in Headers */, 507B3D6A1C31BDD30067B53E /* gim_memory.h in Headers */, 507B3D6B1C31BDD30067B53E /* btGpu3DGridBroadphaseSharedDefs.h in Headers */, + 50F965561CD0360000ADE813 /* CCVRGenericRenderer.h in Headers */, 507B3D6C1C31BDD30067B53E /* b2Collision.h in Headers */, 507B3D6D1C31BDD30067B53E /* CCPUOnVelocityObserver.h in Headers */, 507B3D6E1C31BDD30067B53E /* btMultiBodyDynamicsWorld.h in Headers */, @@ -12567,6 +12627,7 @@ 507B3E461C31BDD30067B53E /* Bone.h in Headers */, 507B3E471C31BDD30067B53E /* CCPUForceFieldAffectorTranslator.h in Headers */, 507B3E481C31BDD30067B53E /* CCBillBoard.h in Headers */, + 5030C0441CE6DF8B00C5D3E7 /* CCVRGenericHeadTracker.h in Headers */, 507B3E491C31BDD30067B53E /* CCTrianglesCommand.h in Headers */, 507B3E4A1C31BDD30067B53E /* CCPUDynamicAttributeTranslator.h in Headers */, 507B3E4B1C31BDD30067B53E /* btSequentialImpulseConstraintSolver.h in Headers */, @@ -13052,6 +13113,7 @@ 507B401C1C31BDD30067B53E /* CCNinePatchImageParser.h in Headers */, 507B401D1C31BDD30067B53E /* CCController.h in Headers */, 507B401E1C31BDD30067B53E /* btGpuDefines.h in Headers */, + 503D4F701CE2BDBE0054A2D1 /* CCVRDistortion.h in Headers */, 507B401F1C31BDD30067B53E /* ComAudioReader.h in Headers */, 507B40201C31BDD30067B53E /* CCGameController.h in Headers */, 507B40211C31BDD30067B53E /* boxBoxDistance.h in Headers */, @@ -13083,6 +13145,7 @@ 507B403A1C31BDD30067B53E /* CCTimeLine.h in Headers */, 507B403B1C31BDD30067B53E /* UILayoutComponent.h in Headers */, 507B403C1C31BDD30067B53E /* btConvexConvexAlgorithm.h in Headers */, + 50F965591CD0360000ADE813 /* CCVRProtocol.h in Headers */, 507B403D1C31BDD30067B53E /* CCPUGravityAffectorTranslator.h in Headers */, 507B403E1C31BDD30067B53E /* MathUtil.h in Headers */, 507B403F1C31BDD30067B53E /* CCInteger.h in Headers */, @@ -13115,6 +13178,7 @@ 507B405A1C31BDD30067B53E /* CCPUDoFreezeEventHandler.h in Headers */, 507B405B1C31BDD30067B53E /* CCGL.h in Headers */, 507B405C1C31BDD30067B53E /* CCArmatureAnimation.h in Headers */, + 503D4F681CE29D4E0054A2D1 /* CCVRDistortionMesh.h in Headers */, 507B405D1C31BDD30067B53E /* b2ContactManager.h in Headers */, 507B405E1C31BDD30067B53E /* CCVertexIndexData.h in Headers */, 507B405F1C31BDD30067B53E /* Vec3.h in Headers */, @@ -13378,6 +13442,7 @@ B665E2751AA80A6500DDB1C5 /* CCPUDoPlacementParticleEventHandler.h in Headers */, B6CAB35C1AF9AA1A00B9B856 /* gim_memory.h in Headers */, B6CAB43A1AF9AA1A00B9B856 /* btGpu3DGridBroadphaseSharedDefs.h in Headers */, + 50F965551CD0360000ADE813 /* CCVRGenericRenderer.h in Headers */, 15AE1A4019AAD3D500C27E9E /* b2Collision.h in Headers */, B665E36D1AA80A6500DDB1C5 /* CCPUOnVelocityObserver.h in Headers */, B6CAB4061AF9AA1A00B9B856 /* btMultiBodyDynamicsWorld.h in Headers */, @@ -13608,6 +13673,7 @@ B29A7E0E19EE1B7700872B35 /* Bone.h in Headers */, B665E2BD1AA80A6500DDB1C5 /* CCPUForceFieldAffectorTranslator.h in Headers */, B60C5BD719AC68B10056FBDE /* CCBillBoard.h in Headers */, + 5030C0431CE6DF8B00C5D3E7 /* CCVRGenericHeadTracker.h in Headers */, B230ED7419B417AE00364AA8 /* CCTrianglesCommand.h in Headers */, B665E2911AA80A6500DDB1C5 /* CCPUDynamicAttributeTranslator.h in Headers */, B6CAB3D01AF9AA1A00B9B856 /* btSequentialImpulseConstraintSolver.h in Headers */, @@ -14094,6 +14160,7 @@ 291901441B05895600F8B4BA /* CCNinePatchImageParser.h in Headers */, 3E6176691960F89B00DE83F5 /* CCController.h in Headers */, B6CAB43E1AF9AA1A00B9B856 /* btGpuDefines.h in Headers */, + 503D4F6F1CE2BDBE0054A2D1 /* CCVRDistortion.h in Headers */, 3823841D1A2590D2002C4610 /* ComAudioReader.h in Headers */, 3E6176781960F89B00DE83F5 /* CCGameController.h in Headers */, B6CAB4C81AF9AA1A00B9B856 /* boxBoxDistance.h in Headers */, @@ -14125,6 +14192,7 @@ 15AE198019AAD35700C27E9E /* CCTimeLine.h in Headers */, 38B8E2E419E671D2002D7CE7 /* UILayoutComponent.h in Headers */, B6CAB2481AF9AA1A00B9B856 /* btConvexConvexAlgorithm.h in Headers */, + 50F965581CD0360000ADE813 /* CCVRProtocol.h in Headers */, B665E2CD1AA80A6500DDB1C5 /* CCPUGravityAffectorTranslator.h in Headers */, 50ABBD4F1925AB0000A911A9 /* MathUtil.h in Headers */, 1A01C69718F57BE800EFE3A6 /* CCInteger.h in Headers */, @@ -14157,6 +14225,7 @@ B665E26D1AA80A6500DDB1C5 /* CCPUDoFreezeEventHandler.h in Headers */, 50643BD519BFAECF00EF68ED /* CCGL.h in Headers */, 15AE193919AAD35100C27E9E /* CCArmatureAnimation.h in Headers */, + 503D4F671CE29D4E0054A2D1 /* CCVRDistortionMesh.h in Headers */, 15AE1AA419AAD40300C27E9E /* b2ContactManager.h in Headers */, B276EF601988D1D500CD400F /* CCVertexIndexData.h in Headers */, 50ABBD5F1925AB0000A911A9 /* Vec3.h in Headers */, @@ -14429,6 +14498,7 @@ B6CAB2811AF9AA1A00B9B856 /* btBoxShape.cpp in Sources */, 50ABBE311925AB6F00A911A9 /* CCConfiguration.cpp in Sources */, B665E3821AA80A6500DDB1C5 /* CCPUPathFollower.cpp in Sources */, + 502AF9781D0711B8006AF256 /* CCVRGenericHeadTracker.cpp in Sources */, 1A01C6A418F58F7500EFE3A6 /* CCNotificationCenter.cpp in Sources */, 15AE1A5D19AAD40300C27E9E /* b2Body.cpp in Sources */, 15AE1BDA19AAE01E00C27E9E /* CCControlSwitch.cpp in Sources */, @@ -14562,6 +14632,7 @@ 382383F81A258FA7002C4610 /* idl_gen_general.cpp in Sources */, 15AE1C1319AAE2C600C27E9E /* CCPhysicsSprite.cpp in Sources */, 382384131A259092002C4610 /* NodeReaderProtocol.cpp in Sources */, + 503D4F6B1CE2BDBE0054A2D1 /* CCVRDistortion.cpp in Sources */, B665E2C21AA80A6500DDB1C5 /* CCPUGeometryRotatorTranslator.cpp in Sources */, 15AE1A5F19AAD40300C27E9E /* b2ContactManager.cpp in Sources */, B6CAB2451AF9AA1A00B9B856 /* btConvexConvexAlgorithm.cpp in Sources */, @@ -14837,6 +14908,7 @@ 1A570286180BCC900088DEC7 /* CCSpriteFrame.cpp in Sources */, B24AA989195A675C007B4522 /* CCFastTMXTiledMap.cpp in Sources */, B6CAB4DF1AF9AA1A00B9B856 /* SpuSampleTask.cpp in Sources */, + 50F965511CD0360000ADE813 /* CCVRGenericRenderer.cpp in Sources */, B29A7E2F19EE1B7700872B35 /* SkeletonAnimation.cpp in Sources */, B60C5BD419AC68B10056FBDE /* CCBillBoard.cpp in Sources */, 15AE199619AAD39600C27E9E /* ListViewReader.cpp in Sources */, @@ -15107,6 +15179,7 @@ B68778F81A8CA82E00643ABF /* CCParticle3DAffector.cpp in Sources */, 15AE19A019AAD39600C27E9E /* TextAtlasReader.cpp in Sources */, 15AE1A2A19AAD3D500C27E9E /* b2Distance.cpp in Sources */, + 503D4F631CE29D4E0054A2D1 /* CCVRDistortionMesh.cpp in Sources */, 50ABBE6D1925AB6F00A911A9 /* CCEventListenerKeyboard.cpp in Sources */, 15FB20871AE7C57D00C31518 /* shapes.cc in Sources */, B665E27A1AA80A6500DDB1C5 /* CCPUDoScaleEventHandler.cpp in Sources */, @@ -15276,6 +15349,7 @@ 507B39D01C31BDD30067B53E /* CCSet.cpp in Sources */, 507B39D11C31BDD30067B53E /* CCString.cpp in Sources */, 507B39D21C31BDD30067B53E /* sweep.cc in Sources */, + 502AF97A1D0711CA006AF256 /* CCVRGenericHeadTracker.cpp in Sources */, 507B39D31C31BDD30067B53E /* ImageViewReader.cpp in Sources */, 507B39D41C31BDD30067B53E /* btGeneric6DofSpringConstraint.cpp in Sources */, 507B39D51C31BDD30067B53E /* CCPUAffectorManager.cpp in Sources */, @@ -15409,6 +15483,7 @@ 507B3A551C31BDD30067B53E /* CCArmatureDefine.cpp in Sources */, 507B3A561C31BDD30067B53E /* CCPUOnRandomObserverTranslator.cpp in Sources */, 507B3A571C31BDD30067B53E /* CCMeshCommand.cpp in Sources */, + 503D4F6D1CE2BDBE0054A2D1 /* CCVRDistortion.cpp in Sources */, 507B3A581C31BDD30067B53E /* CCStencilStateManager.cpp in Sources */, 507B3A591C31BDD30067B53E /* CCComRender.cpp in Sources */, 507B3A5A1C31BDD30067B53E /* SpriteReader.cpp in Sources */, @@ -15684,6 +15759,7 @@ 507B3B681C31BDD30067B53E /* btGpu3DGridBroadphase.cpp in Sources */, 507B3B691C31BDD30067B53E /* CCDecorativeDisplay.cpp in Sources */, 507B3B6A1C31BDD30067B53E /* TextReader.cpp in Sources */, + 50F965531CD0360000ADE813 /* CCVRGenericRenderer.cpp in Sources */, 507B3B6B1C31BDD30067B53E /* Mat4.cpp in Sources */, 507B3B6C1C31BDD30067B53E /* CCClippingNode.cpp in Sources */, 507B3B6D1C31BDD30067B53E /* UIButton.cpp in Sources */, @@ -15953,6 +16029,7 @@ 507B3C741C31BDD30067B53E /* CCPUPlaneColliderTranslator.cpp in Sources */, 507B3C751C31BDD30067B53E /* idl_gen_fbs.cpp in Sources */, 507B3C761C31BDD30067B53E /* UIPageViewIndicator.cpp in Sources */, + 503D4F651CE29D4E0054A2D1 /* CCVRDistortionMesh.cpp in Sources */, 507B3C771C31BDD30067B53E /* CCPUColorAffector.cpp in Sources */, 507B3C781C31BDD30067B53E /* CCPUBaseForceAffector.cpp in Sources */, 507B3C791C31BDD30067B53E /* UILoadingBar.cpp in Sources */, @@ -16122,6 +16199,7 @@ 1A01C69918F57BE800EFE3A6 /* CCSet.cpp in Sources */, 1A01C69D18F57BE800EFE3A6 /* CCString.cpp in Sources */, 15FB20981AE7C57D00C31518 /* sweep.cc in Sources */, + 502AF9791D0711C9006AF256 /* CCVRGenericHeadTracker.cpp in Sources */, 15AE199219AAD37300C27E9E /* ImageViewReader.cpp in Sources */, B6CAB3BC1AF9AA1A00B9B856 /* btGeneric6DofSpringConstraint.cpp in Sources */, B665E1F71AA80A6500DDB1C5 /* CCPUAffectorManager.cpp in Sources */, @@ -16255,6 +16333,7 @@ 15AE193C19AAD35100C27E9E /* CCArmatureDefine.cpp in Sources */, B665E35F1AA80A6500DDB1C5 /* CCPUOnRandomObserverTranslator.cpp in Sources */, B29594B51926D5EC003EEF37 /* CCMeshCommand.cpp in Sources */, + 503D4F6C1CE2BDBE0054A2D1 /* CCVRDistortion.cpp in Sources */, 298C75D61C0465D1006BAE63 /* CCStencilStateManager.cpp in Sources */, 15AE194B19AAD35100C27E9E /* CCComRender.cpp in Sources */, 382384451A25915C002C4610 /* SpriteReader.cpp in Sources */, @@ -16530,6 +16609,7 @@ B6CAB4341AF9AA1A00B9B856 /* btGpu3DGridBroadphase.cpp in Sources */, 15AE195119AAD35100C27E9E /* CCDecorativeDisplay.cpp in Sources */, 15AE19BA19AAD39700C27E9E /* TextReader.cpp in Sources */, + 50F965521CD0360000ADE813 /* CCVRGenericRenderer.cpp in Sources */, 50ABBD491925AB0000A911A9 /* Mat4.cpp in Sources */, 1A570203180BCBD40088DEC7 /* CCClippingNode.cpp in Sources */, 15AE1B8619AADA9A00C27E9E /* UIButton.cpp in Sources */, @@ -16800,6 +16880,7 @@ B665E3931AA80A6500DDB1C5 /* CCPUPlaneColliderTranslator.cpp in Sources */, 382383F71A258FA7002C4610 /* idl_gen_fbs.cpp in Sources */, B5A738971BB0051F00BAAEF8 /* UIPageViewIndicator.cpp in Sources */, + 503D4F641CE29D4E0054A2D1 /* CCVRDistortionMesh.cpp in Sources */, B665E24B1AA80A6500DDB1C5 /* CCPUColorAffector.cpp in Sources */, B665E20F1AA80A6500DDB1C5 /* CCPUBaseForceAffector.cpp in Sources */, 15AE1B7419AADA9A00C27E9E /* UILoadingBar.cpp in Sources */, diff --git a/cocos/2d/CCCamera.cpp b/cocos/2d/CCCamera.cpp index b44c20b24b..4f3a81d2b2 100644 --- a/cocos/2d/CCCamera.cpp +++ b/cocos/2d/CCCamera.cpp @@ -41,16 +41,7 @@ NS_CC_BEGIN Camera* Camera::_visitingCamera = nullptr; experimental::Viewport Camera::_defaultViewport; -Camera* Camera::getDefaultCamera() -{ - auto scene = Director::getInstance()->getRunningScene(); - if(scene) - { - return scene->getDefaultCamera(); - } - - return nullptr; -} +// start static methods Camera* Camera::create() { @@ -88,6 +79,33 @@ Camera* Camera::createOrthographic(float zoomX, float zoomY, float nearPlane, fl return nullptr; } +Camera* Camera::getDefaultCamera() +{ + auto scene = Director::getInstance()->getRunningScene(); + if(scene) + { + return scene->getDefaultCamera(); + } + + return nullptr; +} + +const experimental::Viewport& Camera::getDefaultViewport() +{ + return _defaultViewport; +} +void Camera::setDefaultViewport(const experimental::Viewport& vp) +{ + _defaultViewport = vp; +} + +const Camera* Camera::getVisitingCamera() +{ + return _visitingCamera; +} + +// end static methods + Camera::Camera() : _scene(nullptr) , _viewProjectionDirty(true) @@ -421,11 +439,19 @@ void Camera::setFrameBufferObject(experimental::FrameBuffer *fbo) } } +void Camera::apply() +{ + applyFrameBufferObject(); + applyViewport(); +} + void Camera::applyFrameBufferObject() { if(nullptr == _fbo) { - experimental::FrameBuffer::applyDefaultFBO(); + // inherit from context if it doesn't have a FBO + // don't call apply the default one +// experimental::FrameBuffer::applyDefaultFBO(); } else { @@ -433,14 +459,10 @@ void Camera::applyFrameBufferObject() } } -void Camera::apply() -{ - applyFrameBufferObject(); - applyViewport(); -} - void Camera::applyViewport() { + glGetIntegerv(GL_VIEWPORT, _oldViewport); + if(nullptr == _fbo) { glViewport(getDefaultViewport()._left, getDefaultViewport()._bottom, getDefaultViewport()._width, getDefaultViewport()._height); @@ -450,7 +472,36 @@ void Camera::applyViewport() glViewport(_viewport._left * _fbo->getWidth(), _viewport._bottom * _fbo->getHeight(), _viewport._width * _fbo->getWidth(), _viewport._height * _fbo->getHeight()); } - +} + +void Camera::setViewport(const experimental::Viewport& vp) +{ + _viewport = vp; +} + +void Camera::restore() +{ + restoreFrameBufferObject(); + restoreViewport(); +} + +void Camera::restoreFrameBufferObject() +{ + if(nullptr == _fbo) + { + // it was inherited from context if it doesn't have a FBO + // don't call restore the default one... just keep using the previous one +// experimental::FrameBuffer::applyDefaultFBO(); + } + else + { + _fbo->restoreFBO(); + } +} + +void Camera::restoreViewport() +{ + glViewport(_oldViewport[0], _oldViewport[1], _oldViewport[2], _oldViewport[3]); } int Camera::getRenderOrder() const diff --git a/cocos/2d/CCCamera.h b/cocos/2d/CCCamera.h index 7f030c6602..1a720c63b4 100644 --- a/cocos/2d/CCCamera.h +++ b/cocos/2d/CCCamera.h @@ -98,7 +98,20 @@ public: /** create default camera, the camera type depends on Director::getProjection, the depth of the default camera is 0 */ static Camera* create(); - + + /** + * Get the visiting camera , the visiting camera shall be set on Scene::render + */ + static const Camera* getVisitingCamera(); + + static const experimental::Viewport& getDefaultViewport(); + static void setDefaultViewport(const experimental::Viewport& vp); + + /** + * Get the default camera of the current running scene. + */ + static Camera* getDefaultCamera(); + /** * Gets the type of camera. * @@ -227,15 +240,6 @@ public: virtual void onEnter() override; virtual void onExit() override; - /** - * Get the visiting camera , the visiting camera shall be set on Scene::render - */ - static const Camera* getVisitingCamera() { return _visitingCamera; } - - /** - * Get the default camera of the current running scene. - */ - static Camera* getDefaultCamera(); /** Before rendering scene with this camera, the background need to be cleared. It clears the depth buffer with max depth by default. Use setBackgroundBrush to modify the default behavior */ @@ -244,32 +248,37 @@ public: Apply the FBO, RenderTargets and viewport. */ void apply(); + /** + Restor the FBO, RenderTargets and viewport. + */ + void restore(); + /** Set FBO, which will attach several render target for the rendered result. - */ + */ void setFrameBufferObject(experimental::FrameBuffer* fbo); /** Set Viewport for camera. */ - void setViewport(const experimental::Viewport& vp) { _viewport = vp; } - + void setViewport(const experimental::Viewport& vp); + /** * Whether or not the viewprojection matrix was updated since the last frame. * @return True if the viewprojection matrix was updated since the last frame. */ bool isViewProjectionUpdated() const {return _viewProjectionUpdated;} - + /** * set the background brush. See CameraBackgroundBrush for more information. * @param clearBrush Brush used to clear the background */ void setBackgroundBrush(CameraBackgroundBrush* clearBrush); - + /** * Get clear brush */ CameraBackgroundBrush* getBackgroundBrush() const { return _clearBrush; } - + virtual void visit(Renderer* renderer, const Mat4 &parentTransform, uint32_t parentFlags) override; bool isBrushValid(); @@ -277,28 +286,34 @@ public: CC_CONSTRUCTOR_ACCESS: Camera(); ~Camera(); - + /** * Set the scene,this method shall not be invoke manually */ void setScene(Scene* scene); - + /**set additional matrix for the projection matrix, it multiplies mat to projection matrix when called, used by WP8*/ void setAdditionalProjection(const Mat4& mat); - + /** init camera */ bool initDefault(); bool initPerspective(float fieldOfView, float aspectRatio, float nearPlane, float farPlane); bool initOrthographic(float zoomX, float zoomY, float nearPlane, float farPlane); void applyFrameBufferObject(); void applyViewport(); + void restoreFrameBufferObject(); + void restoreViewport(); + protected: + static Camera* _visitingCamera; + static experimental::Viewport _defaultViewport; Scene* _scene; //Scene camera belongs to Mat4 _projection; mutable Mat4 _view; mutable Mat4 _viewInv; mutable Mat4 _viewProjection; + Vec3 _up; Camera::Type _type; float _fieldOfView; @@ -312,20 +327,14 @@ protected: mutable Frustum _frustum; // camera frustum mutable bool _frustumDirty; int8_t _depth; //camera depth, the depth of camera with CameraFlag::DEFAULT flag is 0 by default, a camera with larger depth is drawn on top of camera with smaller depth - static Camera* _visitingCamera; - + CameraBackgroundBrush* _clearBrush; //brush used to clear the back ground - + experimental::Viewport _viewport; - experimental::FrameBuffer* _fbo; -protected: - static experimental::Viewport _defaultViewport; -public: - static const experimental::Viewport& getDefaultViewport() { return _defaultViewport; } - static void setDefaultViewport(const experimental::Viewport& vp) { _defaultViewport = vp; } + GLint _oldViewport[4]; }; NS_CC_END -#endif// __CCCAMERA_H_ +#endif// __CCCAMERA_H_ \ No newline at end of file diff --git a/cocos/2d/CCNode.cpp b/cocos/2d/CCNode.cpp index cf55194147..076deeaad1 100644 --- a/cocos/2d/CCNode.cpp +++ b/cocos/2d/CCNode.cpp @@ -1788,6 +1788,7 @@ void Node::setAdditionalTransform(Mat4* additionalTransform) if (additionalTransform == nullptr) { _useAdditionalTransform = false; + _additionalTransform = Mat4::IDENTITY; } else { @@ -1797,6 +1798,12 @@ void Node::setAdditionalTransform(Mat4* additionalTransform) _transformUpdated = _transformDirty = _inverseDirty = true; } +void Node::setAdditionalTransform(const Mat4& additionalTransform) +{ + _useAdditionalTransform = true; + _additionalTransform = additionalTransform; + _transformUpdated = _transformDirty = _inverseDirty = true; +} AffineTransform Node::getParentToNodeAffineTransform() const { diff --git a/cocos/2d/CCNode.h b/cocos/2d/CCNode.h index 78fd864165..31dc80b559 100644 --- a/cocos/2d/CCNode.h +++ b/cocos/2d/CCNode.h @@ -1644,6 +1644,7 @@ public: * @param additionalTransform An additional transform matrix. */ void setAdditionalTransform(Mat4* additionalTransform); + void setAdditionalTransform(const Mat4& additionalTransform); void setAdditionalTransform(const AffineTransform& additionalTransform); /// @} end of Coordinate Converters diff --git a/cocos/2d/CCScene.cpp b/cocos/2d/CCScene.cpp index 7233aa92b1..907be59d73 100644 --- a/cocos/2d/CCScene.cpp +++ b/cocos/2d/CCScene.cpp @@ -184,7 +184,7 @@ const std::vector& Scene::getCameras() return _cameras; } -void Scene::render(Renderer* renderer) +void Scene::render(Renderer* renderer, const Mat4& eyeTransform, const Mat4* eyeProjection) { auto director = Director::getInstance(); Camera* defaultCamera = nullptr; @@ -194,13 +194,25 @@ void Scene::render(Renderer* renderer) { if (!camera->isVisible()) continue; - + Camera::_visitingCamera = camera; if (Camera::_visitingCamera->getCameraFlag() == CameraFlag::DEFAULT) { defaultCamera = Camera::_visitingCamera; } - + + // There are two ways to modify the "default camera" with the eye Transform: + // a) modify the "nodeToParentTransform" matrix + // b) modify the "additional transform" matrix + // both alternatives are correct, if the user manually modifies the camera with a camera->setPosition() + // then the "nodeToParent transform" will be lost. + // And it is important that the change is "permament", because the matrix might be used for calculate + // culling and other stuff. + if (eyeProjection) + camera->setAdditionalProjection(*eyeProjection * camera->getProjectionMatrix().getInversed()); + else + camera->setAdditionalTransform(eyeTransform.getInversed()); + director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION); director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, Camera::_visitingCamera->getViewProjectionMatrix()); camera->apply(); @@ -214,12 +226,17 @@ void Scene::render(Renderer* renderer) _navMesh->debugDraw(renderer); } #endif - + renderer->render(); - + camera->restore(); + director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION); + + // we shouldn't restore the transform matrix since it could be used + // from "update" or other parts of the game to calculate culling or something else. +// camera->setNodeToParentTransform(eyeCopy); } - + #if CC_USE_3D_PHYSICS && CC_ENABLE_BULLET_INTEGRATION if (_physics3DWorld && _physics3DWorld->isDebugDrawEnabled()) { @@ -232,16 +249,16 @@ void Scene::render(Renderer* renderer) #endif Camera::_visitingCamera = nullptr; - experimental::FrameBuffer::applyDefaultFBO(); +// experimental::FrameBuffer::applyDefaultFBO(); } void Scene::removeAllChildren() { if (_defaultCamera) _defaultCamera->retain(); - + Node::removeAllChildren(); - + if (_defaultCamera) { addChild(_defaultCamera); @@ -290,21 +307,21 @@ bool Scene::initWithPhysics() #if CC_USE_PHYSICS _physicsWorld = PhysicsWorld::construct(this); #endif - + bool ret = false; do { Director * director; CC_BREAK_IF( ! (director = Director::getInstance()) ); - + this->setContentSize(director->getWinSize()); - + #if CC_USE_3D_PHYSICS && CC_ENABLE_BULLET_INTEGRATION Physics3DWorldDes info; CC_BREAK_IF(! (_physics3DWorld = Physics3DWorld::create(&info))); _physics3DWorld->retain(); #endif - + // success ret = true; } while (0); @@ -320,7 +337,7 @@ void Scene::stepPhysicsAndNavigation(float deltaTime) if (_physicsWorld && _physicsWorld->isAutoStep()) _physicsWorld->update(deltaTime); #endif - + #if CC_USE_3D_PHYSICS && CC_ENABLE_BULLET_INTEGRATION if (_physics3DWorld) { diff --git a/cocos/2d/CCScene.h b/cocos/2d/CCScene.h index fc1735c8bd..282afeb135 100644 --- a/cocos/2d/CCScene.h +++ b/cocos/2d/CCScene.h @@ -109,7 +109,7 @@ public: * @param renderer The renderer use to render the scene. * @js NA */ - virtual void render(Renderer* renderer); + virtual void render(Renderer* renderer, const Mat4& eyeTransform, const Mat4* eyeProjection = nullptr); /** override function */ virtual void removeAllChildren() override; diff --git a/cocos/2d/CCSprite.cpp b/cocos/2d/CCSprite.cpp index 79e49df30d..99faf5a541 100644 --- a/cocos/2d/CCSprite.cpp +++ b/cocos/2d/CCSprite.cpp @@ -463,7 +463,7 @@ void Sprite::setVertexRect(const Rect& rect) _rect = rect; } -void Sprite::setTextureCoords(Rect rect) +void Sprite::setTextureCoords(const Rect& rectInPoint) { Texture2D *tex = _batchNode ? _textureAtlas->getTexture() : _texture; if (tex == nullptr) @@ -471,7 +471,7 @@ void Sprite::setTextureCoords(Rect rect) return; } - rect = CC_RECT_POINTS_TO_PIXELS(rect); + auto rectInPixels = CC_RECT_POINTS_TO_PIXELS(rectInPoint); float atlasWidth = (float)tex->getPixelsWide(); float atlasHeight = (float)tex->getPixelsHigh(); @@ -481,15 +481,15 @@ void Sprite::setTextureCoords(Rect rect) if (_rectRotated) { #if CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL - left = (2*rect.origin.x+1)/(2*atlasWidth); - right = left+(rect.size.height*2-2)/(2*atlasWidth); - top = (2*rect.origin.y+1)/(2*atlasHeight); - bottom = top+(rect.size.width*2-2)/(2*atlasHeight); + left = (2*rectInPixels.origin.x+1)/(2*atlasWidth); + right = left+(rectInPixels.size.height*2-2)/(2*atlasWidth); + top = (2*rectInPixels.origin.y+1)/(2*atlasHeight); + bottom = top+(rectInPixels.size.width*2-2)/(2*atlasHeight); #else - left = rect.origin.x/atlasWidth; - right = (rect.origin.x+rect.size.height) / atlasWidth; - top = rect.origin.y/atlasHeight; - bottom = (rect.origin.y+rect.size.width) / atlasHeight; + left = rectInPixels.origin.x/atlasWidth; + right = (rectInPixels.origin.x+rectInPixels.size.height) / atlasWidth; + top = rectInPixels.origin.y/atlasHeight; + bottom = (rectInPixels.origin.y+rectInPixels.size.width) / atlasHeight; #endif // CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL if (_flippedX) @@ -514,15 +514,15 @@ void Sprite::setTextureCoords(Rect rect) else { #if CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL - left = (2*rect.origin.x+1)/(2*atlasWidth); - right = left + (rect.size.width*2-2)/(2*atlasWidth); - top = (2*rect.origin.y+1)/(2*atlasHeight); - bottom = top + (rect.size.height*2-2)/(2*atlasHeight); + left = (2*rectInPixels.origin.x+1)/(2*atlasWidth); + right = left + (rectInPixels.size.width*2-2)/(2*atlasWidth); + top = (2*rectInPixels.origin.y+1)/(2*atlasHeight); + bottom = top + (rectInPixels.size.height*2-2)/(2*atlasHeight); #else - left = rect.origin.x/atlasWidth; - right = (rect.origin.x + rect.size.width) / atlasWidth; - top = rect.origin.y/atlasHeight; - bottom = (rect.origin.y + rect.size.height) / atlasHeight; + left = rectInPixels.origin.x/atlasWidth; + right = (rectInPixels.origin.x + rectInPixels.size.width) / atlasWidth; + top = rectInPixels.origin.y/atlasHeight; + bottom = (rectInPixels.origin.y + rectInPixels.size.height) / atlasHeight; #endif // ! CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL if(_flippedX) diff --git a/cocos/2d/CCSprite.h b/cocos/2d/CCSprite.h index b58166da34..c5adf0eced 100644 --- a/cocos/2d/CCSprite.h +++ b/cocos/2d/CCSprite.h @@ -585,7 +585,7 @@ CC_CONSTRUCTOR_ACCESS : protected: void updateColor() override; - virtual void setTextureCoords(Rect rect); + virtual void setTextureCoords(const Rect& rect); virtual void updateBlendFunc(); virtual void setReorderChildDirtyRecursively(); virtual void setDirtyRecursively(bool value); diff --git a/cocos/2d/libcocos2d.vcxproj b/cocos/2d/libcocos2d.vcxproj index e6ffde8201..11d9f75075 100644 --- a/cocos/2d/libcocos2d.vcxproj +++ b/cocos/2d/libcocos2d.vcxproj @@ -670,6 +670,10 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\chipmunk\prebuilt\win32\release-lib\*.* + + + + @@ -1295,6 +1299,11 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\chipmunk\prebuilt\win32\release-lib\*.* + + + + + @@ -1394,4 +1403,4 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\chipmunk\prebuilt\win32\release-lib\*.* - + \ No newline at end of file diff --git a/cocos/2d/libcocos2d.vcxproj.filters b/cocos/2d/libcocos2d.vcxproj.filters index e791e55360..008e8c013e 100644 --- a/cocos/2d/libcocos2d.vcxproj.filters +++ b/cocos/2d/libcocos2d.vcxproj.filters @@ -286,6 +286,9 @@ {8686c220-18af-4bea-abce-f4797afd01f1} + + {5cbd879f-02ae-4f28-af33-2c4f980dd6f0} + @@ -1953,6 +1956,18 @@ cocostudio\json + + vr + + + vr + + + vr + + + vr + @@ -3815,6 +3830,21 @@ cocostudio\json + + vr + + + vr + + + vr + + + vr + + + vr + diff --git a/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems b/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems index 36fb0e93e7..ec12653b87 100644 --- a/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems +++ b/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems @@ -572,6 +572,10 @@ + + + + @@ -1175,6 +1179,10 @@ + + + + diff --git a/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems.filters b/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems.filters index c055afb439..3929652c29 100644 --- a/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems.filters +++ b/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems.filters @@ -1886,6 +1886,18 @@ cocostudio\components + + vr + + + vr + + + vr + + + vr + @@ -3608,6 +3620,18 @@ cocostudio\components + + vr + + + vr + + + vr + + + vr + @@ -3889,6 +3913,9 @@ {fe153deb-3cee-416d-bdcb-fa409ae48240} + + {485c9ff1-3f65-46dc-a4ee-4eeb3f6d31f1} + diff --git a/cocos/2d/libcocos2d_win10/libcocos2d.vcxproj b/cocos/2d/libcocos2d_win10/libcocos2d.vcxproj index 6f20946c2b..66e1266cef 100644 --- a/cocos/2d/libcocos2d_win10/libcocos2d.vcxproj +++ b/cocos/2d/libcocos2d_win10/libcocos2d.vcxproj @@ -671,6 +671,10 @@ + + + + @@ -1250,6 +1254,10 @@ + + + + diff --git a/cocos/2d/libcocos2d_win10/libcocos2d.vcxproj.filters b/cocos/2d/libcocos2d_win10/libcocos2d.vcxproj.filters index 3bcd645c44..d874a42afd 100644 --- a/cocos/2d/libcocos2d_win10/libcocos2d.vcxproj.filters +++ b/cocos/2d/libcocos2d_win10/libcocos2d.vcxproj.filters @@ -269,6 +269,9 @@ {2e9af99e-c268-459a-9615-9f3c5b58efdc} + + {757d4df8-a9d6-430f-9a7a-80170d9ca6fb} + @@ -1993,6 +1996,18 @@ ui\UIWidgets\EditBox + + vr + + + vr + + + vr + + + vr + @@ -3890,6 +3905,18 @@ ui\UIWidgets\EditBox + + vr + + + vr + + + vr + + + vr + diff --git a/cocos/Android.mk b/cocos/Android.mk index 21a9074b21..c6d42a96df 100644 --- a/cocos/Android.mk +++ b/cocos/Android.mk @@ -190,6 +190,10 @@ renderer/CCVertexIndexData.cpp \ renderer/ccGLStateCache.cpp \ renderer/CCFrameBuffer.cpp \ renderer/ccShaders.cpp \ +vr/CCVRDistortion.cpp \ +vr/CCVRDistortionMesh.cpp \ +vr/CCVRGenericRenderer.cpp \ +vr/CCVRGenericHeadTracker.cpp \ deprecated/CCArray.cpp \ deprecated/CCDeprecated.cpp \ deprecated/CCDictionary.cpp \ diff --git a/cocos/CMakeLists.txt b/cocos/CMakeLists.txt index ed474990d9..a5703f64d6 100644 --- a/cocos/CMakeLists.txt +++ b/cocos/CMakeLists.txt @@ -40,6 +40,7 @@ include(physics3d/CMakeLists.txt) include(math/CMakeLists.txt) include(navmesh/CMakeLists.txt) include(renderer/CMakeLists.txt) +include(vr/CMakeLists.txt) include(base/CMakeLists.txt) include(deprecated/CMakeLists.txt) include(ui/CMakeLists.txt) @@ -73,6 +74,7 @@ set(COCOS_SRC cocos2d.cpp ${COCOS_MATH_SRC} ${COCOS_NAVMESH_SRC} ${COCOS_RENDERER_SRC} + ${COCOS_VR_SRC} ${COCOS_BASE_SRC} ${COCOS_AUDIO_SRC} ${COCOS_UI_SRC} diff --git a/cocos/base/CCDirector.cpp b/cocos/base/CCDirector.cpp index af12cfa649..3c92ec8779 100644 --- a/cocos/base/CCDirector.cpp +++ b/cocos/base/CCDirector.cpp @@ -298,7 +298,7 @@ void Director::drawScene() _renderer->clearDrawStats(); //render the scene - _runningScene->render(_renderer); + _openGLView->renderScene(_runningScene, _renderer); _eventDispatcher->dispatchEvent(_eventAfterVisit); } @@ -604,11 +604,9 @@ void Director::setProjection(Projection projection) { case Projection::_2D: { - loadIdentityMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION); - Mat4 orthoMatrix; Mat4::createOrthographicOffCenter(0, size.width, 0, size.height, -1024, 1024, &orthoMatrix); - multiplyMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, orthoMatrix); + loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, orthoMatrix); loadIdentityMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); break; } @@ -619,17 +617,14 @@ void Director::setProjection(Projection projection) Mat4 matrixPerspective, matrixLookup; - loadIdentityMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION); - // issue #1334 Mat4::createPerspective(60, (GLfloat)size.width/size.height, 10, zeye+size.height/2, &matrixPerspective); - multiplyMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, matrixPerspective); - Vec3 eye(size.width/2, size.height/2, zeye), center(size.width/2, size.height/2, 0.0f), up(0.0f, 1.0f, 0.0f); Mat4::createLookAt(eye, center, up, &matrixLookup); - multiplyMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, matrixLookup); - + Mat4 proj3d = matrixPerspective * matrixLookup; + + loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, proj3d); loadIdentityMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); break; } diff --git a/cocos/base/CCEventDispatcher.cpp b/cocos/base/CCEventDispatcher.cpp index 4cef6604b6..b477ffca8f 100644 --- a/cocos/base/CCEventDispatcher.cpp +++ b/cocos/base/CCEventDispatcher.cpp @@ -845,11 +845,8 @@ void EventDispatcher::dispatchTouchEventToListeners(EventListenerVector* listene // second, for all camera call all listeners // get a copy of cameras, prevent it's been modified in listener callback // if camera's depth is greater, process it earlier - auto cameras = scene->getCameras(); - Camera* camera; - for (int j = int(cameras.size()) - 1; j >= 0; --j) + for (auto& camera: scene->getCameras()) { - camera = cameras[j]; if (camera->isVisible() == false) { continue; diff --git a/cocos/cocos2d.h b/cocos/cocos2d.h index 6a4e6410e8..7e8cd7d6ec 100644 --- a/cocos/cocos2d.h +++ b/cocos/cocos2d.h @@ -301,6 +301,9 @@ THE SOFTWARE. #include "3d/CCSprite3DMaterial.h" #include "3d/CCTerrain.h" +// vr +#include "vr/CCVRGenericRenderer.h" + // Deprecated // All deprecated features are include inside deprecated/CCDeprecated.h. diff --git a/cocos/platform/CCGLView.cpp b/cocos/platform/CCGLView.cpp index 011d5db9af..019b837c83 100644 --- a/cocos/platform/CCGLView.cpp +++ b/cocos/platform/CCGLView.cpp @@ -29,6 +29,10 @@ THE SOFTWARE. #include "base/CCDirector.h" #include "base/CCEventDispatcher.h" #include "2d/CCCamera.h" +#include "2d/CCScene.h" +#include "renderer/CCRenderer.h" +#include "vr/CCVRProtocol.h" +#include "vr/CCVRGenericRenderer.h" NS_CC_BEGIN @@ -103,6 +107,7 @@ GLView::GLView() : _scaleX(1.0f) , _scaleY(1.0f) , _resolutionPolicy(ResolutionPolicy::UNKNOWN) +, _vrImpl(nullptr) { } @@ -464,4 +469,38 @@ float GLView::getScaleY() const return _scaleY; } +void GLView::renderScene(Scene* scene, Renderer* renderer) +{ + CCASSERT(scene, "Invalid Scene"); + CCASSERT(renderer, "Invalid Renderer"); + + if (_vrImpl) + { + _vrImpl->render(scene, renderer); + } + else + { + scene->render(renderer, Mat4::IDENTITY, nullptr); + } +} + +VRIRenderer* GLView::getVR() const +{ + return _vrImpl; +} + +void GLView::setVR(VRIRenderer* vrRenderer) +{ + if (_vrImpl != vrRenderer) + { + if (_vrImpl) + delete _vrImpl; + + if (vrRenderer) + vrRenderer->setup(this); + + _vrImpl = vrRenderer; + } +} + NS_CC_END diff --git a/cocos/platform/CCGLView.h b/cocos/platform/CCGLView.h index c7e41a4970..81388edb09 100644 --- a/cocos/platform/CCGLView.h +++ b/cocos/platform/CCGLView.h @@ -86,6 +86,10 @@ struct GLContextAttrs NS_CC_BEGIN +class Scene; +class Renderer; +class VRIRenderer; + /** * @addtogroup platform * @{ @@ -387,7 +391,20 @@ public: #if (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) virtual id getCocoaWindow() = 0; #endif /* (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) */ - + + /** + * Renders a Scene with a Renderer + * This method is called dirctly by the Director + */ + void renderScene(Scene* scene, Renderer* renderer); + + /** + * Sets a VR renderer. + * if `vrrenderer` is `nullptr` VR will be disabled + */ + void setVR(VRIRenderer* vrrenderer); + VRIRenderer* getVR() const; + protected: void updateDesignResolutionSize(); @@ -405,6 +422,9 @@ protected: float _scaleX; float _scaleY; ResolutionPolicy _resolutionPolicy; + + // VR stuff + VRIRenderer* _vrImpl; }; // end of platform group diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxAccelerometer.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxAccelerometer.java index c38bee6920..c1b73de7fd 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxAccelerometer.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxAccelerometer.java @@ -47,7 +47,11 @@ public class Cocos2dxAccelerometer implements SensorEventListener { private final Context mContext; private final SensorManager mSensorManager; private final Sensor mAccelerometer; + private final Sensor mCompass; private final int mNaturalOrientation; + final float[] accelerometerValues = new float[3]; + final float[] compassFieldValues = new float[3]; + static final float ALPHA = 0.25f; // if ALPHA = 1 OR 0, no filter applies. // =========================================================== // Constructors @@ -58,6 +62,7 @@ public class Cocos2dxAccelerometer implements SensorEventListener { this.mSensorManager = (SensorManager) this.mContext.getSystemService(Context.SENSOR_SERVICE); this.mAccelerometer = this.mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); + this.mCompass = this.mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); final Display display = ((WindowManager) this.mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); this.mNaturalOrientation = display.getOrientation(); @@ -67,20 +72,24 @@ public class Cocos2dxAccelerometer implements SensorEventListener { // Getter & Setter // =========================================================== - public void enable() { + public void enableCompass() { + this.mSensorManager.registerListener(this, this.mCompass, SensorManager.SENSOR_DELAY_GAME); + } + + public void enableAccel() { this.mSensorManager.registerListener(this, this.mAccelerometer, SensorManager.SENSOR_DELAY_GAME); } - public void setInterval(float interval) { - // Honeycomb version is 11 - if(android.os.Build.VERSION.SDK_INT < 11) { + public void setInterval(float interval) { + // Honeycomb version is 11 + if(android.os.Build.VERSION.SDK_INT < 11) { this.mSensorManager.registerListener(this, this.mAccelerometer, SensorManager.SENSOR_DELAY_GAME); } else { //convert seconds to microseconds this.mSensorManager.registerListener(this, this.mAccelerometer, (int)(interval*100000)); } } - + public void disable() { this.mSensorManager.unregisterListener(this); } @@ -88,41 +97,51 @@ public class Cocos2dxAccelerometer implements SensorEventListener { // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== - @Override public void onSensorChanged(final SensorEvent sensorEvent) { - if (sensorEvent.sensor.getType() != Sensor.TYPE_ACCELEROMETER) { - return; + if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { + + float x = sensorEvent.values[0]; + float y = sensorEvent.values[1]; + final float z = sensorEvent.values[2]; + + // needed by VR code + this.accelerometerValues[0] = x; + this.accelerometerValues[1] = y; + this.accelerometerValues[2] = z; + + /* + * Because the axes are not swapped when the device's screen orientation + * changes. So we should swap it here. In tablets such as Motorola Xoom, + * the default orientation is landscape, so should consider this. + */ + final int orientation = this.mContext.getResources().getConfiguration().orientation; + + if ((orientation == Configuration.ORIENTATION_LANDSCAPE) && (this.mNaturalOrientation != Surface.ROTATION_0)) { + final float tmp = x; + x = -y; + y = tmp; + } else if ((orientation == Configuration.ORIENTATION_PORTRAIT) && (this.mNaturalOrientation != Surface.ROTATION_0)) { + final float tmp = x; + x = y; + y = -tmp; + } + + + Cocos2dxGLSurfaceView.queueAccelerometer(x,y,z,sensorEvent.timestamp); + + /* + if(BuildConfig.DEBUG) { + Log.d(TAG, "x = " + sensorEvent.values[0] + " y = " + sensorEvent.values[1] + " z = " + pSensorEvent.values[2]); + } + */ } - - float x = sensorEvent.values[0]; - float y = sensorEvent.values[1]; - final float z = sensorEvent.values[2]; - - /* - * Because the axes are not swapped when the device's screen orientation - * changes. So we should swap it here. In tablets such as Motorola Xoom, - * the default orientation is landscape, so should consider this. - */ - final int orientation = this.mContext.getResources().getConfiguration().orientation; - - if ((orientation == Configuration.ORIENTATION_LANDSCAPE) && (this.mNaturalOrientation != Surface.ROTATION_0)) { - final float tmp = x; - x = -y; - y = tmp; - } else if ((orientation == Configuration.ORIENTATION_PORTRAIT) && (this.mNaturalOrientation != Surface.ROTATION_0)) { - final float tmp = x; - x = y; - y = -tmp; - } - - Cocos2dxGLSurfaceView.queueAccelerometer(x,y,z,sensorEvent.timestamp); - - /* - if(BuildConfig.DEBUG) { - Log.d(TAG, "x = " + sensorEvent.values[0] + " y = " + sensorEvent.values[1] + " z = " + pSensorEvent.values[2]); + else if (sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { + // needed by VR code + this.compassFieldValues[0] = sensorEvent.values[0]; + this.compassFieldValues[1] = sensorEvent.values[1]; + this.compassFieldValues[2] = sensorEvent.values[2]; } - */ } @Override @@ -133,7 +152,7 @@ public class Cocos2dxAccelerometer implements SensorEventListener { // Methods // Native method called from Cocos2dxGLSurfaceView (To be in the same thread) // =========================================================== - + public static native void onSensorChanged(final float x, final float y, final float z, final long timestamp); // =========================================================== diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java index 6b14a5a9de..6e1c07d7bf 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java @@ -45,6 +45,7 @@ import android.util.DisplayMetrics; import android.util.Log; import android.view.Display; import android.view.WindowManager; +import android.hardware.SensorManager; import com.android.vending.expansion.zipfile.APKExpansionSupport; import com.android.vending.expansion.zipfile.ZipResourceFile; @@ -61,6 +62,7 @@ import java.util.Locale; import java.util.Map; import java.util.Set; + public class Cocos2dxHelper { // =========================================================== // Constants @@ -78,6 +80,7 @@ public class Cocos2dxHelper { private static AssetManager sAssetManager; private static Cocos2dxAccelerometer sCocos2dxAccelerometer; private static boolean sAccelerometerEnabled; + private static boolean sCompassEnabled; private static boolean sActivityVisible; private static String sPackageName; private static String sFileDirectory; @@ -243,9 +246,13 @@ public class Cocos2dxHelper { public static void enableAccelerometer() { Cocos2dxHelper.sAccelerometerEnabled = true; - Cocos2dxHelper.sCocos2dxAccelerometer.enable(); + Cocos2dxHelper.sCocos2dxAccelerometer.enableAccel(); } + public static void enableCompass() { + Cocos2dxHelper.sCompassEnabled = true; + Cocos2dxHelper.sCocos2dxAccelerometer.enableCompass(); + } public static void setAccelerometerInterval(float interval) { Cocos2dxHelper.sCocos2dxAccelerometer.setInterval(interval); @@ -396,7 +403,10 @@ public class Cocos2dxHelper { public static void onResume() { sActivityVisible = true; if (Cocos2dxHelper.sAccelerometerEnabled) { - Cocos2dxHelper.sCocos2dxAccelerometer.enable(); + Cocos2dxHelper.sCocos2dxAccelerometer.enableAccel(); + } + if (Cocos2dxHelper.sCompassEnabled) { + Cocos2dxHelper.sCocos2dxAccelerometer.enableCompass(); } } @@ -691,5 +701,13 @@ public class Cocos2dxHelper { return -1; } } + //Enhance API modification end + public static float[] getAccelValue() { + return Cocos2dxHelper.sCocos2dxAccelerometer.accelerometerValues; + } + + public static float[] getCompassValue() { + return Cocos2dxHelper.sCocos2dxAccelerometer.compassFieldValues; + } } diff --git a/cocos/platform/android/jni/JniHelper.cpp b/cocos/platform/android/jni/JniHelper.cpp index a4caa36eb8..0c2e5c8b19 100644 --- a/cocos/platform/android/jni/JniHelper.cpp +++ b/cocos/platform/android/jni/JniHelper.cpp @@ -67,6 +67,9 @@ namespace cocos2d { JavaVM* JniHelper::_psJavaVM = nullptr; jmethodID JniHelper::loadclassMethod_methodID = nullptr; jobject JniHelper::classloader = nullptr; + std::function JniHelper::classloaderCallback = nullptr; + + jobject JniHelper::_activity = nullptr; std::unordered_map> JniHelper::localRefs; JavaVM* JniHelper::getJavaVM() { @@ -122,6 +125,10 @@ namespace cocos2d { _env = JniHelper::cacheEnv(_psJavaVM); return _env; } + + jobject JniHelper::getActivity() { + return _activity; + } bool JniHelper::setClassLoaderFrom(jobject activityinstance) { JniMethodInfo _getclassloaderMethod; @@ -149,6 +156,10 @@ namespace cocos2d { JniHelper::classloader = cocos2d::JniHelper::getEnv()->NewGlobalRef(_c); JniHelper::loadclassMethod_methodID = _m.methodID; + JniHelper::_activity = cocos2d::JniHelper::getEnv()->NewGlobalRef(activityinstance); + if (JniHelper::classloaderCallback != nullptr){ + JniHelper::classloaderCallback(); + } return true; } diff --git a/cocos/platform/android/jni/JniHelper.h b/cocos/platform/android/jni/JniHelper.h index 528312a647..ff02347f1a 100644 --- a/cocos/platform/android/jni/JniHelper.h +++ b/cocos/platform/android/jni/JniHelper.h @@ -29,7 +29,9 @@ THE SOFTWARE. #include #include #include +#include #include "platform/CCPlatformMacros.h" +#include "math/Vec3.h" NS_CC_BEGIN @@ -46,6 +48,7 @@ public: static void setJavaVM(JavaVM *javaVM); static JavaVM* getJavaVM(); static JNIEnv* getEnv(); + static jobject getActivity(); static bool setClassLoaderFrom(jobject activityInstance); static bool getStaticMethodInfo(JniMethodInfo &methodinfo, @@ -61,6 +64,7 @@ public: static jmethodID loadclassMethod_methodID; static jobject classloader; + static std::function classloaderCallback; template static void callStaticVoidMethod(const std::string& className, @@ -128,6 +132,57 @@ public: return ret; } + template + static float* callStaticFloatArrayMethod(const std::string& className, + const std::string& methodName, + Ts... xs) { + static float ret[32]; + cocos2d::JniMethodInfo t; + std::string signature = "(" + std::string(getJNISignature(xs...)) + ")[F"; + if (cocos2d::JniHelper::getStaticMethodInfo(t, className.c_str(), methodName.c_str(), signature.c_str())) { + jfloatArray array = (jfloatArray) t.env->CallStaticObjectMethod(t.classID, t.methodID, convert(t, xs)...); + jsize len = t.env->GetArrayLength(array); + if (len <= 32) { + jfloat* elems = t.env->GetFloatArrayElements(array, 0); + if (elems) { + memcpy(ret, elems, sizeof(float) * len); + t.env->ReleaseFloatArrayElements(array, elems, 0); + }; + } + t.env->DeleteLocalRef(t.classID); + deleteLocalRefs(t.env); + return &ret[0]; + } else { + reportError(className, methodName, signature); + } + return nullptr; + } + + template + static Vec3 callStaticVec3Method(const std::string& className, + const std::string& methodName, + Ts... xs) { + Vec3 ret; + cocos2d::JniMethodInfo t; + std::string signature = "(" + std::string(getJNISignature(xs...)) + ")[F"; + if (cocos2d::JniHelper::getStaticMethodInfo(t, className.c_str(), methodName.c_str(), signature.c_str())) { + jfloatArray array = (jfloatArray) t.env->CallStaticObjectMethod(t.classID, t.methodID, convert(t, xs)...); + jsize len = t.env->GetArrayLength(array); + if (len == 3) { + jfloat* elems = t.env->GetFloatArrayElements(array, 0); + ret.x = elems[0]; + ret.y = elems[1]; + ret.z = elems[2]; + t.env->ReleaseFloatArrayElements(array, elems, 0); + } + t.env->DeleteLocalRef(t.classID); + deleteLocalRefs(t.env); + } else { + reportError(className, methodName, signature); + } + return ret; + } + template static double callStaticDoubleMethod(const std::string& className, const std::string& methodName, @@ -174,6 +229,8 @@ private: const char *paramCode); static JavaVM* _psJavaVM; + + static jobject _activity; static jstring convert(cocos2d::JniMethodInfo& t, const char* x); diff --git a/cocos/renderer/CCFrameBuffer.cpp b/cocos/renderer/CCFrameBuffer.cpp index fbff5ed432..05200e4746 100644 --- a/cocos/renderer/CCFrameBuffer.cpp +++ b/cocos/renderer/CCFrameBuffer.cpp @@ -23,6 +23,7 @@ ****************************************************************************/ #include "renderer/CCFrameBuffer.h" +#include "renderer/CCRenderer.h" #include "base/CCDirector.h" #include "base/CCEventCustom.h" #include "base/CCEventListenerCustom.h" @@ -314,6 +315,7 @@ FrameBuffer* FrameBuffer::getOrCreateDefaultFBO(GLView* view) return _defaultFBO; } + void FrameBuffer::applyDefaultFBO() { if(_defaultFBO) @@ -384,6 +386,7 @@ FrameBuffer::FrameBuffer() , _clearDepth(1.0) , _clearStencil(0) , _fbo(0) +, _previousFBO(0) , _rt(nullptr) , _rtDepthStencil(nullptr) , _fboBindingDirty(true) @@ -418,7 +421,7 @@ void FrameBuffer::clearFBO() glClearDepth(_clearDepth); glClearStencil(_clearStencil); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); - applyDefaultFBO(); + restoreFBO(); } void FrameBuffer::attachRenderTarget(RenderTargetBase* rt) @@ -443,7 +446,9 @@ void FrameBuffer::attachRenderTarget(RenderTargetBase* rt) void FrameBuffer::applyFBO() { CHECK_GL_ERROR_DEBUG(); + glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*)&_previousFBO); glBindFramebuffer(GL_FRAMEBUFFER, _fbo); +// CCASSERT(_fbo==0 || _fbo != _previousFBO, "calling applyFBO without restoring the previous one"); CHECK_GL_ERROR_DEBUG(); if(_fboBindingDirty && !isDefaultFBO()) { @@ -467,6 +472,11 @@ void FrameBuffer::applyFBO() CHECK_GL_ERROR_DEBUG(); } +void FrameBuffer::restoreFBO() +{ + glBindFramebuffer(GL_FRAMEBUFFER, _previousFBO); +} + void FrameBuffer::attachDepthStencilTarget(RenderTargetDepthStencil* rt) { if(isDefaultFBO()) diff --git a/cocos/renderer/CCFrameBuffer.h b/cocos/renderer/CCFrameBuffer.h index 9cbdb9aba4..0ce84b4558 100644 --- a/cocos/renderer/CCFrameBuffer.h +++ b/cocos/renderer/CCFrameBuffer.h @@ -157,6 +157,7 @@ public: //call glclear to clear frame buffer object void clearFBO(); void applyFBO(); + void restoreFBO(); void setClearColor(const Color4F& color) { _clearColor = color;} void setClearDepth(float depth) { _clearDepth = depth; } void setClearStencil(int8_t stencil) { _clearStencil = stencil; } @@ -180,6 +181,7 @@ CC_CONSTRUCTOR_ACCESS: private: //openGL content for FrameBuffer GLuint _fbo; + GLuint _previousFBO; //dirty flag for fbo binding bool _fboBindingDirty; // diff --git a/cocos/renderer/CCRenderer.cpp b/cocos/renderer/CCRenderer.cpp index fb76d14e39..0159a40eda 100644 --- a/cocos/renderer/CCRenderer.cpp +++ b/cocos/renderer/CCRenderer.cpp @@ -403,7 +403,9 @@ void Renderer::processRenderCommand(RenderCommand* command) if (cmd->isSkipBatching() || _lastBatchedMeshCommand == nullptr || _lastBatchedMeshCommand->getMaterialID() != cmd->getMaterialID()) { flush3D(); - + + CCGL_DEBUG_INSERT_EVENT_MARKER("RENDERER_MESH_COMMAND"); + if(cmd->isSkipBatching()) { // XXX: execute() will call bind() and unbind() @@ -420,6 +422,7 @@ void Renderer::processRenderCommand(RenderCommand* command) } else { + CCGL_DEBUG_INSERT_EVENT_MARKER("RENDERER_MESH_COMMAND"); cmd->batchDraw(); } } @@ -427,24 +430,29 @@ void Renderer::processRenderCommand(RenderCommand* command) { flush(); int renderQueueID = ((GroupCommand*) command)->getRenderQueueID(); + CCGL_DEBUG_PUSH_GROUP_MARKER("RENDERER_GROUP_COMMAND"); visitRenderQueue(_renderGroups[renderQueueID]); + CCGL_DEBUG_POP_GROUP_MARKER(); } else if(RenderCommand::Type::CUSTOM_COMMAND == commandType) { flush(); auto cmd = static_cast(command); + CCGL_DEBUG_INSERT_EVENT_MARKER("RENDERER_CUSTOM_COMMAND"); cmd->execute(); } else if(RenderCommand::Type::BATCH_COMMAND == commandType) { flush(); auto cmd = static_cast(command); + CCGL_DEBUG_INSERT_EVENT_MARKER("RENDERER_BATCH_COMMAND"); cmd->execute(); } else if(RenderCommand::Type::PRIMITIVE_COMMAND == commandType) { flush(); auto cmd = static_cast(command); + CCGL_DEBUG_INSERT_EVENT_MARKER("RENDERER_PRIMITIVE_COMMAND"); cmd->execute(); } else @@ -718,6 +726,8 @@ void Renderer::drawBatchedTriangles() if(_queuedTriangleCommands.empty()) return; + CCGL_DEBUG_INSERT_EVENT_MARKER("RENDERER_BATCH_TRIANGLES"); + _filledVertex = 0; _filledIndex = 0; @@ -866,6 +876,8 @@ void Renderer::flush3D() { if (_lastBatchedMeshCommand) { + CCGL_DEBUG_INSERT_EVENT_MARKER("RENDERER_BATCH_MESH"); + _lastBatchedMeshCommand->postBatchDraw(); _lastBatchedMeshCommand = nullptr; } diff --git a/cocos/renderer/CCRenderer.h b/cocos/renderer/CCRenderer.h index b739c3813c..7610ca7b9e 100644 --- a/cocos/renderer/CCRenderer.h +++ b/cocos/renderer/CCRenderer.h @@ -34,6 +34,23 @@ #include "renderer/CCGLProgram.h" #include "platform/CCGL.h" +#if !defined(NDEBUG) && CC_TARGET_PLATFORM == CC_PLATFORM_IOS + +/// Basic wrapper for glInsertEventMarkerEXT() depending on the current build settings and platform. +#define CCGL_DEBUG_INSERT_EVENT_MARKER(__message__) glInsertEventMarkerEXT(0, __message__) +/// Basic wrapper for glPushGroupMarkerEXT() depending on the current build settings and platform. +#define CCGL_DEBUG_PUSH_GROUP_MARKER(__message__) glPushGroupMarkerEXT(0, __message__) +/// Basic wrapper for CCGL_DEBUG_POP_GROUP_MARKER() depending on the current build settings and platform. +#define CCGL_DEBUG_POP_GROUP_MARKER() glPopGroupMarkerEXT() + +#else + +#define CCGL_DEBUG_INSERT_EVENT_MARKER(__message__) +#define CCGL_DEBUG_PUSH_GROUP_MARKER(__message__) +#define CCGL_DEBUG_POP_GROUP_MARKER() + +#endif + /** * @addtogroup renderer * @{ diff --git a/cocos/vr/CCVRDistortion.cpp b/cocos/vr/CCVRDistortion.cpp new file mode 100644 index 0000000000..951a12b91a --- /dev/null +++ b/cocos/vr/CCVRDistortion.cpp @@ -0,0 +1,84 @@ +/**************************************************************************** + Copyright (c) 2016 Google Inc. + Copyright (c) 2016 Chukong Technologies Inc. + + http://www.cocos2d-x.org + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + ****************************************************************************/ + +#include "vr/CCVRDistortion.h" +#include + +NS_CC_BEGIN + +Distortion::Distortion() +{ + _coefficients[0] = 0.441f; + _coefficients[1] = 0.156f; +} + +void Distortion::setCoefficients(float *coefficients) +{ + for (int i = 0; i < s_numberOfCoefficients; i++) + { + _coefficients[i] = coefficients[i]; + } +} + +float *Distortion::coefficients() +{ + return _coefficients; +} + +float Distortion::distortionFactor(float radius) +{ + float result = 1.0f; + float rFactor = 1.0f; + float squaredRadius = radius * radius; + for (int i = 0; i < s_numberOfCoefficients; i++) + { + rFactor *= squaredRadius; + result += _coefficients[i] * rFactor; + } + return result; +} + +float Distortion::distort(float radius) +{ + return radius * distortionFactor(radius); +} + +float Distortion::distortInverse(float radius) +{ + float r0 = radius / 0.9f; + float r = radius * 0.9f; + float dr0 = radius - distort(r0); + while (fabsf(r - r0) > 0.0001f) + { + float dr = radius - distort(r); + float r2 = r - dr * ((r - r0) / (dr - dr0)); + r0 = r; + r = r2; + dr0 = dr; + } + return r; +} + +NS_CC_END diff --git a/cocos/vr/CCVRDistortion.h b/cocos/vr/CCVRDistortion.h new file mode 100644 index 0000000000..70e0c30416 --- /dev/null +++ b/cocos/vr/CCVRDistortion.h @@ -0,0 +1,53 @@ +/**************************************************************************** + Copyright (c) 2016 Google Inc. + Copyright (c) 2016 Chukong Technologies Inc. + + http://www.cocos2d-x.org + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + ****************************************************************************/ + +#ifndef CCVRDistortion_h +#define CCVRDistortion_h + +#include "platform/CCPlatformMacros.h" + +NS_CC_BEGIN + +// Barrel Distortion +class Distortion +{ +public: + Distortion(); + + void setCoefficients(float *coefficients); + float *coefficients(); + + float distortionFactor(float radius); + float distort(float radius); + float distortInverse(float radius); + +private: + static const int s_numberOfCoefficients = 2; + float _coefficients[s_numberOfCoefficients]; +}; + +NS_CC_END + +#endif /* CCVRDistortion_h */ diff --git a/cocos/vr/CCVRDistortionMesh.cpp b/cocos/vr/CCVRDistortionMesh.cpp new file mode 100644 index 0000000000..1ff3d6c54c --- /dev/null +++ b/cocos/vr/CCVRDistortionMesh.cpp @@ -0,0 +1,153 @@ +/**************************************************************************** + Copyright (c) 2016 Google Inc. + Copyright (c) 2016 Chukong Technologies Inc. + + http://www.cocos2d-x.org + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + ****************************************************************************/ + +#include "vr/CCVRDistortionMesh.h" + +#include + +#include "vr/CCVRDistortion.h" +#include "math/Vec2.h" +#include "platform/CCGL.h" + +NS_CC_BEGIN + +DistortionMesh::DistortionMesh(Distortion *distortion, + float screenWidth, float screenHeight, + float xEyeOffsetScreen, float yEyeOffsetScreen, + float textureWidth, float textureHeight, + float xEyeOffsetTexture, float yEyeOffsetTexture, + float viewportXTexture, float viewportYTexture, + float viewportWidthTexture, float viewportHeightTexture, + bool vignetteEnabled) +: _indices(-1) +, _arrayBufferID(-1) +, _elementBufferID(-1) +{ + const int rows = 40; + const int cols = 40; + + GLfloat vertexData[rows * cols * 5]; + + int vertexOffset = 0; + + const float vignetteSizeTanAngle = 0.05f; + + const float maxDistance = sqrtf(textureWidth * textureWidth + textureHeight * textureHeight) / 4; + + for (int row = 0; row < rows; row++) + { + for (int col = 0; col < cols; col++) + { + const float uTexture = col / (cols-1.0f) * (viewportWidthTexture / textureWidth) + viewportXTexture / textureWidth; + const float vTexture = row / (rows-1.0f) * (viewportHeightTexture / textureHeight) + viewportYTexture / textureHeight; + + const float xTexture = uTexture * textureWidth - xEyeOffsetTexture; + const float yTexture = vTexture * textureHeight - yEyeOffsetTexture; + const float rTexture = sqrtf(xTexture * xTexture + yTexture * yTexture) / maxDistance; + + const float textureToScreen = (rTexture > 0.0f) ? distortion->distortInverse(rTexture) / rTexture : 1.0f; + + const float xScreen = xTexture * textureToScreen; + const float yScreen = yTexture * textureToScreen; + + const float uScreen = (xScreen + xEyeOffsetScreen) / screenWidth; + const float vScreen = (yScreen + yEyeOffsetScreen) / screenHeight; + + const float vignetteSizeTexture = vignetteSizeTanAngle / textureToScreen; + + const float dxTexture = xTexture + xEyeOffsetTexture - clampf(xTexture + xEyeOffsetTexture, + viewportXTexture + vignetteSizeTexture, + viewportXTexture + viewportWidthTexture - vignetteSizeTexture); + const float dyTexture = yTexture + yEyeOffsetTexture - clampf(yTexture + yEyeOffsetTexture, + viewportYTexture + vignetteSizeTexture, + viewportYTexture + viewportHeightTexture - vignetteSizeTexture); + const float drTexture = sqrtf(dxTexture * dxTexture + dyTexture * dyTexture); + + float vignette = 1.0f; + if (vignetteEnabled) + vignette = 1.0f - clampf(drTexture / vignetteSizeTexture, 0.0f, 1.0f); + + // position x,y (vertices) + vertexData[(vertexOffset + 0)] = 2.0f * uScreen - 1.0f; + vertexData[(vertexOffset + 1)] = 2.0f * vScreen - 1.0f; + + // texture u,v + vertexData[(vertexOffset + 2)] = uTexture; + vertexData[(vertexOffset + 3)] = vTexture; + + // vignete + vertexData[(vertexOffset + 4)] = vignette; + + vertexOffset += 5; + } + } + + _indices = (rows-1)*cols*2+rows-2; +// GLshort indexData[_indices]; + std::vector indexData(_indices); + const int indexDataSize = _indices * sizeof(GLshort); + + int indexOffset = 0; + vertexOffset = 0; + for (int row = 0; row < rows-1; row++) + { + if (row > 0) + { + indexData[indexOffset] = indexData[(indexOffset - 1)]; + indexOffset++; + } + for (int col = 0; col < cols; col++) + { + if (col > 0) + { + if (row % 2 == 0) + vertexOffset++; + else + vertexOffset--; + } + indexData[(indexOffset++)] = vertexOffset; + indexData[(indexOffset++)] = (vertexOffset + cols); + } + vertexOffset += rows; + } + + GLuint bufferIDs[2] = { 0, 0 }; + glGenBuffers(2, bufferIDs); + _arrayBufferID = bufferIDs[0]; + _elementBufferID = bufferIDs[1]; + + glBindBuffer(GL_ARRAY_BUFFER, _arrayBufferID); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _elementBufferID); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexDataSize, &indexData[0], GL_STATIC_DRAW); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + +// GLCheckForError(); +} + +NS_CC_END diff --git a/cocos/vr/CCVRDistortionMesh.h b/cocos/vr/CCVRDistortionMesh.h new file mode 100644 index 0000000000..d82f93af4f --- /dev/null +++ b/cocos/vr/CCVRDistortionMesh.h @@ -0,0 +1,56 @@ +/**************************************************************************** + Copyright (c) 2016 Google Inc. + Copyright (c) 2016 Chukong Technologies Inc. + + http://www.cocos2d-x.org + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + ****************************************************************************/ + +#ifndef CCVRDistortionMesh_hpp +#define CCVRDistortionMesh_hpp + +#include "platform/CCPlatformMacros.h" + +NS_CC_BEGIN + +class Distortion; + +class DistortionMesh +{ +public: + DistortionMesh(); + DistortionMesh(Distortion *distortion, + float screenWidth, float screenHeight, + float xEyeOffsetScreen, float yEyeOffsetScreen, + float textureWidth, float textureHeight, + float xEyeOffsetTexture, float yEyeOffsetTexture, + float viewportXTexture, float viewportYTexture, + float viewportWidthTexture, + float viewportHeightTexture, + bool vignetteEnabled); + + int _indices; + int _arrayBufferID; + int _elementBufferID; +}; + +NS_CC_END + +#endif /* CCVRDistortionMesh_h */ diff --git a/cocos/vr/CCVRGenericHeadTracker.cpp b/cocos/vr/CCVRGenericHeadTracker.cpp new file mode 100644 index 0000000000..4e3fb59738 --- /dev/null +++ b/cocos/vr/CCVRGenericHeadTracker.cpp @@ -0,0 +1,261 @@ +/**************************************************************************** + Copyright (c) 2016 Google Inc. + Copyright (c) 2016 Chukong Technologies Inc. + + http://www.cocos2d-x.org + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + ****************************************************************************/ + +// IMPORTANT +// For iOS/Mac, this file is treated as an "Objective-C++" file. +// To change this behvior, use the File Inspector from Xcode + +#include "vr/CCVRGenericHeadTracker.h" +#include "platform/CCPlatformMacros.h" +#include "platform/CCDevice.h" + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) +#import +#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) +#include +#include "platform/android/jni/JniHelper.h" +#endif + +NS_CC_BEGIN + +////// + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) +static Mat4 matrixFromRotationMatrix(const CMRotationMatrix& rotationMatrix) +{ + return Mat4(rotationMatrix.m11, + rotationMatrix.m21, + rotationMatrix.m31, + 0.0f, + + rotationMatrix.m12, + rotationMatrix.m22, + rotationMatrix.m32, + 0.0f, + + rotationMatrix.m13, + rotationMatrix.m23, + rotationMatrix.m33, + 0.0f, + + 0.0f, + 0.0f, + 0.0f, + 1.0f); +} + +#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) + +// getRotationMatrix taken from Android's SensorManager.java +Mat4 getRotationMatrix(const Vec3& gravity, const Vec3& geomagnetic) +{ + float Ax = gravity.x; + float Ay = gravity.y; + float Az = gravity.z; + + const float normsqA = (Ax*Ax + Ay*Ay + Az*Az); + const float g = 9.81f; + const float freeFallGravitySquared = 0.01f * g * g; + if (normsqA < freeFallGravitySquared) { + // gravity less than 10% of normal value + return Mat4::IDENTITY; + } + + const float Ex = geomagnetic.x; + const float Ey = geomagnetic.y; + const float Ez = geomagnetic.z; + float Hx = Ey*Az - Ez*Ay; + float Hy = Ez*Ax - Ex*Az; + float Hz = Ex*Ay - Ey*Ax; + const float normH = std::sqrt(Hx*Hx + Hy*Hy + Hz*Hz); + + if (normH < 0.1f) { + // device is close to free fall (or in space?), or close to + // magnetic north pole. Typical values are > 100. + return Mat4::IDENTITY; + } + const float invH = 1.0f / normH; + Hx *= invH; + Hy *= invH; + Hz *= invH; + const float invA = 1.0f / std::sqrt(Ax*Ax + Ay*Ay + Az*Az); + Ax *= invA; + Ay *= invA; + Az *= invA; + const float Mx = Ay*Hz - Az*Hy; + const float My = Az*Hx - Ax*Hz; + const float Mz = Ax*Hy - Ay*Hx; + + return Mat4( Hx, Mx, Ax, 0, + Hy, My, Ay, 0, + Hz, Mz, Az, 0, + 0, 0, 0, 1); +} + +Vec3 lowPass(const Vec3& input, const Vec3& prev) +{ + // if ALPHA = 1 OR 0, no filter applies. + static const float ALPHA = 0.12f; + return Vec3(prev.x + ALPHA * (input.x - prev.x), + prev.y + ALPHA * (input.y - prev.y), + prev.z + ALPHA * (input.z - prev.z)); +} + +#endif // (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) + +static Mat4 getRotateEulerMatrix(float x, float y, float z) +{ + x *= (float)(M_PI / 180.0f); + y *= (float)(M_PI / 180.0f); + z *= (float)(M_PI / 180.0f); + float cx = (float) cos(x); + float sx = (float) sin(x); + float cy = (float) cos(y); + float sy = (float) sin(y); + float cz = (float) cos(z); + float sz = (float) sin(z); + float cxsy = cx * sy; + float sxsy = sx * sy; + Mat4 matrix; + matrix.m[0] = cy * cz; + matrix.m[1] = -cy * sz; + matrix.m[2] = sy; + matrix.m[3] = 0.0f; + matrix.m[4] = cxsy * cz + cx * sz; + matrix.m[5] = -cxsy * sz + cx * cz; + matrix.m[6] = -sx * cy; + matrix.m[7] = 0.0f; + matrix.m[8] = -sxsy * cz + sx * sz; + matrix.m[9] = sxsy * sz + sx * cz; + matrix.m[10] = cx * cy; + matrix.m[11] = 0.0f; + matrix.m[12] = 0.0f; + matrix.m[13] = 0.0f; + matrix.m[14] = 0.0f; + matrix.m[15] = 1.0f; + return matrix; +} + +VRGenericHeadTracker::VRGenericHeadTracker() +: _localPosition(Vec3::ZERO) +{ +#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) + _motionMgr = [[CMMotionManager alloc] init]; +#endif + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) || (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) + startTracking(); +#endif +} + +VRGenericHeadTracker::~VRGenericHeadTracker() +{ +#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) || (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) + stopTracking(); +#endif + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) + [(CMMotionManager*)_motionMgr release]; +#endif +} + +void VRGenericHeadTracker::startTracking() +{ +#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) + CMMotionManager* motionMgr = (CMMotionManager*)_motionMgr; + if (motionMgr.isDeviceMotionAvailable && !motionMgr.isDeviceMotionActive) + { + [motionMgr startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryZVertical]; + } + + UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; + if (orientation == UIInterfaceOrientationLandscapeLeft) + { + _deviceToDisplay = getRotateEulerMatrix(0.f, 0.f, 90.f); + } + else if (orientation == UIInterfaceOrientationLandscapeRight) + { + _deviceToDisplay = getRotateEulerMatrix(0.f, 0.f, -90.f); + } + + // the inertial reference frame has z up and x forward, while the world has z out and x right + _worldToInertialReferenceFrame = getRotateEulerMatrix(-90.f, 0.f, 90.f); +#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) + _deviceToDisplay = getRotateEulerMatrix(0.f, 0.f, -90.f); + _worldToInertialReferenceFrame = getRotateEulerMatrix(-90.f, 0.f, 90.f); + JniHelper::callStaticVoidMethod("org/cocos2dx/lib/Cocos2dxHelper", "enableAccelerometer"); + JniHelper::callStaticVoidMethod("org/cocos2dx/lib/Cocos2dxHelper", "enableCompass"); +#endif +} + +void VRGenericHeadTracker::stopTracking() +{ +#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) + [(CMMotionManager*)_motionMgr stopDeviceMotionUpdates]; +#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) + Device::setAccelerometerEnabled(false); +#endif +} + +Vec3 VRGenericHeadTracker::getLocalPosition() +{ + return _localPosition; +} + +Mat4 VRGenericHeadTracker::getLocalRotation() +{ +#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) + CMMotionManager* motionMgr = (CMMotionManager*)_motionMgr; + CMDeviceMotion *motion = motionMgr.deviceMotion; + + CMRotationMatrix rotationMatrix = motion.attitude.rotationMatrix; + Mat4 inertialReferenceFrameToDevice0 = matrixFromRotationMatrix(rotationMatrix); // note the matrix inversion + Mat4 inertialReferenceFrameToDevice = inertialReferenceFrameToDevice0.getTransposed(); + Mat4 worldToDevice = inertialReferenceFrameToDevice * _worldToInertialReferenceFrame; + return _deviceToDisplay * worldToDevice; + +#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) + static Vec3 prevAccel = Vec3(0,0,0); + static Vec3 prevCompass = Vec3(0,0,0); + + Vec3 accel = JniHelper::callStaticVec3Method("org/cocos2dx/lib/Cocos2dxHelper", "getAccelValue"); + Vec3 compass = JniHelper::callStaticVec3Method("org/cocos2dx/lib/Cocos2dxHelper", "getCompassValue"); + +// CCLOG("accel: %f, %f, %f.... compass: %f, %f, %f", accel.x, accel.y, accel.z, compass.x, compass.y, compass.z); + prevAccel = lowPass(accel, prevAccel); + prevCompass = lowPass(compass, prevCompass); +// CCLOG("low pass accel: %f, %f, %f.... compass: %f, %f, %f", prevAccel.x, prevAccel.y, prevAccel.z, prevCompass.x, prevCompass.y, prevCompass.z); + + Mat4 rotMatrix = getRotationMatrix(prevAccel, prevCompass); + + Mat4 inertialReferenceFrameToDevice(rotMatrix); + Mat4 worldToDevice = inertialReferenceFrameToDevice * _worldToInertialReferenceFrame; + return _deviceToDisplay * worldToDevice; +#else + return Mat4::IDENTITY; +#endif +} + +NS_CC_END diff --git a/cocos/vr/CCVRGenericHeadTracker.h b/cocos/vr/CCVRGenericHeadTracker.h new file mode 100644 index 0000000000..1c8d83970e --- /dev/null +++ b/cocos/vr/CCVRGenericHeadTracker.h @@ -0,0 +1,58 @@ +/**************************************************************************** + Copyright (c) 2016 Google Inc. + Copyright (c) 2016 Chukong Technologies Inc. + + http://www.cocos2d-x.org + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + ****************************************************************************/ + +#ifndef CCVRGenericHeadTracker_hpp +#define CCVRGenericHeadTracker_hpp + +#include "vr/CCVRProtocol.h" +#include "math/Vec3.h" +#include "math/Mat4.h" + +NS_CC_BEGIN + +class CC_DLL VRGenericHeadTracker : public VRIHeadTracker +{ +public: + VRGenericHeadTracker(); + virtual ~VRGenericHeadTracker(); + + virtual Vec3 getLocalPosition(); + virtual Mat4 getLocalRotation(); + +protected: + void startTracking(); + void stopTracking(); + + Vec3 _localPosition; + + Mat4 _deviceToDisplay; + Mat4 _worldToInertialReferenceFrame; + + void* _motionMgr; +}; + +NS_CC_END + +#endif /* CCVRGenericHeadTracker_hpp */ diff --git a/cocos/vr/CCVRGenericRenderer.cpp b/cocos/vr/CCVRGenericRenderer.cpp new file mode 100644 index 0000000000..a9659ce157 --- /dev/null +++ b/cocos/vr/CCVRGenericRenderer.cpp @@ -0,0 +1,227 @@ +/**************************************************************************** + Copyright (c) 2016 Chukong Technologies Inc. + + http://www.cocos2d-x.org + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + ****************************************************************************/ + +#include "platform/CCPlatformMacros.h" +#include "vr/CCVRGenericRenderer.h" +#include "vr/CCVRDistortionMesh.h" +#include "vr/CCVRDistortion.h" +#include "vr/CCVRGenericHeadTracker.h" +#include "renderer/CCRenderer.h" +#include "renderer/CCGLProgramState.h" +#include "renderer/ccGLStateCache.h" +#include "base/CCDirector.h" +#include "2d/CCScene.h" +#include "2d/CCCamera.h" +#include "2d/CCSprite.h" +#include "platform/CCGLView.h" + + +NS_CC_BEGIN + +VRGenericRenderer::VRGenericRenderer() +: _vignetteEnabled(true) +, _distortion(nullptr) +, _leftDistortionMesh(nullptr) +, _rightDistortionMesh(nullptr) +, _glProgramState(nullptr) +{ + _headTracker = new VRGenericHeadTracker; +} + +VRGenericRenderer::~VRGenericRenderer() +{ + CC_SAFE_DELETE(_headTracker); + CC_SAFE_RELEASE(_glProgramState); + CC_SAFE_RELEASE(_fb); + CC_SAFE_DELETE(_distortion); + CC_SAFE_DELETE(_leftDistortionMesh); + CC_SAFE_DELETE(_rightDistortionMesh); +} + +void VRGenericRenderer::setup(GLView* glview) +{ +// CC_UNUSED(glview); + + // set origin to 0,0 in case origin is not 0,0 + auto vp = Camera::getDefaultViewport(); + + _leftEye.viewport._bottom = vp._bottom/2 + vp._height/4; + _leftEye.viewport._left = vp._left/4; + _leftEye.viewport._width = vp._width/2; + _leftEye.viewport._height = vp._height/2; + + _rightEye.viewport._bottom = vp._bottom/2 + vp._height/4; + _rightEye.viewport._left = _leftEye.viewport._width + vp._left/2; + _rightEye.viewport._width = vp._width/2; + _rightEye.viewport._height = vp._height/2; + + + _texSize = Size(vp._width, vp._height); + + _fb = experimental::FrameBuffer::create(1, _texSize.width, _texSize.height); + _fb->retain(); + auto rt = experimental::RenderTarget::create(_texSize.width, _texSize.height); + auto ds = experimental::RenderTargetDepthStencil::create(_texSize.width, _texSize.height); + _fb->attachRenderTarget(rt); + _fb->attachDepthStencilTarget(ds); + _fb->setClearColor(Color4F(0,0,0,1)); + + + _distortion = new Distortion; + _leftDistortionMesh = createDistortionMesh(VREye::EyeType::LEFT); + _rightDistortionMesh = createDistortionMesh(VREye::EyeType::RIGHT); + + setupGLProgram(); +} + +void VRGenericRenderer::cleanup() +{ +} + +VRIHeadTracker* VRGenericRenderer::getHeadTracker() +{ + return _headTracker; +} + +void VRGenericRenderer::render(Scene* scene, Renderer* renderer) +{ + // FIXME: Use correct eye displacement + const float eyeOffset = 0.5; + + auto headRotation = _headTracker->getLocalRotation(); + Mat4 leftTransform; + Mat4::createTranslation(eyeOffset, 0, 0, &leftTransform); + leftTransform *= headRotation; + + Mat4 rightTransform; + Mat4::createTranslation(-eyeOffset, 0, 0, &rightTransform); + rightTransform *= headRotation; + + _fb->applyFBO(); + Camera::setDefaultViewport(_leftEye.viewport); + scene->render(renderer, leftTransform, nullptr); + Camera::setDefaultViewport(_rightEye.viewport); + scene->render(renderer, rightTransform, nullptr); + _fb->restoreFBO(); + + auto texture = _fb->getRenderTarget()->getTexture(); + GL::bindTexture2D(texture->getName()); + _glProgramState->apply(Mat4::IDENTITY); + + GLint origViewport[4]; + glGetIntegerv(GL_VIEWPORT, origViewport); + glViewport(0, 0, _texSize.width, _texSize.height); + + renderDistortionMesh(_leftDistortionMesh, texture->getName()); + renderDistortionMesh(_rightDistortionMesh, texture->getName()); + + + glViewport(origViewport[0], origViewport[1], origViewport[2], origViewport[3]); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + + CHECK_GL_ERROR_DEBUG(); +} + +void VRGenericRenderer::renderDistortionMesh(DistortionMesh *mesh, GLint textureID) +{ + glBindBuffer(GL_ARRAY_BUFFER, mesh->_arrayBufferID); + + _glProgramState->setVertexAttribPointer("a_position", 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void *)(0 * sizeof(float))); + _glProgramState->setVertexAttribPointer("a_textureCoord", 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void *)(2 * sizeof(float))); + _glProgramState->setVertexAttribPointer("a_vignette", 1, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void *)(4 * sizeof(float))); + _glProgramState->setUniformTexture("u_textureSampler", textureID); + + _glProgramState->apply(Mat4::IDENTITY); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->_elementBufferID); + glDrawElements(GL_TRIANGLE_STRIP, mesh->_indices, GL_UNSIGNED_SHORT, 0); + + CHECK_GL_ERROR_DEBUG(); +} + +DistortionMesh* VRGenericRenderer::createDistortionMesh(VREye::EyeType eyeType) +{ + auto vp = Camera::getDefaultViewport(); + + const float screenWidth = _texSize.width; + const float screenHeight = _texSize.height; + const float xEyeOffsetScreen = (eyeType == VREye::EyeType::LEFT) ? screenWidth/4 + vp._left : screenWidth*3/4 + vp._left; + const float yEyeOffsetScreen = screenHeight/2 + vp._bottom; + + const float textureWidth = _texSize.width; + const float textureHeight = _texSize.height; + const float xEyeOffsetTexture = (eyeType == VREye::EyeType::LEFT) ? _texSize.width/4 : _texSize.width*3/4; + const float yEyeOffsetTexture = _texSize.height/2; + + const float viewportX = (eyeType == VREye::EyeType::LEFT) ? 0 : textureWidth/2; + const float viewportY = 0; + const float viewportW = textureWidth/2; + const float viewportH = textureHeight; + + return new DistortionMesh(_distortion, + screenWidth, screenHeight, + xEyeOffsetScreen, yEyeOffsetScreen, + textureWidth, textureHeight, + xEyeOffsetTexture, yEyeOffsetTexture, + viewportX, viewportY, + viewportW, viewportH, + _vignetteEnabled); +} + +void VRGenericRenderer::setupGLProgram() +{ + const GLchar *vertexShader = + "\ + attribute vec2 a_position;\n\ + attribute vec2 a_textureCoord;\n\ + attribute float a_vignette;\n\ + varying vec2 v_textureCoord;\n\ + varying float v_vignette;\n\ + void main() {\n\ + gl_Position = vec4(a_position, 0.0, 1.0);\n\ + v_textureCoord = a_textureCoord.xy;\n\ + v_vignette = a_vignette;\n\ + }\n"; + + const GLchar *fragmentShader = + "\ + #ifdef GL_ES\n\ + precision mediump float;\n\ + #endif\n\ + varying vec2 v_textureCoord;\n\ + varying float v_vignette;\n\ + uniform sampler2D u_textureSampler;\n\ + void main() {\n\ + gl_FragColor = v_vignette * texture2D(u_textureSampler, v_textureCoord);\n\ + }\n"; + + auto program = GLProgram::createWithByteArrays(vertexShader, fragmentShader); + _glProgramState = GLProgramState::getOrCreateWithGLProgram(program); + + _glProgramState->retain(); +} + +NS_CC_END diff --git a/cocos/vr/CCVRGenericRenderer.h b/cocos/vr/CCVRGenericRenderer.h new file mode 100644 index 0000000000..98c3b9eb2a --- /dev/null +++ b/cocos/vr/CCVRGenericRenderer.h @@ -0,0 +1,84 @@ +/**************************************************************************** + Copyright (c) 2016 Chukong Technologies Inc. + + http://www.cocos2d-x.org + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + ****************************************************************************/ + +#ifndef CCVRGenericRenderer_hpp +#define CCVRGenericRenderer_hpp + +#include "vr/CCVRProtocol.h" +#include "renderer/CCCustomCommand.h" +#include "renderer/CCFrameBuffer.h" + +NS_CC_BEGIN + +class Camera; +class Sprite; +class DistortionMesh; +class Distortion; +class GLProgramState; +class VRGenericHeadTracker; + +struct CC_DLL VREye +{ + enum class EyeType { + MONO, + LEFT, + RIGHT, + }; + + EyeType type; + experimental::Viewport viewport; +}; + +class CC_DLL VRGenericRenderer : public VRIRenderer +{ +public: + VRGenericRenderer(); + virtual ~VRGenericRenderer(); + + virtual void setup(GLView* glview) override; + virtual void cleanup() override; + virtual void render(Scene* scene, Renderer* renderer) override; + virtual VRIHeadTracker* getHeadTracker() override; + +protected: + void setupGLProgram(); + void renderDistortionMesh(DistortionMesh *mesh, GLint textureID); + DistortionMesh* createDistortionMesh(VREye::EyeType eyeType); + + experimental::FrameBuffer* _fb; + Size _texSize; + VREye _leftEye; + VREye _rightEye; + DistortionMesh* _leftDistortionMesh; + DistortionMesh* _rightDistortionMesh; + Distortion* _distortion; + bool _vignetteEnabled; + + GLProgramState* _glProgramState; + VRGenericHeadTracker* _headTracker; +}; + +NS_CC_END + +#endif // CCVRGenericRenderer_hpp diff --git a/cocos/vr/CCVRProtocol.h b/cocos/vr/CCVRProtocol.h new file mode 100644 index 0000000000..d418e413af --- /dev/null +++ b/cocos/vr/CCVRProtocol.h @@ -0,0 +1,64 @@ +/**************************************************************************** + Copyright (c) 2016 Chukong Technologies Inc. + + http://www.cocos2d-x.org + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + ****************************************************************************/ + +#ifndef __CC_VR_PROTOCOL_H__ +#define __CC_VR_PROTOCOL_H__ + +#include + +#include "base/ccTypes.h" +#include "renderer/CCTexture2D.h" + +NS_CC_BEGIN + +class Scene; +class Renderer; +class GLView; + +class CC_DLL VRIHeadTracker +{ +public: + virtual ~VRIHeadTracker() {} + + // pose + virtual Vec3 getLocalPosition() = 0; + // rotation + virtual Mat4 getLocalRotation() = 0; +}; + +class CC_DLL VRIRenderer +{ +public: + virtual ~VRIRenderer() {} + + virtual void setup(GLView* glview) = 0; + virtual void cleanup() = 0; + virtual void render(Scene* scene, Renderer* renderer) = 0; + virtual VRIHeadTracker* getHeadTracker() = 0; +}; + + +NS_CC_END + +#endif // __CC_VR_PROTOCOL_H__ diff --git a/cocos/vr/CMakeLists.txt b/cocos/vr/CMakeLists.txt new file mode 100644 index 0000000000..be00df03e9 --- /dev/null +++ b/cocos/vr/CMakeLists.txt @@ -0,0 +1,7 @@ + +set(COCOS_VR_SRC + vr/CCVRDistortion.cpp + vr/CCVRDistortionMesh.cpp + vr/CCVRGenericRenderer.cpp + vr/CCVRGenericHeadTracker.cpp +) diff --git a/extensions/GUI/CCScrollView/CCScrollView.cpp b/extensions/GUI/CCScrollView/CCScrollView.cpp index b2375bf78d..fed38e0c83 100644 --- a/extensions/GUI/CCScrollView/CCScrollView.cpp +++ b/extensions/GUI/CCScrollView/CCScrollView.cpp @@ -573,21 +573,23 @@ void ScrollView::onBeforeDraw() Rect frame = getViewRect(); auto glview = Director::getInstance()->getOpenGLView(); - if (glview->isScissorEnabled()) { - _scissorRestored = true; - _parentScissorRect = glview->getScissorRect(); - //set the intersection of _parentScissorRect and frame as the new scissor rect - if (frame.intersectsRect(_parentScissorRect)) { - float x = MAX(frame.origin.x, _parentScissorRect.origin.x); - float y = MAX(frame.origin.y, _parentScissorRect.origin.y); - float xx = MIN(frame.origin.x+frame.size.width, _parentScissorRect.origin.x+_parentScissorRect.size.width); - float yy = MIN(frame.origin.y+frame.size.height, _parentScissorRect.origin.y+_parentScissorRect.size.height); - glview->setScissorInPoints(x, y, xx-x, yy-y); + if (glview->getVR() == nullptr) { + if (glview->isScissorEnabled()) { + _scissorRestored = true; + _parentScissorRect = glview->getScissorRect(); + //set the intersection of _parentScissorRect and frame as the new scissor rect + if (frame.intersectsRect(_parentScissorRect)) { + float x = MAX(frame.origin.x, _parentScissorRect.origin.x); + float y = MAX(frame.origin.y, _parentScissorRect.origin.y); + float xx = MIN(frame.origin.x + frame.size.width, _parentScissorRect.origin.x + _parentScissorRect.size.width); + float yy = MIN(frame.origin.y + frame.size.height, _parentScissorRect.origin.y + _parentScissorRect.size.height); + glview->setScissorInPoints(x, y, xx - x, yy - y); + } + } + else { + glEnable(GL_SCISSOR_TEST); + glview->setScissorInPoints(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height); } - } - else { - glEnable(GL_SCISSOR_TEST); - glview->setScissorInPoints(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height); } } } @@ -607,13 +609,14 @@ void ScrollView::onAfterDraw() { if (_clippingToBounds) { - if (_scissorRestored) {//restore the parent's scissor rect - auto glview = Director::getInstance()->getOpenGLView(); - - glview->setScissorInPoints(_parentScissorRect.origin.x, _parentScissorRect.origin.y, _parentScissorRect.size.width, _parentScissorRect.size.height); - } - else { - glDisable(GL_SCISSOR_TEST); + auto glview = Director::getInstance()->getOpenGLView(); + if (glview->getVR() == nullptr) { + if (_scissorRestored) {//restore the parent's scissor rect + glview->setScissorInPoints(_parentScissorRect.origin.x, _parentScissorRect.origin.y, _parentScissorRect.size.width, _parentScissorRect.size.height); + } + else { + glDisable(GL_SCISSOR_TEST); + } } } } diff --git a/tests/cpp-empty-test/Classes/AppDelegate.cpp b/tests/cpp-empty-test/Classes/AppDelegate.cpp index e452501b39..5875261c87 100644 --- a/tests/cpp-empty-test/Classes/AppDelegate.cpp +++ b/tests/cpp-empty-test/Classes/AppDelegate.cpp @@ -92,6 +92,10 @@ bool AppDelegate::applicationDidFinishLaunching() cocostudio::LocalizationHelper::setCurrentManager(lm, true); */ + // to enable VR, uncomment the following lines +// auto vrImpl = new VRGenericRenderer; +// glview->setVR(vrImpl); + // turn on display FPS director->setDisplayStats(true); diff --git a/tests/cpp-empty-test/proj.ios/Info.plist b/tests/cpp-empty-test/proj.ios/Info.plist index 68812d5ae5..c2053a7a8d 100644 --- a/tests/cpp-empty-test/proj.ios/Info.plist +++ b/tests/cpp-empty-test/proj.ios/Info.plist @@ -169,7 +169,6 @@ UISupportedInterfaceOrientations UIInterfaceOrientationLandscapeRight - UIInterfaceOrientationLandscapeLeft diff --git a/tests/cpp-tests/Classes/AppDelegate.cpp b/tests/cpp-tests/Classes/AppDelegate.cpp index b64a66ebde..2b68dc9e55 100644 --- a/tests/cpp-tests/Classes/AppDelegate.cpp +++ b/tests/cpp-tests/Classes/AppDelegate.cpp @@ -104,7 +104,11 @@ bool AppDelegate::applicationDidFinishLaunching() console->listenOnTCP(5678); _testController = TestController::getInstance(); - + + // To enable built-in VR, use this line. +// auto vrImpl = new VRGenericRenderer; +// glview->setVR(vrImpl); + return true; }