private void CreateLights() { scene.add(new THREE.AmbientLight(0x505050)); THREE.Light light = new THREE.SpotLight(0xffffff, 1.5); light.position.set(0, 500, 2000); light.castShadow = true; light.shadowCameraNear = 200; light.shadowCameraFar = camera.far; light.shadowCameraFov = 50; light.shadowBias = -0.00022; light.shadowDarkness = 0.5; light.shadowMapWidth = 2048; light.shadowMapHeight = 2048; scene.add(light); }
/// <summary> /// This is a javascript application. /// </summary> /// <param name="page">HTML document rendered by the web server which can now be enhanced.</param> public Application(IApp page) { // http://oos.moxiecode.com/js_webgl/md2_converter/MD2_converter.js // http://oos.moxiecode.com/js_webgl/md2_morphtarget_example/ var camz = 3000.0; var SHADOW_MAP_WIDTH = 1024; var SHADOW_MAP_HEIGHT = 512; var scene = new THREE.Scene(); scene.fog = new THREE.FogExp2(0x111111, 0.00098); // fov, aspect, near, far ) var camera = new THREE.PerspectiveCamera( 60, Native.window.aspect, 1, 10000 ); camera.position.z = camz; camera.position.y = 100; camera.lookAt(new THREE.Vector3(0, -94, 0)); scene.add(camera); var THREE_FlatShading = 1; // Ground var planeGeometry = new THREE.PlaneGeometry(10000, 10000); var planeMaterial_args = new { map = THREE.ImageUtils.loadTexture( new HTML.Images.FromAssets._4585_v4().src ), // WebGL: INVALID_ENUM: texParameter: invalid parameter shading = THREE_FlatShading, ambient = 0x666666, color = 0xffffff, specular = 0x666666, shininess = 1000000 }; var planeMaterial = new THREE.MeshPhongMaterial(planeMaterial_args); planeMaterial.map.repeat.x = 30; planeMaterial.map.repeat.y = 30; planeMaterial.map.wrapS = THREE.RepeatWrapping; planeMaterial.map.wrapT = THREE.RepeatWrapping; var plane = new THREE.Mesh(planeGeometry, planeMaterial); //plane.rotation.x = -Math.PI/2; plane.rotation.y = -Math.PI * 0.75; plane.position.y = -94; plane.castShadow = false; plane.receiveShadow = true; scene.add(plane); // Lights var ambient = new THREE.AmbientLight(0x333333); scene.add(ambient); var light = new THREE.SpotLight(0xffffff, 1.0); light.position.set(100, 350, 140); light.target.position.set(0, -94, 0); light.castShadow = true; light.shadowCameraNear = 1; light.shadowCameraFar = camera.far; light.shadowCameraFov = 50; light.shadowMapBias = 0.000001; light.shadowMapDarkness = 0.15; light.shadowMapWidth = SHADOW_MAP_WIDTH; light.shadowMapHeight = SHADOW_MAP_HEIGHT; scene.add(light); // Model var material = new THREE.MeshPhongMaterial( new { map = THREE.ImageUtils.loadTexture( new HTML.Images.FromAssets.blade_black().src ), ambient = 0x999999, color = 0xffffff, specular = 0xffffff, shininess = 25, morphTargets = true } ); #region tris_md2 new THREE.JSONLoader().load( new global::WebGLMD2MorphtargetExample.Data.tris_md2().Content.src, new Action<object>( async geometry => { var mesh = new THREE.MorphAnimMesh(geometry, material); mesh.rotation.y = -Math.PI / 2; mesh.scale.set(4, 4, 4); mesh.duration = 1000 * 20; mesh.castShadow = true; mesh.receiveShadow = false; scene.add(mesh); // renderer var renderer = new THREE.WebGLRenderer(new { antialias = false }); //renderer.setClearColorHex(0x111111, 1); //renderer.setClearColorHex(0x111111); renderer.setSize(); renderer.domElement.AttachToDocument(); renderer.domElement.style.SetLocation(0, 0); renderer.domElement.style.backgroundColor = "black"; renderer.shadowMapEnabled = true; renderer.shadowMapSoft = true; var clock = new Stopwatch(); clock.Start(); while (true) { double delta = clock.ElapsedMilliseconds; clock.Restart(); //if (delta > 1000 || delta == 0) //{ // delta = 1000 / 60.0; //} //Console.WriteLine(new { delta }); mesh.updateAnimation(delta); camz += (450 - camz) / 20.0; camera.position.z = camz; renderer.render(scene, camera); //await Native.window.requestAnimationFrameAsync; await Native.window.async.onframe; }; } ) ); #endregion }
public override void Init() { // create a scene, that will hold all our elements such as objects, cameras and lights. scene = new THREE.Scene(); // create a camera, which defines where we're looking at. camera = new THREE.PerspectiveCamera(45, Width / Height, 0.1, 1000); // create a render and set the size renderer = new THREE.WebGLRenderer(); renderer.setClearColor(new THREE.Color(0xEEEEEE)); renderer.setSize(Width, Height); renderer.shadowMapEnabled = true; // add the output of the renderer to the html element Container.AppendChild(renderer.domElement); // create the ground plane var planeGeometry = new THREE.PlaneGeometry(60, 20); var planeMaterial = new THREE.MeshLambertMaterial(); planeMaterial.color = new THREE.Color(0.9, 0.9, 0.9); var plane = new THREE.Mesh(planeGeometry, planeMaterial); plane.receiveShadow = true; // rotate and position the plane plane.rotation.x = -0.5 * Math.PI; plane.position.x = 15; plane.position.y = 0; plane.position.z = 0; // add the plane to the scene scene.add(plane); // create a cube var cubeGeometry = new THREE.CubeGeometry(4, 4, 4); var cubeMaterial = new THREE.MeshLambertMaterial(); // { color = 0xff0000 }; cubeMaterial.color = new THREE.Color(1, 0, 0); var cube = new THREE.Mesh(cubeGeometry, cubeMaterial); cube.castShadow = true; // position the cube cube.position.x = -4; cube.position.y = 3; cube.position.z = 0; // add the cube to the scene scene.add(cube); var sphereGeometry = new THREE.SphereGeometry(4, 20, 20); var sphereMaterial = new THREE.MeshLambertMaterial(); // { color = 0x7777ff }; sphereMaterial.color = new THREE.Color(0, 0, 1); var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial); // position the sphere sphere.position.x = 20; sphere.position.y = 4; sphere.position.z = 2; sphere.castShadow = true; // add the sphere to the scene scene.add(sphere); // position and point the camera to the center of the scene camera.position.x = -30; camera.position.y = 40; camera.position.z = 30; camera.lookAt(scene.position); // add spotlight for the shadows var spotLight = new THREE.SpotLight(); //0xffffff); spotLight.color = new THREE.Color(1, 1, 1); spotLight.position.set(-40, 60, -10); spotLight.castShadow = true; scene.add(spotLight); controls = new THREE.TrackballControls(camera); controls.rotateSpeed = 10.0; controls.zoomSpeed = 1.2; controls.panSpeed = 0.8; controls.noZoom = false; controls.noPan = false; controls.staticMoving = true; controls.dynamicDampingFactor = 0.3; controls.keys = new int[] { 65, 83, 68 }; }
// https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/15-dualvr/20140815/webglcannonphysicsengine // http://youtu.be/Lo1IU8UAutE // 60hz 2160 4K! // The equirectangular projection was used in map creation since it was invented around 100 A.D. by Marinus of Tyre. // C:\Users\Arvo> "x:\util\android-sdk-windows\platform-tools\adb.exe" push "X:\vr\hzsky.png" "/sdcard/oculus/360photos/" //1533 KB/s(3865902 bytes in 2.461s) //C:\Users\Arvo> "x:\util\android-sdk-windows\platform-tools\adb.exe" push "X:\vr\tape360globe1\0000.png" "/sdcard/oculus/360photos/tape360globe1.png" //1556 KB/s(2714294 bytes in 1.703s) // "x:\util\android-sdk-windows\platform-tools\adb.exe" push "X:\vr\hz2048c3840x2160.png" "/sdcard/oculus/360photos/" // "x:\util\android-sdk-windows\platform-tools\adb.exe" push "X:\vr\tape360globe1\0000.png" "/sdcard/oculus/360photos/tape360globe2.png" // "x:\util\android-sdk-windows\platform-tools\adb.exe" push "X:\vr\tape360globe1\0000.png" "/sdcard/oculus/360photos/tape360globenight.png" // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/15-dualvr/20150809/chrome360hz // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/15-dualvr/20150809 // the eye nor the display will be able to do any stereo // until tech is near matrix capability. 2019? // cubemap can be used for all long range scenes // http://www.imdb.com/title/tt0112111/?ref_=nv_sr_1 // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/15-dualvr/20150808/cubemapcamera // subst /D b: // subst b: s:\jsc.svn\examples\javascript\chrome\apps\WebGL\ChromeStereoLightAnimation\ChromeStereoLightAnimation\bin\Debug\staging\ChromeStereoLightAnimation.Application\web // subst a: z:\jsc.svn\examples\javascript\chrome\apps\WebGL\ChromeStereoLightAnimation\ChromeStereoLightAnimation\bin\Debug\staging\ChromeStereoLightAnimation.Application\web // Z:\jsc.svn\examples\javascript\chrome\apps\WebGL\ChromeStereoLightAnimation\ChromeStereoLightAnimation\bin\Debug\staging\ChromeStereoLightAnimation.Application\web // what if we want to do subst in another winstat or session? // ColladaLoader: Empty or non-existing file (assets/ChromeStereoLightAnimation/S6Edge.dae) /// <summary> /// This is a javascript application. /// </summary> /// <param name="page">HTML document rendered by the web server which can now be enhanced.</param> public Application(IApp page) { // http://stemkoski.github.io/Three.js/Shadow.html #if AsWEBSERVER #region += Launched chrome.app.window // X:\jsc.svn\examples\javascript\chrome\apps\ChromeTCPServerAppWindow\ChromeTCPServerAppWindow\Application.cs dynamic self = Native.self; dynamic self_chrome = self.chrome; object self_chrome_socket = self_chrome.socket; if (self_chrome_socket != null) { // if we run as a server. we can open up on android. //chrome.Notification.DefaultTitle = "Nexus7"; //chrome.Notification.DefaultIconUrl = new x128().src; ChromeTCPServer.TheServerWithStyledForm.Invoke( AppSource.Text //, AtFormCreated: FormStyler.AtFormCreated //AtFormConstructor: // f => // { // //arg[0] is typeof System.Int32 // //script: error JSC1000: No implementation found for this native method, please implement [static System.Drawing.Color.FromArgb(System.Int32)] // // X:\jsc.svn\examples\javascript\forms\Test\TestFromArgb\TestFromArgb\ApplicationControl.cs // f.BackColor = System.Drawing.Color.FromArgb(0xA26D41); // } ); return; } #endregion #else #region += Launched chrome.app.window dynamic self = Native.self; dynamic self_chrome = self.chrome; object self_chrome_socket = self_chrome.socket; if (self_chrome_socket != null) { if (!(Native.window.opener == null && Native.window.parent == Native.window.self)) { Console.WriteLine("chrome.app.window.create, is that you?"); // pass thru } else { // should jsc send a copresence udp message? //chrome.runtime.UpdateAvailable += delegate //{ // new chrome.Notification(title: "UpdateAvailable"); //}; chrome.app.runtime.Launched += async delegate { // 0:12094ms chrome.app.window.create {{ href = chrome-extension://aemlnmcokphbneegoefdckonejmknohh/_generated_background_page.html }} Console.WriteLine("chrome.app.window.create " + new { Native.document.location.href }); new chrome.Notification(title: "ChromeStereoLightAnimation"); // https://developer.chrome.com/apps/app_window#type-CreateWindowOptions var xappwindow = await chrome.app.window.create( Native.document.location.pathname, options: new { alwaysOnTop = true, visibleOnAllWorkspaces = true } ); //xappwindow.setAlwaysOnTop xappwindow.show(); await xappwindow.contentWindow.async.onload; Console.WriteLine("chrome.app.window loaded!"); }; return; } } #endregion #endif Native.body.Clear(); Native.body.style.margin = "0px"; Native.body.style.padding = "0px"; Native.body.style.overflow = IStyle.OverflowEnum.hidden; // Severity Code Description Project File Line //Error CS0201 Only assignment, call, increment, decrement, and new object expressions can be used as a statement ChromeStereoLightAnimation Z:\jsc.svn\examples\javascript\chrome\apps\WebGL\ChromeStereoLightAnimation\ChromeStereoLightAnimation\Application.cs 187 //new Action<int>( var camera0 = default(THREE.PerspectiveCamera); foreach (var y in from eyeid in new[] { 0, 1 } select (Action) delegate { var scene = new THREE.Scene(); var floorTexture = THREE.ImageUtils.loadTexture( new HTML.Images.FromAssets.checkerboard().src //"images/checkerboard.jpg" ); #region function init() // SCENE // CAMERA float SCREEN_WIDTH = Native.window.Width / 2; //float SCREEN_WIDTH = Native.screen.width / 2; float SCREEN_HEIGHT = Native.window.Height; var VIEW_ANGLE = 45; float ASPECT = SCREEN_WIDTH / SCREEN_HEIGHT; var NEAR = 0.1; var FAR = 20000; // RENDERER // WebGLDeferredRenderer var renderer = new THREE.WebGLRenderer(new { antialias = true }); //renderer.setSize((int)SCREEN_WIDTH, (int)SCREEN_HEIGHT); renderer.domElement.AttachToDocument(); //renderer.domElement.style.SetLocation(Native.window.Width / 2 * (1 - eyeid), 0); // EVENTS // CONTROLS // STATS // LIGHT //var light = new THREE.PointLight(0xffffff); //light.position.set(0,250,0); //scene.add(light); //////////// // CUSTOM // //////////// // must enable shadows on the renderer renderer.shadowMapEnabled = true; // SKYBOX/FOG var skyBoxGeometry = new THREE.CubeGeometry(10000, 10000, 10000); var skyBoxMaterial = new THREE.MeshBasicMaterial(new { color = 0x9999ff, side = THREE.BackSide }); var skyBox = new THREE.Mesh(skyBoxGeometry, skyBoxMaterial); // scene.add(skyBox); scene.fog = new THREE.FogExp2(0x9999ff, 0.00025); // "shadow cameras" show the light source and direction // spotlight #1 -- yellow, dark shadow var spotlight = new THREE.SpotLight(0xffff00); spotlight.position.set(-60, 150, -30); spotlight.shadowCameraVisible = true; spotlight.shadowDarkness = 0.95; spotlight.intensity = 2; // must enable shadow casting ability for the light spotlight.castShadow = true; scene.add(spotlight); // spotlight #2 -- red, light shadow var spotlight2 = new THREE.SpotLight(0xff0000); //var spotlight2 = new THREE.SpotLight(0xffff00); spotlight2.position.set(60, 150, -60); scene.add(spotlight2); spotlight2.shadowCameraVisible = true; spotlight2.shadowDarkness = 0.70; spotlight2.intensity = 2; spotlight2.castShadow = true; // THREE.WebGLProgram: gl.getProgramInfoLog() Pixel shader sampler count exceeds MAX_TEXTURE_IMAGE_UNITS (16). for (int i = 0; i < 8; i++) { // spotlight #3 blue var spotlight3 = new THREE.SpotLight(0x0000ff); //var spotlight3 = new THREE.SpotLight(0x00ffff); spotlight3.position.set(150 * i, 80, -100); //spotlight3.shadowCameraVisible = true; spotlight3.shadowDarkness = 0.95; spotlight3.intensity = 2; spotlight3.castShadow = true; scene.add(spotlight3); // change the direction this spotlight is facing var lightTarget = new THREE.Object3D(); lightTarget.position.set(150 * i, 10, -100); scene.add(lightTarget); spotlight3.target = lightTarget; } // cube: mesh to cast shadows #region castShadow var cubeGeometry = new THREE.CubeGeometry(50, 50, 50); var cubeMaterial = new THREE.MeshLambertMaterial(new { color = 0x888888 }); var cube0 = new THREE.Mesh(cubeGeometry, cubeMaterial); //cube.position.set(0, 50, 0); cube0.position.set(0, 100, 0); // Note that the mesh is flagged to cast shadows cube0.castShadow = true; scene.add(cube0); // floor: mesh to receive shadows // public static ImageUtilsType ImageUtils; //var floorTexture = new THREE.ImageUtils.loadTexture("images/checkerboard.jpg"); floorTexture.wrapS = THREE.RepeatWrapping; floorTexture.wrapT = THREE.RepeatWrapping; floorTexture.repeat.set(10, 10); #endregion // Note the change to Lambert material. #region receiveShadow var floorMaterial = new THREE.MeshLambertMaterial(new { map = floorTexture, side = THREE.DoubleSide }); //var floorGeometry = new THREE.PlaneGeometry(1000 * 8, 1000 * 8, 100, 100); var floorGeometry = new THREE.PlaneGeometry(1000, 1000, 100, 100); for (int i = 0; i < 8; i++) { var floor0 = new THREE.Mesh(floorGeometry, floorMaterial); floor0.position.y = -0.5; floor0.position.x = 1000 * i; floor0.rotation.x = Math.PI / 2; // Note the mesh is flagged to receive shadows floor0.receiveShadow = true; scene.add(floor0); } #endregion // create "light-ball" meshes var sphereGeometry = new THREE.SphereGeometry(10, 16, 8); var darkMaterial = new THREE.MeshBasicMaterial(new { color = 0x000000 }); { var wireframeMaterial = new THREE.MeshBasicMaterial( new { color = 0xffff00, wireframe = true, transparent = true }); var shape = THREE.SceneUtils.createMultiMaterialObject( sphereGeometry, new[] { darkMaterial, wireframeMaterial }); shape.position = spotlight.position; scene.add(shape); } { var wireframeMaterial = new THREE.MeshBasicMaterial( new { color = 0xff0000, wireframe = true, transparent = true }); var shape = THREE.SceneUtils.createMultiMaterialObject( sphereGeometry, new[] { darkMaterial, wireframeMaterial }); shape.position = spotlight2.position; scene.add(shape); } //{ // var wireframeMaterial = new THREE.MeshBasicMaterial( // new { color = 0x0000ff, wireframe = true, transparent = true }); // var shape = THREE.SceneUtils.createMultiMaterialObject( // sphereGeometry, new[] { darkMaterial, wireframeMaterial }); // shape.position = spotlight3.position; // scene.add(shape); //} #endregion var camera = new THREE.PerspectiveCamera(VIEW_ANGLE, ASPECT, NEAR, FAR); scene.add(camera); camera.position.set(0, 150, 400); camera.lookAt(scene.position); if (eyeid == 0) { camera0 = camera; var controls = new THREE.OrbitControls(camera0, renderer.domElement); //var controls = new THREE.OrbitControls(camera0, Native.document.body); Native.window.onframe += delegate { renderer.render(scene, camera0); controls.update(); //stats.update(); }; } else { Native.window.onframe += delegate { camera.rotation.set(camera0.rotation.x, camera0.rotation.y, camera0.rotation.z); camera.position.set(camera0.position.x, camera0.position.y, camera0.position.z); // lets not add any stereo effect. as we may need to run in 360 mono mode anyway to gain speed? //camera.translateX() // scene is unique to renderer!!!!! // we are doing everything twice for now. renderer.render(scene, camera); //controls.update(); //stats.update(); }; } #region onresize new { }.With( async delegate { do { // allow webview to behave in S6 multiview mode //SCREEN_WIDTH = Native.screen.width / 2; SCREEN_WIDTH = Native.window.Width / 2; //camera.aspect = Native.window.aspect; camera.aspect = SCREEN_WIDTH / Native.window.Height; camera.updateProjectionMatrix(); //renderer0.setSize(Native.window.Width / 2, Native.window.Height); renderer.setSize((int)SCREEN_WIDTH, Native.window.Height); //renderer0.domElement.style.SetLocation(Native.window.Width / 2 * eyeid, 0); renderer.domElement.style.SetLocation((int)SCREEN_WIDTH * (1 - eyeid), 0); } while (await Native.window.async.onresize); }); #endregion } ) y(); Console.WriteLine("do you see it?"); }
// https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/15-dualvr/20140815/webglcannonphysicsengine // inspired by http://granular.cs.umu.se/cannon.js/examples/threejs_fps.html /// <summary> /// This is a javascript application. /// </summary> /// <param name="page">HTML document rendered by the web server which can now be enhanced.</param> public Application(IApp page = null) { //Uncaught Error: ERROR: Quaternion's .setFromEuler() now expects a Euler rotation rather than a Vector3 and order. Please update your code. // WEBGL11095: INVALID_OPERATION: clearStencil: Method not currently supported // IE11 does not work yet //DiagnosticsConsole.ApplicationContent.BindKeyboardToDiagnosticsConsole(); // DEPRECATED: Quaternion's .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead. Three.js:913 //Uncaught TypeError: Object [object Object] has no method 'subSelf' // { REVISION: '57' }; var boxes = new List<CANNON.RigidBody>(); var boxMeshes = new List<THREE.Mesh>(); var balls = new List<CANNON.RigidBody>(); var ballMeshes = new List<THREE.Mesh>(); Func<long> Date_now = () => (long)new IFunction("return Date.now();").apply(null); var time = Date_now(); #region initCannon // // Setup our world var world = new CANNON.World(); world.quatNormalizeSkip = 0; world.quatNormalizeFast = false; //world.solver.setSpookParams(300, 10); world.solver.iterations = 5; world.gravity.set(0, -20, 0); world.broadphase = new CANNON.NaiveBroadphase(); // // Create a slippery material (friction coefficient = 0.0) var physicsMaterial = new CANNON.Material("slipperyMaterial"); var physicsContactMaterial = new CANNON.ContactMaterial( physicsMaterial, physicsMaterial, 0.0, // friction coefficient 0.3 // restitution ); // // We must add the contact materials to the world world.addContactMaterial(physicsContactMaterial); var controls_sphereShape = default(CANNON.Sphere); var controls_sphereBody = default(CANNON.RigidBody); { // Create a sphere var mass = 5; var radius = 1.3; var sphereShape = new CANNON.Sphere(radius); var sphereBody = new CANNON.RigidBody(mass, sphereShape, physicsMaterial); controls_sphereShape = sphereShape; controls_sphereBody = sphereBody; sphereBody.position.set(0, 5, 0); sphereBody.linearDamping = 0.05; world.add(sphereBody); // // Create a plane var groundShape = new CANNON.Plane(); var groundBody = new CANNON.RigidBody(0, groundShape, physicsMaterial); groundBody.quaternion.setFromAxisAngle(new CANNON.Vec3(1, 0, 0), -Math.PI / 2); world.add(groundBody); } #endregion #region init var camera = new THREE.PerspectiveCamera(75, Native.window.aspect, 0.1, 1000); var scene = new THREE.Scene(); scene.fog = new THREE.Fog(0x000000, 0, 500); var ambient = new THREE.AmbientLight(0x111111); scene.add(ambient); var light = new THREE.SpotLight(0xffffff, 1.0); light.position.set(10, 30, 20); light.target.position.set(0, 0, 0); // if(true){ light.castShadow = true; light.shadowCameraNear = 20; light.shadowCameraFar = 50;//camera.far; light.shadowCameraFov = 40; light.shadowMapBias = 0.1; light.shadowMapDarkness = 0.7; light.shadowMapWidth = 2 * 512; light.shadowMapHeight = 2 * 512; // //light.shadowCameraVisible = true; // } scene.add(light); var controls = new PointerLockControls(camera, controls_sphereBody); scene.add(controls.getObject()); // // floor var geometry = new THREE.PlaneGeometry(300, 300, 50, 50); geometry.applyMatrix(new THREE.Matrix4().makeRotationX(-Math.PI / 2)); var material = new THREE.MeshLambertMaterial(new { color = 0xdddddd }); //Native.Window. // THREE.Design.THREE.ColorUtils.adjustHSV(material.color, 0, 0, 0.9); // Replaced ColorUtils.adjustHSV() with Color's .offsetHSL(). //new IFunction("material", "THREE.ColorUtils.offsetHSL( material.color, 0, 0, 0.9 );").apply(null, material); // var mesh = new THREE.Mesh(geometry, material) { castShadow = true, receiveShadow = true }; scene.add(mesh); var renderer = new THREE.WebGLRenderer(new object()); renderer.shadowMapEnabled = true; renderer.shadowMapSoft = true; //renderer.setSize(Native.Window.Width, Native.Window.Height); //renderer.setClearColor(scene.fog.color, 1); renderer.domElement.style.backgroundColor = JSColor.Black; renderer.domElement.AttachToDocument(); #region onresize Action AtResize = delegate { camera.aspect = Native.window.aspect; camera.updateProjectionMatrix(); renderer.setSize(Native.window.Width, Native.window.Height); }; Native.window.onresize += delegate { AtResize(); }; AtResize(); #endregion var r = new Random(); Func<f> Math_random = () => r.NextFloat(); #region Add boxes { // for (var i = 0; i < 32; i++) { var boxsize = Math_random() * 0.5; var halfExtents = new CANNON.Vec3(boxsize, boxsize, boxsize); var boxShape = new CANNON.Box(halfExtents); var boxGeometry = new THREE.CubeGeometry(halfExtents.x * 2, halfExtents.y * 2, halfExtents.z * 2); var x = (Math_random() - 0.5) * 20; var y = 1 + (Math_random() - 0.5) * 1; var z = (Math_random() - 0.5) * 20; var boxBody = new CANNON.RigidBody(5, boxShape); var boxMesh = new THREE.Mesh(boxGeometry, material); world.add(boxBody); scene.add(boxMesh); boxBody.position.set(x, y, z); boxMesh.position.set(x, y, z); boxMesh.castShadow = true; boxMesh.receiveShadow = true; //boxMesh.useQuaternion = true; boxes.Add(boxBody); boxMeshes.Add(boxMesh); } } #endregion #region Add linked boxes { // var size = 0.5; var he = new CANNON.Vec3(size, size, size * 0.1); var boxShape = new CANNON.Box(he); var mass = 0.0; var space = 0.1 * size; var N = 5; var last = default(CANNON.RigidBody); var boxGeometry = new THREE.CubeGeometry(he.x * 2, he.y * 2, he.z * 2); for (var i = 0; i < N; i++) { var boxbody = new CANNON.RigidBody(mass, boxShape); var boxMesh = new THREE.Mesh(boxGeometry, material); boxbody.position.set(5, (N - i) * (size * 2 + 2 * space) + size * 2 + space, 0); boxbody.linearDamping = 0.01; boxbody.angularDamping = 0.01; //boxMesh.useQuaternion = true; boxMesh.castShadow = true; boxMesh.receiveShadow = true; world.add(boxbody); scene.add(boxMesh); boxes.Add(boxbody); boxMeshes.Add(boxMesh); if (i != 0) { // Connect this body to the last one var c1 = new CANNON.PointToPointConstraint(boxbody, new CANNON.Vec3(-size, size + space, 0), last, new CANNON.Vec3(-size, -size - space, 0)); var c2 = new CANNON.PointToPointConstraint(boxbody, new CANNON.Vec3(size, size + space, 0), last, new CANNON.Vec3(size, -size - space, 0)); world.addConstraint(c1); world.addConstraint(c2); } else { mass = 0.3; } last = boxbody; } } #endregion #endregion var dt = 1.0 / 60; controls.enabled = true; // vr and tilt shift? Native.window.onframe += delegate { if (controls.enabled) { // how big of a world can we hold? // async ? world.step(dt); // Update ball positions for (var i = 0; i < balls.Count; i++) { balls[i].position.copy(ballMeshes[i].position); balls[i].quaternion.copy(ballMeshes[i].quaternion); } // Update box positions for (var i = 0; i < boxes.Count; i++) { boxes[i].position.copy(boxMeshes[i].position); boxes[i].quaternion.copy(boxMeshes[i].quaternion); } } controls.update(Date_now() - time); renderer.render(scene, camera); time = Date_now(); }; #region havePointerLock renderer.domElement.onclick += delegate { renderer.domElement.requestPointerLock(); }; #endregion #region onmousedown renderer.domElement.onmousedown += e => { if (e.MouseButton == IEvent.MouseButtonEnum.Middle) { if (Native.document.pointerLockElement == Native.document.body) { // cant requestFullscreen while pointerLockElement Console.WriteLine("exitPointerLock"); Native.document.exitPointerLock(); Native.document.exitFullscreen(); return; } Console.WriteLine("requestFullscreen"); renderer.domElement.requestFullscreen(); renderer.domElement.requestPointerLock(); return; } var ballradius = 0.1 + Math_random() * 0.9; var ballShape = new CANNON.Sphere(ballradius); var ballGeometry = new THREE.SphereGeometry(ballShape.radius, 32, 32); var shootDirection = new THREE.Vector3(); var shootVelo = 15; var projector = new THREE.Projector(); Action<THREE.Vector3> getShootDir = (targetVec) => { var vector = targetVec; targetVec.set(0, 0, 1); projector.unprojectVector(vector, camera); var ray = new THREE.Ray( (THREE.Vector3)(object)controls_sphereBody.position, vector //.subSelf(controls_sphereBody.position) .normalize() ); targetVec.x = ray.direction.x; targetVec.y = ray.direction.y; targetVec.z = ray.direction.z; }; var x = controls_sphereBody.position.x; var y = controls_sphereBody.position.y; var z = controls_sphereBody.position.z; // could we attach physics via binding list? var ballBody = new CANNON.RigidBody(1, ballShape); var ballMesh = new THREE.Mesh(ballGeometry, material); world.add(ballBody); scene.add(ballMesh); ballMesh.castShadow = true; ballMesh.receiveShadow = true; balls.Add(ballBody); ballMeshes.Add(ballMesh); getShootDir(shootDirection); ballBody.velocity.set(shootDirection.x * shootVelo, shootDirection.y * shootVelo, shootDirection.z * shootVelo); // // Move the ball outside the player sphere x += shootDirection.x * (controls_sphereShape.radius + ballShape.radius); y += shootDirection.y * (controls_sphereShape.radius + ballShape.radius); z += shootDirection.z * (controls_sphereShape.radius + ballShape.radius); ballBody.position.set(x, y, z); ballMesh.position.set(x, y, z); //ballMesh.useQuaternion = true; }; #endregion //var ze = new ZeProperties(); //ze.Show(); //ze.Left = 0; //ze.Add(() => renderer); //ze.Add(() => controls); //ze.Add(() => scene); }
// http://youtu.be/Lo1IU8UAutE // 60hz 2160 4K! // The equirectangular projection was used in map creation since it was invented around 100 A.D. by Marinus of Tyre. // C:\Users\Arvo> "x:\util\android-sdk-windows\platform-tools\adb.exe" push "X:\vr\hzsky.png" "/sdcard/oculus/360photos/" //1533 KB/s(3865902 bytes in 2.461s) //C:\Users\Arvo> "x:\util\android-sdk-windows\platform-tools\adb.exe" push "X:\vr\hznosky.png" "/sdcard/oculus/360photos/" //1556 KB/s(2714294 bytes in 1.703s) // "x:\util\android-sdk-windows\platform-tools\adb.exe" push "X:\vr\hz2048c3840x2160.png" "/sdcard/oculus/360photos/" // "X:\vr\tape360hzlights\0000.png" // "x:\util\android-sdk-windows\platform-tools\adb.exe" push "r:\vr\tape360hzlights\0000.png" "/sdcard/oculus/360photos/hzlights.png" // 1421 KB/s (2516443 bytes in 1.729s) // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/15-dualvr/20150809/chrome360hz // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/15-dualvr/20150809 // the eye nor the display will be able to do any stereo // until tech is near matrix capability. 2019? // cubemap can be used for all long range scenes // http://www.imdb.com/title/tt0112111/?ref_=nv_sr_1 // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/15-dualvr/20150808/cubemapcamera // subst /D a: // subst a: s:\jsc.svn\examples\javascript\chrome\apps\WebGL\Chrome360LightAnimation\Chrome360LightAnimation\bin\Debug\staging\Chrome360LightAnimation.Application\web // subst a: z:\jsc.svn\examples\javascript\chrome\apps\WebGL\Chrome360LightAnimation\Chrome360LightAnimation\bin\Debug\staging\Chrome360LightAnimation.Application\web // Z:\jsc.svn\examples\javascript\chrome\apps\WebGL\Chrome360LightAnimation\Chrome360LightAnimation\bin\Debug\staging\Chrome360LightAnimation.Application\web // what if we want to do subst in another winstat or session? // ColladaLoader: Empty or non-existing file (assets/Chrome360LightAnimation/S6Edge.dae) /// <summary> /// This is a javascript application. /// </summary> /// <param name="page">HTML document rendered by the web server which can now be enhanced.</param> public Application(IApp page) { //FormStyler.AtFormCreated = //s => //{ // s.Context.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; // //var x = new ChromeTCPServerWithFrameNone.HTML.Pages.AppWindowDrag().AttachTo(s.Context.GetHTMLTarget()); // var x = new ChromeTCPServerWithFrameNone.HTML.Pages.AppWindowDragWithShadow().AttachTo(s.Context.GetHTMLTarget()); // s.Context.GetHTMLTarget().style.backgroundColor = "#efefef"; // //s.Context.GetHTMLTarget().style.backgroundColor = "#A26D41"; //}; #if AsWEBSERVER #region += Launched chrome.app.window // X:\jsc.svn\examples\javascript\chrome\apps\ChromeTCPServerAppWindow\ChromeTCPServerAppWindow\Application.cs dynamic self = Native.self; dynamic self_chrome = self.chrome; object self_chrome_socket = self_chrome.socket; if (self_chrome_socket != null) { // if we run as a server. we can open up on android. //chrome.Notification.DefaultTitle = "Nexus7"; //chrome.Notification.DefaultIconUrl = new x128().src; ChromeTCPServer.TheServerWithStyledForm.Invoke( AppSource.Text //, AtFormCreated: FormStyler.AtFormCreated //AtFormConstructor: // f => // { // //arg[0] is typeof System.Int32 // //script: error JSC1000: No implementation found for this native method, please implement [static System.Drawing.Color.FromArgb(System.Int32)] // // X:\jsc.svn\examples\javascript\forms\Test\TestFromArgb\TestFromArgb\ApplicationControl.cs // f.BackColor = System.Drawing.Color.FromArgb(0xA26D41); // } ); return; } #endregion #else #region += Launched chrome.app.window dynamic self = Native.self; dynamic self_chrome = self.chrome; object self_chrome_socket = self_chrome.socket; if (self_chrome_socket != null) { if (!(Native.window.opener == null && Native.window.parent == Native.window.self)) { Console.WriteLine("chrome.app.window.create, is that you?"); // pass thru } else { // should jsc send a copresence udp message? //chrome.runtime.UpdateAvailable += delegate //{ // new chrome.Notification(title: "UpdateAvailable"); //}; chrome.app.runtime.Launched += async delegate { // 0:12094ms chrome.app.window.create {{ href = chrome-extension://aemlnmcokphbneegoefdckonejmknohh/_generated_background_page.html }} Console.WriteLine("chrome.app.window.create " + new { Native.document.location.href }); new chrome.Notification(title: "Chrome360LightAnimation"); // https://developer.chrome.com/apps/app_window#type-CreateWindowOptions var xappwindow = await chrome.app.window.create( Native.document.location.pathname, options: new { alwaysOnTop = true, visibleOnAllWorkspaces = true } ); //xappwindow.setAlwaysOnTop xappwindow.show(); await xappwindow.contentWindow.async.onload; Console.WriteLine("chrome.app.window loaded!"); }; return; } } #endregion #endif //const int size = 128; //const int size = 256; // 6 faces, 12KB //const int size = 512; // 6 faces, ? // WebGL: drawArrays: texture bound to texture unit 0 is not renderable. It maybe non-power-of-2 and have incompatible texture filtering or is not 'texture complete'. Or the texture is Float or Half Float type with linear filtering while OES_float_linear or OES_half_float_linear extension is not enabled. //const int size = 720; // 6 faces, ? //const int size = 1024; // 6 faces, ? //const int cubefacesize = 1024; // 6 faces, ? // THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter is set to THREE.LinearFilter or THREE.NearestFilter. ( chrome-extension://aemlnmcokphbneegoefdckonejmknohh/assets/Chrome360LightAnimation/anvil___spherical_hdri_panorama_skybox_by_macsix_d6vv4hs.jpg ) int cubefacesize = 2048; // 6 faces, ? // "X:\vr\tape1\0000x2048.png" // for 60hz render we may want to use float camera percision, not available for ui. // "x:\util\android-sdk-windows\platform-tools\adb.exe" push "X:\vr\tape1\0000x2048.png" "/sdcard/oculus/360photos/" // "x:\util\android-sdk-windows\platform-tools\adb.exe" push "X:\vr\tape1\0000x128.png" "/sdcard/oculus/360photos/" //if (Environment.ProcessorCount < 8) // //cubefacesize = 64; // 6 faces, ? // cubefacesize = 128; // 6 faces, ? new IHTMLPre { new { Environment.ProcessorCount, cubefacesize } }.AttachToDocument(); // can we keep fast fps yet highp? // can we choose this on runtime? designtime wants fast fps, yet for end product we want highdef on our render farm? //const int cubefacesize = 128; // 6 faces, ? //var cubecameraoffsetx = 256; var cubecameraoffsetx = 400; //var uizoom = 0.1; //var uizoom = cubefacesize / 128f; var uizoom = 128f / cubefacesize; var far = 0xffffff; Native.css.style.backgroundColor = "blue"; Native.css.style.overflow = IStyle.OverflowEnum.hidden; Native.body.Clear(); (Native.body.style as dynamic).webkitUserSelect = "text"; //new IHTMLPre { "can we stream it into VR, shadertoy, youtube 360, youtube stereo yet?" }.AttachToDocument(); var sw = Stopwatch.StartNew(); var oo = new List<THREE.Object3D>(); var window = Native.window; // what about physics and that portal rendering? // if we are running as a chrome web server, we may also be opened as android ndk webview app //var cameraPX = new THREE.PerspectiveCamera(fov: 90, aspect: window.aspect, near: 1, far: 2000); // once we update source // save the source // manually recompile //cameraPX.position.z = 400; //// the camera should be close enough for the object to float off the FOV of PX //cameraPX.position.z = 200; // scene // can we make the 3D object orbit around us ? // and // stream it to vr? var scene = new THREE.Scene(); // since our cube camera is somewhat a fixed thing // would it be easier to move mountains to come to us? // once we change code would chrome app be able to let VR know that a new view is available? var sceneg = new THREE.Group(); sceneg.AttachTo(scene); // fly up? //sceneg.translateZ(-1024); // rotate the world, as the skybox then matches what we have on filesystem scene.rotateOnAxis(new THREE.Vector3(0, 1, 0), -Math.PI / 2); // yet for headtracking we shall rotate camera //sceneg.position.set(0, 0, -1024); //sceneg.position.set(0, -1024, 0); var ambient = new THREE.AmbientLight(0x303030).AttachTo(sceneg); //scene.add(ambient); // should we fix jsc to do a more correct IDL? //var directionalLight = new THREE.DirectionalLight(0xffffff, 0.7); //directionalLight.position.set(0, 0, 1); //scene.add(directionalLight); #region light //var light = new THREE.DirectionalLight(0xffffff, 1.0); var light = new THREE.DirectionalLight(0xffffff, 2.5); //var light = new THREE.DirectionalLight(0xffffff, 2.5); //var light = new THREE.DirectionalLight(0xffffff, 1.5); //var lightOffset = new THREE.Vector3(0, 1000, 2500.0); var lightOffset = new THREE.Vector3( 2000, 700, // lower makes longer shadows 700.0 ); light.position.copy(lightOffset); light.castShadow = true; var xlight = light as dynamic; xlight.shadowMapWidth = 4096; xlight.shadowMapHeight = 2048; xlight.shadowDarkness = 0.1; //xlight.shadowDarkness = 0.5; xlight.shadowCameraNear = 10; xlight.shadowCameraFar = 10000; xlight.shadowBias = 0.00001; xlight.shadowCameraRight = 4000; xlight.shadowCameraLeft = -4000; xlight.shadowCameraTop = 4000; xlight.shadowCameraBottom = -4000; // wont show if we add skybox? xlight.shadowCameraVisible = true; //scene.add(light); //light.AttachTo(sceneg); #endregion // whats WebGLRenderTargetCube do? // WebGLRenderer preserveDrawingBuffer var renderer0 = new THREE.WebGLRenderer( new { antialias = true, alpha = true, preserveDrawingBuffer = true } ); // must enable shadows on the renderer renderer0.shadowMapEnabled = true; // https://github.com/mrdoob/three.js/issues/3836 // the construct. white bg //renderer0.setClearColor(0xfffff, 1); //renderer.setSize(window.Width, window.Height); renderer0.setSize(cubefacesize, cubefacesize); //renderer0.domElement.AttachToDocument(); //rendererPX.domElement.style.SetLocation(0, 0); //renderer0.domElement.style.SetLocation(4, 4); // top // http://stackoverflow.com/questions/27612524/can-multiple-webglrenderers-render-the-same-scene // need a place to show the cubemap face to GUI // how does the stereo OTOY do it? // https://www.opengl.org/wiki/Sampler_(GLSL) // http://www.richardssoftware.net/Home/Post/25 // [+X, –X, +Y, –Y, +Z, –Z] fa // move up //camera.position.set(-1200, 800, 1200); //var cameraoffset = new THREE.Vector3(0, 15, 0); // can we aniamte it? //var cameraoffset = new THREE.Vector3(0, 800, 1200); // can we have linear animation fromcenter of the map to the edge and back? // then do the flat earth sun orbit? var cameraoffset = new THREE.Vector3( // left? -512, // height? //0, //1600, //1024, // if the camera is in the center, would we need to move the scene? // we have to move the camera. as we move the scene the lights are messed up //2014, 1024, //1200 0 // can we hover top of the map? ); // original vieworigin //var cameraoffset = new THREE.Vector3(-1200, 800, 1200); var camerax = new IHTMLInput { type = ScriptCoreLib.Shared.HTMLInputTypeEnum.range, min = 0 - 2048, max = 0 + 2048, valueAsNumber = -512, title = "camerax" }.AttachToDocument(); // up. whats the most high a rocket can go 120km? new IHTMLHorizontalRule { }.AttachToDocument(); // how high is the bunker? var cameray = new IHTMLInput { type = ScriptCoreLib.Shared.HTMLInputTypeEnum.range, min = 64, max = 2048, valueAsNumber = 1024, title = "cameray" }.AttachToDocument(); new IHTMLBreak { }.AttachToDocument(); var camerayHigh = new IHTMLInput { type = ScriptCoreLib.Shared.HTMLInputTypeEnum.range, min = cameray.max, max = 1024 * 256, valueAsNumber = cameray.max, title = "cameray" }.AttachToDocument(); new IHTMLHorizontalRule { }.AttachToDocument(); var cameraz = new IHTMLInput { type = ScriptCoreLib.Shared.HTMLInputTypeEnum.range, min = 0 - 2048, max = 0 + 2048, valueAsNumber = 0, title = "cameraz" }.AttachToDocument(); // for render server var fcamerax = 0.0; var fcameray = 0.0; var fcameraz = 0.0; //while (await camerax.async.onchange) //cameray.onchange += delegate //{ // if (cameray.valueAsNumber < cameray.max) // camerayHigh.valueAsNumber = camerayHigh.min; //}; camerayHigh.onmousedown += delegate { //if (camerayHigh.valueAsNumber > camerayHigh.min) cameray.valueAsNumber = cameray.max; }; Action applycameraoffset = delegate { // make sure UI and gpu sync up var cy = cameray; if (cameray.valueAsNumber < cameray.max) camerayHigh.valueAsNumber = camerayHigh.min; if (camerayHigh.valueAsNumber > camerayHigh.min) cameray.valueAsNumber = cameray.max; if (cameray.valueAsNumber == cameray.max) cy = camerayHigh; cameraoffset = new THREE.Vector3( // left? camerax + fcamerax, // height? //0, //1600, //1024, // if the camera is in the center, would we need to move the scene? // we have to move the camera. as we move the scene the lights are messed up //2014, cy + fcameray, //1200 cameraz + fcameraz // can we hover top of the map? ); }; #region y // need to rotate90? var cameraNY = new THREE.PerspectiveCamera(fov: 90, aspect: 1.0, near: 1, far: far); applycameraoffset += delegate { cameraNY.position.copy(new THREE.Vector3(0, 0, 0)); cameraNY.lookAt(new THREE.Vector3(0, -1, 0)); cameraNY.position.add(cameraoffset); }; //cameraNY.lookAt(new THREE.Vector3(0, 1, 0)); var canvasNY = new CanvasRenderingContext2D(cubefacesize, cubefacesize); canvasNY.canvas.style.SetLocation(cubecameraoffsetx + (int)(uizoom * cubefacesize + 8) * 1, 8 + (int)(uizoom * cubefacesize + 8) * 2); canvasNY.canvas.title = "NY"; canvasNY.canvas.AttachToDocument(); canvasNY.canvas.style.transformOrigin = "0 0"; canvasNY.canvas.style.transform = $"scale({uizoom})"; var cameraPY = new THREE.PerspectiveCamera(fov: 90, aspect: 1.0, near: 1, far: far); applycameraoffset += delegate { cameraPY.position.copy(new THREE.Vector3(0, 0, 0)); cameraPY.lookAt(new THREE.Vector3(0, 1, 0)); cameraPY.position.add(cameraoffset); }; //cameraPY.lookAt(new THREE.Vector3(0, -1, 0)); var canvasPY = new CanvasRenderingContext2D(cubefacesize, cubefacesize); canvasPY.canvas.style.SetLocation(cubecameraoffsetx + (int)(uizoom * cubefacesize + 8) * 1, 8 + (int)(uizoom * cubefacesize + 8) * 0); canvasPY.canvas.title = "PY"; canvasPY.canvas.AttachToDocument(); canvasPY.canvas.style.transformOrigin = "0 0"; canvasPY.canvas.style.transform = $"scale({uizoom})"; #endregion // transpose xz? #region x var cameraNX = new THREE.PerspectiveCamera(fov: 90, aspect: 1.0, near: 1, far: far); applycameraoffset += delegate { cameraNX.position.copy(new THREE.Vector3(0, 0, 0)); cameraNX.lookAt(new THREE.Vector3(0, 0, 1)); cameraNX.position.add(cameraoffset); }; //cameraNX.lookAt(new THREE.Vector3(0, 0, -1)); //cameraNX.lookAt(new THREE.Vector3(-1, 0, 0)); //cameraNX.lookAt(new THREE.Vector3(1, 0, 0)); var canvasNX = new CanvasRenderingContext2D(cubefacesize, cubefacesize); canvasNX.canvas.style.SetLocation(cubecameraoffsetx + (int)(uizoom * cubefacesize + 8) * 2, 8 + (int)(uizoom * cubefacesize + 8) * 1); canvasNX.canvas.title = "NX"; canvasNX.canvas.AttachToDocument(); canvasNX.canvas.style.transformOrigin = "0 0"; canvasNX.canvas.style.transform = $"scale({uizoom})"; var cameraPX = new THREE.PerspectiveCamera(fov: 90, aspect: 1.0, near: 1, far: far); applycameraoffset += delegate { cameraPX.position.copy(new THREE.Vector3(0, 0, 0)); cameraPX.lookAt(new THREE.Vector3(0, 0, -1)); cameraPX.position.add(cameraoffset); }; //cameraPX.lookAt(new THREE.Vector3(0, 0, 1)); //cameraPX.lookAt(new THREE.Vector3(1, 0, 0)); //cameraPX.lookAt(new THREE.Vector3(-1, 0, 0)); var canvasPX = new CanvasRenderingContext2D(cubefacesize, cubefacesize); canvasPX.canvas.style.SetLocation(cubecameraoffsetx + (int)(uizoom * cubefacesize + 8) * 0, 8 + (int)(uizoom * cubefacesize + 8) * 1); canvasPX.canvas.title = "PX"; canvasPX.canvas.AttachToDocument(); canvasPX.canvas.style.transformOrigin = "0 0"; canvasPX.canvas.style.transform = $"scale({uizoom})"; #endregion #region z var cameraNZ = new THREE.PerspectiveCamera(fov: 90, aspect: 1.0, near: 1, far: far); //cameraNZ.lookAt(new THREE.Vector3(0, 0, -1)); applycameraoffset += delegate { cameraNZ.position.copy(new THREE.Vector3(0, 0, 0)); cameraNZ.lookAt(new THREE.Vector3(1, 0, 0)); cameraNZ.position.add(cameraoffset); }; //cameraNX.lookAt(new THREE.Vector3(-1, 0, 0)); //cameraNZ.lookAt(new THREE.Vector3(0, 0, 1)); var canvasNZ = new CanvasRenderingContext2D(cubefacesize, cubefacesize); canvasNZ.canvas.style.SetLocation(cubecameraoffsetx + (int)(uizoom * cubefacesize + 8) * 3, 8 + (int)(uizoom * cubefacesize + 8) * 1); canvasNZ.canvas.title = "NZ"; canvasNZ.canvas.AttachToDocument(); canvasNZ.canvas.style.transformOrigin = "0 0"; canvasNZ.canvas.style.transform = $"scale({uizoom})"; var cameraPZ = new THREE.PerspectiveCamera(fov: 90, aspect: 1.0, near: 1, far: far); //cameraPZ.lookAt(new THREE.Vector3(1, 0, 0)); applycameraoffset += delegate { cameraPZ.position.copy(new THREE.Vector3(0, 0, 0)); cameraPZ.lookAt(new THREE.Vector3(-1, 0, 0)); cameraPZ.position.add(cameraoffset); }; //cameraPZ.lookAt(new THREE.Vector3(0, 0, 1)); //cameraPZ.lookAt(new THREE.Vector3(0, 0, -1)); var canvasPZ = new CanvasRenderingContext2D(cubefacesize, cubefacesize); canvasPZ.canvas.style.SetLocation(cubecameraoffsetx + (int)(uizoom * cubefacesize + 8) * 1, 8 + (int)(uizoom * cubefacesize + 8) * 1); canvasPZ.canvas.title = "PZ"; canvasPZ.canvas.AttachToDocument(); canvasPZ.canvas.style.transformOrigin = "0 0"; canvasPZ.canvas.style.transform = $"scale({uizoom})"; #endregion // c++ alias locals would be nice.. var canvas0 = (IHTMLCanvas)renderer0.domElement; var old = new { CursorX = 0, CursorY = 0 }; var st = new Stopwatch(); st.Start(); //canvas0.css.active.style.cursor = IStyle.CursorEnum.move; #region onmousedown Native.body.onmousedown += async e => { if (e.Element.nodeName.ToLower() != "canvas") return; // movementX no longer works old = new { e.CursorX, e.CursorY }; //e.CaptureMouse(); var release = e.Element.CaptureMouse(); await e.Element.async.onmouseup; release(); }; #endregion // X:\jsc.svn\examples\javascript\Test\TestMouseMovement\TestMouseMovement\Application.cs #region onmousemove Native.body.onmousemove += e => { if (e.Element.nodeName.ToLower() != "canvas") { Native.body.style.cursor = IStyle.CursorEnum.@default; return; } e.preventDefault(); e.stopPropagation(); Native.body.style.cursor = IStyle.CursorEnum.move; var pointerLock = canvas0 == Native.document.pointerLockElement; //Console.WriteLine(new { e.MouseButton, pointerLock, e.movementX }); if (e.MouseButton == IEvent.MouseButtonEnum.Left) { oo.WithEach( x => { x.rotation.y += 0.006 * (e.CursorX - old.CursorX); x.rotation.x += 0.006 * (e.CursorY - old.CursorY); } ); old = new { e.CursorX, e.CursorY }; } }; #endregion // THREE.WebGLProgram: gl.getProgramInfoLog() C:\fakepath(78,3-98): warning X3557: loop only executes for 1 iteration(s), forcing loop to unroll // THREE.WebGLProgram: gl.getProgramInfoLog() (79,3-98): warning X3557: loop only executes for 1 iteration(s), forcing loop to unroll // http://www.roadtovr.com/youtube-confirms-stereo-3d-360-video-support-coming-soon/ // https://www.youtube.com/watch?v=D-Wl9jAB45Q #region spherical var gl = new WebGLRenderingContext(alpha: true, preserveDrawingBuffer: true); var c = gl.canvas.AttachToDocument(); // 3840x2160 //c.style.SetSize(3840, 2160); // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/15-dualvr/20150722/360-youtube c.width = 3840; c.height = 2160; //c.width = 3840 * 2; //c.height = 2160 * 2; //c.width = 3840; //c.height = 2160; // 1,777777777777778 // https://www.youtube.com/watch?v=fTfJwzRsE-w //c.width = 7580; //c.height = 3840; //1,973958333333333 //7580 // 3840 // wont work //c.width = 8192; //c.height = 4096; // this has the wrong aspect? //c.width = 6466; //c.height = 3232; new IHTMLPre { new { c.width, c.height } }.AttachToDocument(); //6466x3232 //var suizoom = 720f / c.height; //var suizoom = 360f / c.height; var suizoom = 480f / c.width; c.style.transformOrigin = "0 0"; c.style.transform = $"scale({suizoom})"; //c.style.backgroundColor = "yellow"; c.style.position = IStyle.PositionEnum.absolute; c.style.SetLocation(8 + (int)(uizoom * cubefacesize + 8) * 0, 8 + (int)(uizoom * cubefacesize + 8) * 3); var pass = new CubeToEquirectangular.Library.ShaderToy.EffectPass( null, gl, precission: CubeToEquirectangular.Library.ShaderToy.DetermineShaderPrecission(gl), supportDerivatives: gl.getExtension("OES_standard_derivatives") != null, callback: null, obj: null, forceMuted: false, forcePaused: false, //quadVBO: Library.ShaderToy.createQuadVBO(gl, right: 0, top: 0), outputGainNode: null ); // how shall we upload our textures? // can we reference GLSL.samplerCube yet? //pass.mInputs[0] = new samplerCube { }; pass.mInputs[0] = new CubeToEquirectangular.Library.ShaderToy.samplerCube { }; pass.MakeHeader_Image(); var vs = new Shaders.ProgramFragmentShader(); pass.NewShader_Image(vs); #endregion var frame0 = new HTML.Images.FromAssets.galaxy_starfield().AttachToDocument(); //var frame0 = new HTML.Images.FromAssets.tiles_regrid().AttachToDocument(); //var frame0 = new HTML.Images.FromAssets.anvil___spherical_hdri_panorama_skybox_by_macsix_d6vv4hs().AttachToDocument(); //var xor = new HTML.Images.FromAssets.Orion360_test_image_8192x4096().AttachToDocument(); //var xor = new HTML.Images.FromAssets._2_no_clouds_4k().AttachToDocument(); //var frame0 = new HTML.Images.FromAssets._2294472375_24a3b8ef46_o().AttachToDocument(); // 270px //xor.style.height = ""; frame0.style.height = "270px"; frame0.style.width = "480px"; frame0.style.SetLocation( 8 + (int)(uizoom * cubefacesize + 8) * 0 + 480 + 16, 8 + (int)(uizoom * cubefacesize + 8) * 3); #region skybox // what shall the skybox do if we reach upper altitude? // fade into space skybox ? var skybox = new THREE.Mesh(new THREE.SphereGeometry(far * 0.9, 50, 50), new THREE.MeshBasicMaterial(new { map = THREE.ImageUtils.loadTexture( //new HTML.Images.FromAssets._2294472375_24a3b8ef46_o().src //new HTML.Images.FromAssets._4008650304_7f837ccbb7_b().src frame0.src //new WebGLEquirectangularPanorama.HTML.Images.FromAssets.PANO_20130616_222058().src //new WebGLEquirectangularPanorama.HTML.Images.FromAssets.PANO_20121225_210448().src ) })); skybox.scale.x = -1; skybox.AttachTo(sceneg); #endregion //mesh.rotateOnAxis(new THREE.Vector3(1, 0, 0), Math.PI / 2); //mesh.rotateOnAxis(new THREE.Vector3(1, 0, 0), -Math.PI / 2); // dont need the fixup. unless we want to animate the sky rotate? //mesh.rotateOnAxis(new THREE.Vector3(0, 1, 0), -Math.PI / 2); // hide the sky to see camera lines? // can we show this as HUD on VR in webview? //skybox.visible = false; //scene.add(skybox); //new IHTMLButton { } #region DirectoryEntry var dir = default(DirectoryEntry); new IHTMLButton { "openDirectory" }.AttachToDocument().onclick += async delegate { dir = (DirectoryEntry)await chrome.fileSystem.chooseEntry(new { type = "openDirectory" }); }; frame0.onclick += delegate { // http://paulbourke.net/papers/vsmm2006/vsmm2006.pdf // A method of creating synthetic stereoscopic panoramic images that can be implemented //in most rendering packages has been presented. If single panoramic pairs can be created //then stereoscopic panoramic movies are equally possible giving rise to the prospect of //movies where the viewer can interact with, at least with regard to what they choose to look //at.These images can be projected so as to engage the two features of the human visual //system that assist is giving us a sense of immersion, the feeling of “being there”. That is, //imagery that contains parallax information as captured from two horizontally separated eye //positions (stereopsis)and imagery that fills our peripheral vision.The details that define //how the two panoramic images should be created in rendering packages are provided, in //particular, how to precisely configure the virtual cameras and control the distance to zero //parallax. // grab a frame if (dir == null) { // not exporting to file system? var f0 = new IHTMLImage { src = gl.canvas.toDataURL() }; //var f0 = (IHTMLImage)gl.canvas; //var f0 = (IHTMLImage)gl.canvas; //var base64 = gl.canvas.toDataURL(); //frame0.src = base64; frame0.src = f0.src; // 7MB! return; } // // --------------------------- //IrfanView //--------------------------- //Warning ! //The file: "X:\vr\tape1\0001.jpg" is a PNG file with incorrect extension ! //Rename ? //--------------------------- //Yes No //--------------------------- // haha this will render the thumbnail. //dir.WriteAllBytes("0000.png", frame0); //dir.WriteAllBytes("0000.png", gl.canvas); var glsw = Stopwatch.StartNew(); dir.WriteAllBytes("0000.png", gl); new IHTMLPre { new { glsw.ElapsedMilliseconds } }.AttachToDocument(); // {{ ElapsedMilliseconds = 1548 }} // 3.7MB // 3840x2160 }; #endregion var vsync = default(TaskCompletionSource<object>); new IHTMLButton { "render 60hz 30sec" }.AttachToDocument().onclick += async e => { e.Element.disabled = true; var total = Stopwatch.StartNew(); var status = "rendering... " + new { dir }; new IHTMLPre { () => status }.AttachToDocument(); if (dir == null) { //dir = (DirectoryEntry)await chrome.fileSystem.chooseEntry(new { type = "openDirectory" }); } total.Restart(); vsync = new TaskCompletionSource<object>(); await vsync.Task; status = "rendering... vsync"; var frameid = -1; goto beforeframe; //fcamerax = -15.0; // parallax offset? await_nextframe: var filename = frameid.ToString().PadLeft(4, '0') + ".png"; status = "rendering... " + new { frameid, filename }; vsync = new TaskCompletionSource<object>(); await vsync.Task; // frame0 has been rendered var swcapture = Stopwatch.StartNew(); status = "WriteAllBytes... " + new { filename }; //await Native.window.async.onframe; if (dir != null) // https://code.google.com/p/chromium/issues/detail?id=404301 await dir.WriteAllBytes(filename, gl); //await dir.WriteAllBytes(filename, gl.canvas); status = "WriteAllBytes... done " + new { fcamerax, filename, swcapture.ElapsedMilliseconds }; status = "rdy " + new { filename, fcamerax }; //await Native.window.async.onframe; beforeframe: // speed? S6 slow motion? // this is really slow. if we do x4x2 =x8 // https://www.youtube.com/watch?v=r76ULW16Ib8 //fcamerax += 16 * (1.0 / 60.0); fcamerax = 128 * Math.Sin(Math.PI * (frameid - (60 * 30 / 2f)) / (60 * 30 / 2f)); fcameraz = 256 * Math.Cos(Math.PI * (frameid - (60 * 30 / 2f)) / (60 * 30 / 2f)); // up fcameray = 16 * Math.Cos(Math.PI * (frameid - (60 * 30 / 2f)) / (60 * 30 / 2f)); //fcamerax += (1.0 / 60.0); //fcamerax += (1.0 / 60.0) * 120; if (Environment.ProcessorCount < 8) frameid += 30; else frameid++; // 60hz 30sec if (frameid < 60 * 30) { // Blob GC? either this helms or the that we made a Blob static. await Task.Delay(11); goto await_nextframe; } total.Stop(); status = "all done " + new { frameid, total.ElapsedMilliseconds }; vsync = default(TaskCompletionSource<object>); // http://stackoverflow.com/questions/22899333/delete-javascript-blobs e.Element.disabled = false; }; // "Z:\jsc.svn\examples\javascript\WebGL\WebGLColladaExperiment\WebGLColladaExperiment\WebGLColladaExperiment.csproj" #region WebGLRah66Comanche // why isnt it being found? // "Z:\jsc.svn\examples\javascript\WebGL\collada\WebGLRah66Comanche\WebGLRah66Comanche\WebGLRah66Comanche.csproj" new global::WebGLRah66Comanche.Comanche( ).Source.Task.ContinueWithResult( dae => { dae.AttachTo(sceneg); //dae.position.y = -40; //dae.position.z = 280; //scene.add(dae); //oo.Add(dae); // wont do it //dae.castShadow = true; dae.children[0].children[0].children.WithEach(x => x.castShadow = true); // the rotors? dae.children[0].children[0].children.Last().children.WithEach(x => x.castShadow = true); dae.scale.set(0.5, 0.5, 0.5); dae.position.x = -900; dae.position.z = +900; // raise it up dae.position.y = 400; //var sw = Stopwatch.StartNew(); //Native.window.onframe += delegate //{ // //dae.children[0].children[0].children.Last().al // //dae.children[0].children[0].children.Last().rotation.z = sw.ElapsedMilliseconds * 0.01; // //dae.children[0].children[0].children.Last().rotation.x = sw.ElapsedMilliseconds * 0.01; // dae.children[0].children[0].children.Last().rotation.y = sw.ElapsedMilliseconds * 0.01; //}; } ); #endregion #region tree // "Z:\jsc.svn\examples\javascript\WebGL\WebGLGodRay\WebGLGodRay\WebGLGodRay.csproj" var materialScene = new THREE.MeshBasicMaterial(new { color = 0x000000, shading = THREE.FlatShading }); var tloader = new THREE.JSONLoader(); // http://stackoverflow.com/questions/16539736/do-not-use-system-runtime-compilerservices-dynamicattribute-use-the-dynamic // https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.dynamicattribute%28v=vs.110%29.aspx //System.Runtime.CompilerServices.DynamicAttribute tloader.load( new WebGLGodRay.Models.tree().Content.src, new Action<THREE.Geometry>( xgeometry => { var treeMesh = new THREE.Mesh(xgeometry, materialScene); treeMesh.position.set(0, -150, -150); treeMesh.position.x = -900; treeMesh.position.z = -900; treeMesh.position.y = 25; var tsc = 400; treeMesh.scale.set(tsc, tsc, tsc); treeMesh.matrixAutoUpdate = false; treeMesh.updateMatrix(); //treeMesh.AttachTo(scene); treeMesh.AttachTo(sceneg); } ) ); #endregion // http://learningthreejs.com/blog/2013/09/16/how-to-make-the-earth-in-webgl/ #region create floor // THREE.PlaneGeometry: Consider using THREE.PlaneBufferGeometry for lower memory footprint. // can we have our checkerboard? var floorColors = new[] { 0xA26D41, 0xA06040, 0xAF6F4F, // marker to detect horizon 0xAF0000, 0xA26D41, 0xA06040, 0xAF6F4F, // marker to detect horizon 0x006D00, 0xA26D41, 0xA06040, 0xAF6F4F, // marker to detect horizon 0x0000FF }; // human eye can see up to 10miles, then horizion flattens out. var planeGeometry = new THREE.CubeGeometry(2048, 1, 2048); var planeGeometryMarkerH = new THREE.CubeGeometry(2048, 1, 2048 * 5); var planeGeometryMarkerV = new THREE.CubeGeometry(2048 * 5 * 4, 1, 2048 * 4); var planeGeometryV = new THREE.CubeGeometry(2048 * 4, 1, 2048 * 4); ////var floor0 = new THREE.Mesh(planeGeometry, //// new THREE.MeshPhongMaterial(new { ambient = 0x101010, color = 0xA26D41, specular = 0xA26D41, shininess = 1 }) //// ); //////plane.castShadow = false; ////floor0.receiveShadow = true; ////floor0.AttachTo(sceneg); ////var floor1 = new THREE.Mesh(planeGeometry, //// //new THREE.MeshPhongMaterial(new { ambient = 0x101010, color = 0xA26D41, specular = 0xA26D41, shininess = 1 }) //// new THREE.MeshPhongMaterial(new { ambient = 0x101010, color = 0xA06040, specular = 0xA26D41, shininess = 1 }) //// ); //////plane.castShadow = false; ////floor1.receiveShadow = true; ////floor1.position.set(2048, 0, 1024); ////floor1.AttachTo(sceneg); // can we see horizon? for (int i = 0; i < 3 * 256; i++) { var planeGeometry0 = planeGeometry; if (i % 4 == 3) { planeGeometry0 = planeGeometryMarkerH; // for high altitude zoom level var i4 = (i / 4); var planeGeometryV0 = planeGeometryV; if (i4 % 4 == 3) planeGeometryV0 = planeGeometryMarkerV; { var floor2 = new THREE.Mesh(planeGeometryV0, //new THREE.MeshPhongMaterial(new { ambient = 0x101010, color = 0xA26D41, specular = 0xA26D41, shininess = 1 }) new THREE.MeshPhongMaterial(new { ambient = 0x101010, color = floorColors[i4 % floorColors.Length], specular = 0xA26D41, shininess = 1 }) ); //plane.castShadow = false; floor2.receiveShadow = true; floor2.position.set(1024 * -i, 0, 2048 * i); floor2.AttachTo(scene); } { var floor2 = new THREE.Mesh(planeGeometryV0, //new THREE.MeshPhongMaterial(new { ambient = 0x101010, color = 0xA26D41, specular = 0xA26D41, shininess = 1 }) new THREE.MeshPhongMaterial(new { ambient = 0x101010, color = floorColors[(i / 4) % floorColors.Length], specular = 0xA26D41, shininess = 1 }) ); //plane.castShadow = false; floor2.receiveShadow = true; floor2.position.set(-1024 * -i, 0, -2048 * i); floor2.AttachTo(scene); } } { var floor2 = new THREE.Mesh(planeGeometry0, //new THREE.MeshPhongMaterial(new { ambient = 0x101010, color = 0xA26D41, specular = 0xA26D41, shininess = 1 }) new THREE.MeshPhongMaterial(new { ambient = 0x101010, color = floorColors[i % floorColors.Length], specular = 0xA26D41, shininess = 1 }) ); //plane.castShadow = false; floor2.receiveShadow = true; floor2.position.set(2048 * i, 0, 1024 * i); floor2.AttachTo(scene); } // flipz { var floor2 = new THREE.Mesh(planeGeometry0, //new THREE.MeshPhongMaterial(new { ambient = 0x101010, color = 0xA26D41, specular = 0xA26D41, shininess = 1 }) new THREE.MeshPhongMaterial(new { ambient = 0x101010, color = floorColors[i % floorColors.Length], specular = 0xA26D41, shininess = 1 }) ); //plane.castShadow = false; floor2.receiveShadow = true; floor2.position.set(2048 * -i, 0, 1024 * -i); floor2.AttachTo(scene); } } #endregion // "shadow cameras" show the light source and direction // spotlight #1 -- yellow, dark shadow var spotlight = new THREE.SpotLight(0xffff00); spotlight.position.set(-60, 150, -30); //spotlight.shadowCameraVisible = true; spotlight.shadowDarkness = 0.95; spotlight.intensity = 2; // must enable shadow casting ability for the light spotlight.castShadow = true; scene.add(spotlight); // spotlight #2 -- red, light shadow var spotlight2 = new THREE.SpotLight(0xff0000); //var spotlight2 = new THREE.SpotLight(0xffff00); spotlight2.position.set(60, 150, -60); scene.add(spotlight2); //spotlight2.shadowCameraVisible = true; spotlight2.shadowDarkness = 0.70; spotlight2.intensity = 2; spotlight2.castShadow = true; // THREE.WebGLProgram: gl.getProgramInfoLog() Pixel shader sampler count exceeds MAX_TEXTURE_IMAGE_UNITS (16). for (int i = 0; i < 8; i++) { // spotlight #3 blue var spotlight3 = new THREE.SpotLight(0x0000ff); //var spotlight3 = new THREE.SpotLight(0x00ffff); spotlight3.position.set(150 * i, 80, -100); //spotlight3.shadowCameraVisible = true; spotlight3.shadowDarkness = 0.95; spotlight3.intensity = 2; spotlight3.castShadow = true; scene.add(spotlight3); // change the direction this spotlight is facing var lightTarget = new THREE.Object3D(); lightTarget.position.set(150 * i, 10, -100); scene.add(lightTarget); spotlight3.target = lightTarget; } // cube: mesh to cast shadows #region castShadow var cubeGeometry = new THREE.CubeGeometry(50, 50, 50); var cubeMaterial = new THREE.MeshLambertMaterial(new { color = 0x888888 }); var cube0 = new THREE.Mesh(cubeGeometry, cubeMaterial); //cube.position.set(0, 50, 0); cube0.position.set(0, 100, 0); // Note that the mesh is flagged to cast shadows cube0.castShadow = true; scene.add(cube0); // floor: mesh to receive shadows #endregion #region create walls var random = new Random(); var meshArray = new List<THREE.Mesh>(); var geometry = new THREE.CubeGeometry(1, 1, 1); //var sw = Stopwatch.StartNew(); for (var i = 3; i < 9; i++) { //THREE.MeshPhongMaterial var ii = new THREE.Mesh(geometry, new THREE.MeshPhongMaterial(new { ambient = 0x000000, color = 0xA06040, specular = 0xA26D41, shininess = 1 }) //new THREE.MeshLambertMaterial( //new //{ // color = (Convert.ToInt32(0xffffff * random.NextDouble())), // specular = 0xffaaaa, // ambient= 0x050505, //}) ); ii.position.x = i % 7 * 200 - 2.5f; // raise it up ii.position.y = .5f * 100 * i; ii.position.z = -1 * i * 100; ii.castShadow = true; ii.receiveShadow = true; //ii.scale.set(100, 100, 100 * i); ii.scale.set(100, 100 * i, 100); meshArray.Add(ii); //scene.add(ii); ii.AttachTo(sceneg); if (i % 2 == 0) { // Z:\jsc.svn\examples\javascript\WebGL\WebGLHZBlendCharacter\WebGLHZBlendCharacter\Application.cs #if FWebGLHZBlendCharacter #region SpeedBlendCharacter var _i = i; { WebGLHZBlendCharacter.HTML.Pages.TexturesImages ref0; } var blendMesh = new THREE.SpeedBlendCharacter(); blendMesh.load( new WebGLHZBlendCharacter.Models.marine_anims().Content.src, new Action( delegate { // buildScene //blendMesh.rotation.y = Math.PI * -135 / 180; blendMesh.castShadow = true; // we cannot scale down we want our shadows //blendMesh.scale.set(0.1, 0.1, 0.1); blendMesh.position.x = (_i + 2) % 7 * 200 - 2.5f; // raise it up //blendMesh.position.y = .5f * 100; blendMesh.position.z = -1 * _i * 100; var xtrue = true; // run blendMesh.setSpeed(1.0); // will in turn call THREE.AnimationHandler.play( this ); blendMesh.run.play(); // this wont help. bokah does not see the animation it seems. blendMesh.run.update(1); blendMesh.showSkeleton(!xtrue); //scene.add(blendMesh); blendMesh.AttachTo(sceneg); //Native.window.onframe += // delegate // { // blendMesh.rotation.y = Math.PI * 0.0002 * sw.ElapsedMilliseconds; // ii.rotation.y = Math.PI * 0.0002 * sw.ElapsedMilliseconds; // }; } ) ); #endregion #endif } } #endregion //#region HZCannon //// "Z:\jsc.svn\examples\javascript\WebGL\HeatZeekerRTSOrto\HeatZeekerRTSOrto\HeatZeekerRTSOrto.csproj" //new HeatZeekerRTSOrto.HZCannon().Source.Task.ContinueWithResult( // async cube => // { // // https://github.com/mrdoob/three.js/issues/1285 // //cube.children.WithEach(c => c.castShadow = true); // //cube.traverse( // // new Action<THREE.Object3D>( // // child => // // { // // // does it work? do we need it? // // //if (child is THREE.Mesh) // // child.castShadow = true; // // //child.receiveShadow = true; // // } // // ) // //); // // um can edit and continue insert code going back in time? // cube.scale.x = 10.0; // cube.scale.y = 10.0; // cube.scale.z = 10.0; // //cube.castShadow = true; // //dae.receiveShadow = true; // //cube.position.x = -100; // ////cube.position.y = (cube.scale.y * 50) / 2; // //cube.position.z = Math.Floor((random() * 1000 - 500) / 50) * 50 + 25; // // if i want to rotate, how do I do it? // //cube.rotation.z = random() + Math.PI; // //cube.rotation.x = random() + Math.PI; // //var sw2 = Stopwatch.StartNew(); // cube.AttachTo(sceneg); // //scene.add(cube); // //interactiveObjects.Add(cube); // // offset is wrong // //while (true) // //{ // // await Native.window.async.onframe; // // cube.rotation.y = Math.PI * 0.0002 * sw2.ElapsedMilliseconds; // //} // } //); //#endregion #region HZCannon new HeatZeekerRTSOrto.HZCannon().Source.Task.ContinueWithResult( async cube => { // https://github.com/mrdoob/three.js/issues/1285 //cube.children.WithEach(c => c.castShadow = true); //cube.traverse( // new Action<THREE.Object3D>( // child => // { // // does it work? do we need it? // //if (child is THREE.Mesh) // child.castShadow = true; // //child.receiveShadow = true; // } // ) //); // um can edit and continue insert code going back in time? cube.scale.x = 10.0; cube.scale.y = 10.0; cube.scale.z = 10.0; //cube.castShadow = true; //dae.receiveShadow = true; // jsc shat about out of band code patching? cube.position.z = 600; cube.position.x = -900; //cube.position.y = -400; //cube.position.x = -100; //cube.position.y = -400; ////cube.position.y = (cube.scale.y * 50) / 2; //cube.position.z = Math.Floor((random() * 1000 - 500) / 50) * 50 + 25; // if i want to rotate, how do I do it? //cube.rotation.z = random() + Math.PI; //cube.rotation.x = random() + Math.PI; var sw2 = Stopwatch.StartNew(); //scene.add(cube); cube.AttachTo(sceneg); //interactiveObjects.Add(cube); // offset is wrong //while (true) //{ // await Native.window.async.onframe; // cube.rotation.y = Math.PI * 0.0002 * sw2.ElapsedMilliseconds; //} } ); #endregion #region HZBunker new HeatZeekerRTSOrto.HZBunker().Source.Task.ContinueWithResult( cube => { // https://github.com/mrdoob/three.js/issues/1285 //cube.children.WithEach(c => c.castShadow = true); cube.castShadow = true; //cube.traverse( // new Action<THREE.Object3D>( // child => // { // // does it work? do we need it? // //if (child is THREE.Mesh) // child.castShadow = true; // //child.receiveShadow = true; // } // ) //); // um can edit and continue insert code going back in time? cube.scale.x = 10.0; cube.scale.y = 10.0; cube.scale.z = 10.0; //cube.castShadow = true; //dae.receiveShadow = true; cube.position.x = -1000; //cube.position.y = (cube.scale.y * 50) / 2; cube.position.z = 0; cube.AttachTo(sceneg); //scene.add(cube); } ); #endregion new Models.ColladaS6Edge().Source.Task.ContinueWithResult( dae => { // 90deg dae.rotation.x = -Math.Cos(Math.PI); //dae.scale.x = 30; //dae.scale.y = 30; //dae.scale.z = 30; dae.position.z = -(65 - 200); var scale = 0.9; // jsc, do we have ILObserver available yet? dae.scale.x = scale; dae.scale.y = scale; dae.scale.z = scale; //#region onmousewheel //Native.body.onmousewheel += // e => // { // e.preventDefault(); // //camera.position.z = 1.5; // // min max. shall adjust speed also! // // max 4.0 // // min 0.6 // dae.position.z -= 10.0 * e.WheelDirection; // //camera.position.z = 400; // //dae.position.z = dae.position.z.Max(-200).Min(200); // //Native.document.title = new { z }.ToString(); // }; //#endregion ////dae.position.y = -80; //dae.AttachTo(sceneg); ////scene.add(dae); //oo.Add(dae); // view-source:http://threejs.org/examples/webgl_multiple_canvases_circle.html // https://threejsdoc.appspot.com/doc/three.js/src.source/extras/cameras/CubeCamera.js.html Native.window.onframe += e => { // let render man know.. if (vsync != null) if (vsync.Task.IsCompleted) return; //if (pause) return; //if (pause.@checked) // return; // can we float out of frame? // haha. a bit too flickery. //dae.position.x = Math.Sin(e.delay.ElapsedMilliseconds * 0.01) * 50.0; //dae.position.x = Math.Sin(e.delay.ElapsedMilliseconds * 0.001) * 190.0; dae.position.x = Math.Sin(fcamerax * 0.001) * 190.0; dae.position.y = Math.Cos(fcamerax * 0.001) * 90.0; // manual rebuild? // red compiler notifies laptop chrome of pending update // app reloads applycameraoffset(); renderer0.clear(); //rendererPY.clear(); //cameraPX.aspect = canvasPX.aspect; //cameraPX.updateProjectionMatrix(); // um what does this do? //cameraPX.position.z += (z - cameraPX.position.z) * e.delay.ElapsedMilliseconds / 200.0; // mousewheel allos the camera to move closer // once we see the frame in vr, can we udp sync vr tracking back to laptop? //this.targetPX.x += 1; //this.targetNX.x -= 1; //this.targetPY.y += 1; //this.targetNY.y -= 1; //this.targetPZ.z += 1; //this.targetNZ.z -= 1; // how does the 360 or shadertoy want our cubemaps? // and then rotate right? // how can we render cubemap? #region x // upside down? renderer0.render(scene, cameraPX); canvasPX.drawImage((IHTMLCanvas)renderer0.domElement, 0, 0, cubefacesize, cubefacesize); renderer0.render(scene, cameraNX); canvasNX.drawImage((IHTMLCanvas)renderer0.domElement, 0, 0, cubefacesize, cubefacesize); #endregion #region z renderer0.render(scene, cameraPZ); canvasPZ.drawImage((IHTMLCanvas)renderer0.domElement, 0, 0, cubefacesize, cubefacesize); renderer0.render(scene, cameraNZ); canvasNZ.drawImage((IHTMLCanvas)renderer0.domElement, 0, 0, cubefacesize, cubefacesize); #endregion #region y renderer0.render(scene, cameraPY); //canvasPY.save(); //canvasPY.translate(0, size); //canvasPY.rotate((float)(-Math.PI / 2)); canvasPY.drawImage((IHTMLCanvas)renderer0.domElement, 0, 0, cubefacesize, cubefacesize); //canvasPY.restore(); renderer0.render(scene, cameraNY); //canvasNY.save(); //canvasNY.translate(size, 0); //canvasNY.rotate((float)(Math.PI / 2)); canvasNY.drawImage((IHTMLCanvas)renderer0.domElement, 0, 0, cubefacesize, cubefacesize); //canvasNY.restore(); // ? #endregion //renderer0.render(scene, cameraPX); //rendererPY.render(scene, cameraPY); // at this point we should be able to render the sphere texture //public const uint TEXTURE_CUBE_MAP_POSITIVE_X = 34069; //public const uint TEXTURE_CUBE_MAP_NEGATIVE_X = 34070; //public const uint TEXTURE_CUBE_MAP_POSITIVE_Y = 34071; //public const uint TEXTURE_CUBE_MAP_NEGATIVE_Y = 34072; //public const uint TEXTURE_CUBE_MAP_POSITIVE_Z = 34073; //public const uint TEXTURE_CUBE_MAP_NEGATIVE_Z = 34074; //var cube0 = new IHTMLImage[] { // new CSS3DPanoramaByHumus.HTML.Images.FromAssets.humus_px(), // new CSS3DPanoramaByHumus.HTML.Images.FromAssets.humus_nx(), // new CSS3DPanoramaByHumus.HTML.Images.FromAssets.humus_py(), // new CSS3DPanoramaByHumus.HTML.Images.FromAssets.humus_ny(), // new CSS3DPanoramaByHumus.HTML.Images.FromAssets.humus_pz(), // new CSS3DPanoramaByHumus.HTML.Images.FromAssets.humus_nz() //}; new[] { canvasPX, canvasNX, canvasPY, canvasNY, canvasPZ, canvasNZ }.WithEachIndex( (img, index) => { gl.bindTexture(gl.TEXTURE_CUBE_MAP, pass.tex); //gl.pixelStorei(gl.UNPACK_FLIP_X_WEBGL, false); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); // http://stackoverflow.com/questions/15364517/pixelstoreigl-unpack-flip-y-webgl-true // https://msdn.microsoft.com/en-us/library/dn302429(v=vs.85).aspx //gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 0); //gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1); gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + (uint)index, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img.canvas); } ); // could do dynamic resolution- fog of war or fog of FOV. where up to 150deg field of vision is encouragedm, not 360 pass.Paint_Image( 0, 0, 0, 0, 0 //, // gl_FragCoord // cannot be scaled, and can be referenced directly. // need another way to scale //zoom: 0.3f ); //paintsw.Stop(); // what does it do? gl.flush(); // let render man know.. if (vsync != null) if (!vsync.Task.IsCompleted) vsync.SetResult(null); }; } ); Console.WriteLine("do you see it?"); }
// https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/15-dualvr/20140815/webglcannonphysicsengine // inspired by http://granular.cs.umu.se/cannon.js/examples/threejs_fps.html /// <summary> /// This is a javascript application. /// </summary> /// <param name="page">HTML document rendered by the web server which can now be enhanced.</param> public Application(IApp page = null) { //Uncaught Error: ERROR: Quaternion's .setFromEuler() now expects a Euler rotation rather than a Vector3 and order. Please update your code. // WEBGL11095: INVALID_OPERATION: clearStencil: Method not currently supported // IE11 does not work yet //DiagnosticsConsole.ApplicationContent.BindKeyboardToDiagnosticsConsole(); // DEPRECATED: Quaternion's .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead. Three.js:913 //Uncaught TypeError: Object [object Object] has no method 'subSelf' // { REVISION: '57' }; var boxes = new List <CANNON.RigidBody>(); var boxMeshes = new List <THREE.Mesh>(); var balls = new List <CANNON.RigidBody>(); var ballMeshes = new List <THREE.Mesh>(); Func <long> Date_now = () => (long)new IFunction("return Date.now();").apply(null); var time = Date_now(); #region initCannon // // Setup our world var world = new CANNON.World(); world.quatNormalizeSkip = 0; world.quatNormalizeFast = false; //world.solver.setSpookParams(300, 10); world.solver.iterations = 5; world.gravity.set(0, -20, 0); world.broadphase = new CANNON.NaiveBroadphase(); // // Create a slippery material (friction coefficient = 0.0) var physicsMaterial = new CANNON.Material("slipperyMaterial"); var physicsContactMaterial = new CANNON.ContactMaterial( physicsMaterial, physicsMaterial, 0.0, // friction coefficient 0.3 // restitution ); // // We must add the contact materials to the world world.addContactMaterial(physicsContactMaterial); var controls_sphereShape = default(CANNON.Sphere); var controls_sphereBody = default(CANNON.RigidBody); { // Create a sphere var mass = 5; var radius = 1.3; var sphereShape = new CANNON.Sphere(radius); var sphereBody = new CANNON.RigidBody(mass, sphereShape, physicsMaterial); controls_sphereShape = sphereShape; controls_sphereBody = sphereBody; sphereBody.position.set(0, 5, 0); sphereBody.linearDamping = 0.05; world.add(sphereBody); // // Create a plane var groundShape = new CANNON.Plane(); var groundBody = new CANNON.RigidBody(0, groundShape, physicsMaterial); groundBody.quaternion.setFromAxisAngle(new CANNON.Vec3(1, 0, 0), -Math.PI / 2); world.add(groundBody); } #endregion #region init var camera = new THREE.PerspectiveCamera(75, Native.window.aspect, 0.1, 1000); var scene = new THREE.Scene(); scene.fog = new THREE.Fog(0x000000, 0, 500); var ambient = new THREE.AmbientLight(0x111111); scene.add(ambient); var light = new THREE.SpotLight(0xffffff, 1.0); light.position.set(10, 30, 20); light.target.position.set(0, 0, 0); // if(true){ light.castShadow = true; light.shadowCameraNear = 20; light.shadowCameraFar = 50;//camera.far; light.shadowCameraFov = 40; light.shadowMapBias = 0.1; light.shadowMapDarkness = 0.7; light.shadowMapWidth = 2 * 512; light.shadowMapHeight = 2 * 512; // //light.shadowCameraVisible = true; // } scene.add(light); var controls = new PointerLockControls(camera, controls_sphereBody); scene.add(controls.getObject()); // // floor var geometry = new THREE.PlaneGeometry(300, 300, 50, 50); geometry.applyMatrix(new THREE.Matrix4().makeRotationX(-Math.PI / 2)); var material = new THREE.MeshLambertMaterial(new { color = 0xdddddd }); //Native.Window. // THREE.Design.THREE.ColorUtils.adjustHSV(material.color, 0, 0, 0.9); // Replaced ColorUtils.adjustHSV() with Color's .offsetHSL(). //new IFunction("material", "THREE.ColorUtils.offsetHSL( material.color, 0, 0, 0.9 );").apply(null, material); // var mesh = new THREE.Mesh(geometry, material) { castShadow = true, receiveShadow = true }; scene.add(mesh); var renderer = new THREE.WebGLRenderer(new object()); renderer.shadowMapEnabled = true; renderer.shadowMapSoft = true; //renderer.setSize(Native.Window.Width, Native.Window.Height); //renderer.setClearColor(scene.fog.color, 1); renderer.domElement.style.backgroundColor = JSColor.Black; renderer.domElement.AttachToDocument(); #region onresize Action AtResize = delegate { camera.aspect = Native.window.aspect; camera.updateProjectionMatrix(); renderer.setSize(Native.window.Width, Native.window.Height); }; Native.window.onresize += delegate { AtResize(); }; AtResize(); #endregion var r = new Random(); Func <f> Math_random = () => r.NextFloat(); #region Add boxes { // for (var i = 0; i < 32; i++) { var boxsize = Math_random() * 0.5; var halfExtents = new CANNON.Vec3(boxsize, boxsize, boxsize); var boxShape = new CANNON.Box(halfExtents); var boxGeometry = new THREE.CubeGeometry(halfExtents.x * 2, halfExtents.y * 2, halfExtents.z * 2); var x = (Math_random() - 0.5) * 20; var y = 1 + (Math_random() - 0.5) * 1; var z = (Math_random() - 0.5) * 20; var boxBody = new CANNON.RigidBody(5, boxShape); var boxMesh = new THREE.Mesh(boxGeometry, material); world.add(boxBody); scene.add(boxMesh); boxBody.position.set(x, y, z); boxMesh.position.set(x, y, z); boxMesh.castShadow = true; boxMesh.receiveShadow = true; //boxMesh.useQuaternion = true; boxes.Add(boxBody); boxMeshes.Add(boxMesh); } } #endregion #region Add linked boxes { // var size = 0.5; var he = new CANNON.Vec3(size, size, size * 0.1); var boxShape = new CANNON.Box(he); var mass = 0.0; var space = 0.1 * size; var N = 5; var last = default(CANNON.RigidBody); var boxGeometry = new THREE.CubeGeometry(he.x * 2, he.y * 2, he.z * 2); for (var i = 0; i < N; i++) { var boxbody = new CANNON.RigidBody(mass, boxShape); var boxMesh = new THREE.Mesh(boxGeometry, material); boxbody.position.set(5, (N - i) * (size * 2 + 2 * space) + size * 2 + space, 0); boxbody.linearDamping = 0.01; boxbody.angularDamping = 0.01; //boxMesh.useQuaternion = true; boxMesh.castShadow = true; boxMesh.receiveShadow = true; world.add(boxbody); scene.add(boxMesh); boxes.Add(boxbody); boxMeshes.Add(boxMesh); if (i != 0) { // Connect this body to the last one var c1 = new CANNON.PointToPointConstraint(boxbody, new CANNON.Vec3(-size, size + space, 0), last, new CANNON.Vec3(-size, -size - space, 0)); var c2 = new CANNON.PointToPointConstraint(boxbody, new CANNON.Vec3(size, size + space, 0), last, new CANNON.Vec3(size, -size - space, 0)); world.addConstraint(c1); world.addConstraint(c2); } else { mass = 0.3; } last = boxbody; } } #endregion #endregion var dt = 1.0 / 60; controls.enabled = true; // vr and tilt shift? Native.window.onframe += delegate { if (controls.enabled) { // how big of a world can we hold? // async ? world.step(dt); // Update ball positions for (var i = 0; i < balls.Count; i++) { balls[i].position.copy(ballMeshes[i].position); balls[i].quaternion.copy(ballMeshes[i].quaternion); } // Update box positions for (var i = 0; i < boxes.Count; i++) { boxes[i].position.copy(boxMeshes[i].position); boxes[i].quaternion.copy(boxMeshes[i].quaternion); } } controls.update(Date_now() - time); renderer.render(scene, camera); time = Date_now(); }; #region havePointerLock renderer.domElement.onclick += delegate { renderer.domElement.requestPointerLock(); }; #endregion #region onmousedown renderer.domElement.onmousedown += e => { if (e.MouseButton == IEvent.MouseButtonEnum.Middle) { if (Native.document.pointerLockElement == Native.document.body) { // cant requestFullscreen while pointerLockElement Console.WriteLine("exitPointerLock"); Native.document.exitPointerLock(); Native.document.exitFullscreen(); return; } Console.WriteLine("requestFullscreen"); renderer.domElement.requestFullscreen(); renderer.domElement.requestPointerLock(); return; } var ballradius = 0.1 + Math_random() * 0.9; var ballShape = new CANNON.Sphere(ballradius); var ballGeometry = new THREE.SphereGeometry(ballShape.radius, 32, 32); var shootDirection = new THREE.Vector3(); var shootVelo = 15; var projector = new THREE.Projector(); Action <THREE.Vector3> getShootDir = (targetVec) => { var vector = targetVec; targetVec.set(0, 0, 1); projector.unprojectVector(vector, camera); var ray = new THREE.Ray((THREE.Vector3)(object) controls_sphereBody.position, vector //.subSelf(controls_sphereBody.position) .normalize() ); targetVec.x = ray.direction.x; targetVec.y = ray.direction.y; targetVec.z = ray.direction.z; }; var x = controls_sphereBody.position.x; var y = controls_sphereBody.position.y; var z = controls_sphereBody.position.z; // could we attach physics via binding list? var ballBody = new CANNON.RigidBody(1, ballShape); var ballMesh = new THREE.Mesh(ballGeometry, material); world.add(ballBody); scene.add(ballMesh); ballMesh.castShadow = true; ballMesh.receiveShadow = true; balls.Add(ballBody); ballMeshes.Add(ballMesh); getShootDir(shootDirection); ballBody.velocity.set(shootDirection.x * shootVelo, shootDirection.y * shootVelo, shootDirection.z * shootVelo); // // Move the ball outside the player sphere x += shootDirection.x * (controls_sphereShape.radius + ballShape.radius); y += shootDirection.y * (controls_sphereShape.radius + ballShape.radius); z += shootDirection.z * (controls_sphereShape.radius + ballShape.radius); ballBody.position.set(x, y, z); ballMesh.position.set(x, y, z); //ballMesh.useQuaternion = true; }; #endregion //var ze = new ZeProperties(); //ze.Show(); //ze.Left = 0; //ze.Add(() => renderer); //ze.Add(() => controls); //ze.Add(() => scene); }