private static void InitializeContent() { Action __WoodsXmasByRobert_loaded = null; Console.WriteLine( new { Native.window.opener, Native.window.parent } ); Native.window.parent.With( parent => { parent.postMessage("WoodsXmasByRobert.preparing"); Console.WriteLine("WoodsXmasByRobert.preparing"); __WoodsXmasByRobert_loaded = delegate { Console.WriteLine("will post WoodsXmasByRobert.loaded"); __WoodsXmasByRobert_loaded = null; parent.postMessage("WoodsXmasByRobert.loaded"); }; } ); //<!-- Snow flakes --> new IHTMLScript { type = "x-shader/x-vertex", id = "vertexshader", innerText = new Shaders.particlesVertexShader().ToString() }.AttachToDocument(); new IHTMLScript { type = "x-shader/x-fragment", id = "fragmentshader", innerText = new Shaders.particlesFragmentShader().ToString() }.AttachToDocument(); var w = Native.window; dynamic window = w; // http://stackoverflow.com/questions/4923136/why-doesnt-firefox-support-mp3-file-format-in-audio // Timestamp: 12/28/2012 1:22:05 PM //Warning: HTTP "Content-Type" of "audio/mpeg3" is not supported. Load of media resource http://192.168.1.100:27248/assets/WoodsXmasByRobert/unfiltered_mix.mp3 failed. //Source File: http://192.168.1.100:27248/ //Line: 0 #region snd var snd = new HTML.Audio.FromAssets.unfiltered_mix { volume = 0.9 }; window.snd = snd; Native.window.onfocus += delegate { Console.WriteLine("WoodsXmasByRobert onfocus"); snd.volume = 0.9; }; Native.window.onblur += delegate { Console.WriteLine("WoodsXmasByRobert onblur"); snd.volume = 0.1; // if we are also not visible anymore // and animations frame stop // we should stop all sound }; #endregion var canvas = new IHTMLCanvas(); object webglRenderer_args = new object().With( (dynamic a) => { a.clearColor = 0x000000; a.clearAlpha = 1.0; a.preserveDrawingBuffer = true; a.canvas = canvas; } ); var webglRenderer = new THREE.WebGLRenderer( webglRenderer_args ); webglRenderer.autoClear = false; //var canvas = (IHTMLCanvas)webglRenderer.domElement; canvas.AttachToDocument(); webglRenderer.setSize(Native.window.Width, Native.window.Height); var camera = new THREE.PerspectiveCamera(75, Native.window.Width / Native.window.Height, 1, 100000); camera.position.z = 0; camera.position.x = 0; camera.position.y = 0; window.camera = camera; var cameraTarget = new THREE.Vector3(); cameraTarget.z = -400; camera.lookAt(cameraTarget); window.cameraTarget = cameraTarget; var loadingImage = THREE.ImageUtils.loadTexture(new loading().src); var map = THREE.ImageUtils.loadTexture(new snowflake().src); var starImage = THREE.ImageUtils.loadTexture(new flare().src); window.loadingImage = loadingImage; window.map = map; window.starImage = starImage; #region cursor var cursor = new pointer(); cursor.style.zIndex = 0x1000; cursor.Hide(); cursor.AttachToDocument(); dynamic style = Native.Document.body.style; //http://stackoverflow.com/questions/7849002/how-can-i-set-the-hotspot-to-the-center-of-a-custom-cursor // http://stackoverflow.com/questions/5649608/custom-css-cursors style.cursor = "url(" + cursor.src + ") 16 16,pointer"; #endregion var mouseXpercent = 0.5; var mouseYpercent = 0.5; #region onmousemove var CursorX = 0; var CursorY = 0; Native.Document.onmousemove += e => { if (Native.Document.pointerLockElement == Native.Document.body) { cursor.Show(); CursorX += e.movementX; CursorY += e.movementY; } else { cursor.Hide(); CursorX = e.CursorX; CursorY = e.CursorY; } // keep cursor in view CursorX = CursorX.Max(0).Min(Native.window.Width); CursorY = CursorY.Max(0).Min(Native.window.Height); if (Native.document.pointerLockElement == Native.document.body) { cursor.style.SetLocation(CursorX - 16, CursorY - 16); } var windowHalfX = Native.window.Width >> 1; var windowHalfY = Native.window.Height >> 1; var mouseX = (CursorX - windowHalfX); var mouseY = (CursorY - windowHalfY); mouseXpercent = mouseX / windowHalfX; mouseYpercent = mouseY / windowHalfY; window.mouseXpercent = mouseXpercent; window.mouseYpercent = mouseYpercent; }; #endregion Native.Document.onmousedown += e => { if (e.MouseButton == IEvent.MouseButtonEnum.Right) Native.Document.body.requestPointerLock(); }; new AppCode().Content.AttachToDocument().onload += delegate { // ScriptCoreLib should define this event! snd.addEventListener( "loadeddata", new Action( delegate { new IFunction("window.checkLoadingDone();").apply(Native.window); } ) ); var scene = (THREE.Scene)(object)window.scene; scene.add(camera); #region Cloud { object args = new object().With( (dynamic a) => { a.map = THREE.ImageUtils.loadTexture(new cloud().src); a.transparent = true; a.opacity = 0.17; a.fog = false; } ); var cloudPlane = new THREE.PlaneGeometry(12500, 1880); var cloud = new THREE.Mesh(cloudPlane, new THREE.MeshBasicMaterial(args)); cloud.position.set(300, 5350, -4450); cloud.lookAt(camera.position); scene.add(cloud); window.cloud = cloud; } #endregion #region Sky { object args = new object().With( (dynamic a) => { a.map = THREE.ImageUtils.loadTexture(new sky().src); a.opacity = 0.57; a.fog = false; } ); var skyPlane = new THREE.PlaneGeometry(9000, 6000); var sky = new THREE.Mesh(skyPlane, new THREE.MeshBasicMaterial(args)); sky.scale.set(4, 2.5, 2.5); sky.position.set(0, 7500, -6000); sky.lookAt(camera.position); scene.add(sky); window.sky = sky; } #endregion #region moon { dynamic moon_material_args = new object(); moon_material_args.map = THREE.ImageUtils.loadTexture(new moon().src); moon_material_args.transparent = true; moon_material_args.opacity = 0.3; moon_material_args.fog = false; moon_material_args.blending = THREE.AdditiveBlending; var moonPlane = new THREE.PlaneGeometry(1000, 1000); var moon = new THREE.Mesh(moonPlane, new THREE.MeshBasicMaterial( (object)moon_material_args ) ); moon.position.set(300, 4300, -4600); moon.lookAt(camera.position); scene.add(moon); window.moon = moon; } #endregion #region subtitleArray var subtitleArray = (IArray<THREE.Mesh>)(object)window.subtitleArray; var textPlane = new THREE.PlaneGeometry(512, 80); new SubtitlesImages().Images.WithEach( i => { object args = new object().With( (dynamic a) => { a.map = THREE.ImageUtils.loadTexture(i.src); a.transparent = true; a.depthTest = false; } ); var sub = new THREE.Mesh(textPlane, new THREE.MeshBasicMaterial(args)); sub.position.z = -800; sub.position.y = -550; sub.visible = false; camera.add(sub); subtitleArray.push(sub); } ); { var endPlane = new THREE.PlaneGeometry(500, 100); object args = new object().With( (dynamic a) => { a.map = THREE.ImageUtils.loadTexture(new xmas().src); a.transparent = true; a.opacity = 1.0; a.depthTest = false; } ); var end = new THREE.Mesh(endPlane, new THREE.MeshBasicMaterial(args)); end.position.z = -400; end.position.y = 100; end.visible = false; camera.add(end); subtitleArray.push(end); window.end = end; } new IFunction("window.setupSubtitles();").apply(Native.window); #endregion var particles = (THREE.ParticleSystem)(object)window.particles; var bgSprite = (THREE.Sprite)(object)window.bgSprite; var loadingSprite = (THREE.Sprite)(object)window.loadingSprite; var pointLight = (THREE.PointLight)(object)window.pointLight; var treeArray = (IArray<THREE.Mesh>)(object)window.treeArray; var rockArray = (IArray<THREE.Mesh>)(object)window.rockArray; var flowerArray = (IArray<THREE.Mesh>)(object)window.flowerArray; var groundMesh1 = (THREE.Mesh)(object)window.groundMesh1; var groundMesh2 = (THREE.Mesh)(object)window.groundMesh2; var renderModel = (object)window.renderModel; var effectFilm = (object)window.effectFilm; var effectVignette = (object)window.effectVignette; var effectCopy = (object)window.effectCopy; var composer = new THREE.EffectComposer(webglRenderer); composer.addPass(renderModel); composer.addPass(effectFilm); composer.addPass(effectVignette); composer.addPass(effectCopy); var speedEffector_value = (int)new IFunction("return window.speedEffector.value;").apply(Native.window); #region load Action<string, Action<object>> load = (src, yield) => { new THREE.JSONLoader().load( src, IFunction.OfDelegate(yield) ); }; #endregion #region sled load( new WoodsXmasByRobert.Design.models.sleigh().Content.src, geometry => { Console.WriteLine("got sled!"); var sled = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial() ); var scale = 4; sled.scale.set(scale, scale, scale); sled.rotation.y = -Math.PI / 2; sled.position.y = -290; sled.position.z = -80; scene.add(sled); window.sled = sled; new IFunction("window.checkLoadingDone();").apply(Native.window); } ); #endregion var random = new Random(); #region treeDead load( new WoodsXmasByRobert.Design.models.treeDead().Content.src, tree1Geo => { Console.WriteLine("got treeDead!"); load( new WoodsXmasByRobert.Design.models.treeEvergreenHigh().Content.src, tree2Geo => { Console.WriteLine("got treeEvergreenHigh!"); var gridSize = 500; for (var x = 0; x < 8; x++) { for (var z = 0; z < 12; z++) { var geo = tree2Geo; if (random.NextDouble() < 0.25) if (x != 0 && x != 7) { geo = tree1Geo; } var mesh = new THREE.Mesh(geo, new THREE.MeshFaceMaterial()); var scale = 1.2 + random.NextDouble(); mesh.scale.set(scale, scale * 2, scale); var posx = 0.0; if (x < 4) { posx = (x * gridSize) - (gridSize * 4) - 100 + random.NextDouble() * 100 - 50; } else { posx = (x * gridSize) - 1400 + random.NextDouble() * 100 - 50; }; var posz = -(z * gridSize) + random.NextDouble() * 100 - 50; mesh.position.set(posx, -400 - (random.NextDouble() * 80), posz); mesh.rotation.set((random.NextDouble() * 0.2) - 0.1, random.NextDouble() * Math.PI, (random.NextDouble() * 0.2) - 0.1); scene.add(mesh); treeArray.push(mesh); } } new IFunction("window.checkLoadingDone();").apply(Native.window); } ); } ); #endregion #region bird load( new WoodsXmasByRobert.Design.models.eagle().Content.src, geometry => { Console.WriteLine("got bird!"); dynamic args = new object(); args.color = 0x000000; args.morphTargets = true; args.fog = false; var bird = new THREE.MorphAnimMesh( geometry, new THREE.MeshBasicMaterial( (object)args ) ); bird.duration = 1000; bird.scale.set(4, 4, 4); bird.rotation.y = Math.PI; bird.position.set(0, 3000, -1500); scene.add(bird); window.bird = bird; new IFunction("window.checkLoadingDone();").apply(Native.window); } ); #endregion #region rock load( new WoodsXmasByRobert.Design.models.rock().Content.src, geometry => { Console.WriteLine("got rock!"); var numOfRocks = 25; for (var i = 0; i < numOfRocks; ++i) { dynamic args = new object(); args.color = 0x444444; var mesh = new THREE.Mesh(geometry, new THREE.MeshLambertMaterial((object)args)); var scale = 1 + (random.NextDouble() * 0.5); mesh.scale.set(scale, scale, scale); mesh.rotation.set(0, random.NextDouble() * Math.PI, 0); mesh.position.set((random.NextDouble() * 4000) - 2000, -400, (random.NextDouble() * 6000) - 6000); if (mesh.position.x < 45) if (mesh.position.x > 0) { mesh.position.x += 450; } if (mesh.position.x > -450) if (mesh.position.x < 0) { mesh.position.x -= 450; } scene.add(mesh); rockArray.push(mesh); } new IFunction("window.checkLoadingDone();").apply(Native.window); } ); #endregion #region horse load( new WoodsXmasByRobert.Design.models.horse().Content.src, geometry => { Console.WriteLine("got horse!"); dynamic horse_material_args = new object(); horse_material_args.color = 0x090601; horse_material_args.morphTargets = true; var horse = new THREE.MorphAnimMesh(geometry, new THREE.MeshLambertMaterial( (object)horse_material_args ) ); horse.duration = 1000; horse.scale.set(2.5, 1.8, 2); horse.rotation.y = Math.PI; horse.position.set(0, -350, -700); scene.add(horse); window.horse = horse; //checkLoadingDone(); // Handles var plane = new THREE.PlaneGeometry(700, 10, 40, 1); var l = Math.Floor(plane.vertices.Length / 2.0); for (var i = 0; i < l; i++) { var offset = Math.Sin(i / 14) * 100; plane.vertices[i].y -= offset; plane.vertices[i + 41].y -= offset; plane.vertices[i].z -= (i / 5) + (offset * -1) / 8; plane.vertices[i + 41].z += (i / 5) - (offset * -1) / 8; } dynamic material_args = new object(); material_args.color = 0x090601; material_args.side = THREE.DoubleSide; var material = new THREE.MeshBasicMaterial( (object)material_args ); var leftHandle = new THREE.Mesh(plane, material); leftHandle.position.y = -120; leftHandle.position.z = -350; leftHandle.position.x = -30; leftHandle.rotation.y = -(Math.PI / 2) + 0.075; leftHandle.rotation.x = Math.PI * 2 - 0.075; scene.add(leftHandle); window.leftHandle = leftHandle; var rightHandle = new THREE.Mesh(plane, material); rightHandle.position.y = -120; rightHandle.position.z = -350; rightHandle.position.x = 30; rightHandle.rotation.y = -(Math.PI / 2) - 0.075; rightHandle.scale.z = -1; rightHandle.rotation.x = Math.PI * 2 - 0.075; scene.add(rightHandle); window.rightHandle = rightHandle; new IFunction("window.checkLoadingDone();").apply(Native.window); } ); #endregion #region flowerLoaded Action<object, bool> flowerLoaded = (geometry, halfScale) => { var numOfFlowers = 20; var half = Math.Floor(numOfFlowers / 2.0); dynamic args = new object(); args.color = 0x444444; for (var i = 0; i < half; ++i) { var mesh = new THREE.Mesh(geometry, new THREE.MeshLambertMaterial( (object)args ) ); var scale = 1 + (random.NextDouble() * 1); if (halfScale) { scale *= 0.6; } mesh.scale.set(scale, scale, scale); mesh.rotation.set((random.NextDouble() * 0.6) - 0.3, random.NextDouble() * Math.PI, (random.NextDouble() * 0.6) - 0.3); mesh.position.set((random.NextDouble() * 1000) - 500, -310, (random.NextDouble() * 6000) - 6000); if (mesh.position.x < 100) if (mesh.position.x > 0) { mesh.position.x += 100; } if (mesh.position.x > -100) if (mesh.position.x < 0) { mesh.position.x -= 100; } scene.add(mesh); flowerArray.push(mesh); } new IFunction("window.checkLoadingDone();").apply(Native.window); }; #endregion #region weeds01 load( new WoodsXmasByRobert.Design.models.weeds01().Content.src, geometry => { Console.WriteLine("got weeds01!"); flowerLoaded(geometry, false); } ); #endregion #region glowbulb load( new WoodsXmasByRobert.Design.models.glowbulb().Content.src, geometry => { Console.WriteLine("got glowbulb!"); flowerLoaded(geometry, true); } ); #endregion #region run Action<double> run = delta => { // trees var mesh = default(THREE.Mesh); for (var i = 0; i < treeArray.length; ++i) { mesh = treeArray[i]; // respawn if (mesh.position.z > camera.position.z + 700) { mesh.position.z -= 6000; var scale = 1.2 + random.NextDouble(); mesh.scale.set(scale, scale * 2, scale); } } // rocks for (var i = 0; i < rockArray.length; ++i) { mesh = rockArray[i]; // respawn if (mesh.position.z > camera.position.z + 400) { mesh.position.z -= 6000; } } // flowers for (var i = 0; i < flowerArray.length; ++i) { mesh = flowerArray[i]; // respawn if (mesh.position.z > camera.position.z + 400) { mesh.position.z -= 6000; } } // ground respawn if (groundMesh1.position.z - 10000 > camera.position.z) { groundMesh1.position.z -= 40000; } if (groundMesh2.position.z - 10000 > camera.position.z) { groundMesh2.position.z -= 40000; } }; #endregion var oldTime = new IDate().getTime(); var r = 0.0; bool disableNextFrame = false; #region loop Action loop = delegate { var allLoaded = (bool)(object)window.allLoaded; var horse = (THREE.MorphAnimMesh)(object)window.horse; var bird = (THREE.MorphAnimMesh)(object)window.bird; var leftHandle = (THREE.Mesh)(object)window.leftHandle; var rightHandle = (THREE.Mesh)(object)window.rightHandle; var moon = (THREE.Mesh)(object)window.moon; var cloud = (THREE.Mesh)(object)window.cloud; var sky = (THREE.Mesh)(object)window.sky; var sled = (THREE.Mesh)(object)window.sled; //new IFunction("this.loop();").apply(Native.Window); var time = new IDate().getTime(); var delta = time - oldTime; oldTime = time; if (double.IsNaN(delta)) { delta = 1000 / 60; } var maxSpeed = delta / 2; if (allLoaded) { r += delta / 2000; run(delta); var noise = random.NextDouble() * 2; camera.position.x = (50 * Math.Cos(r * 2)) * speedEffector_value; camera.position.y = (2 * Math.Sin(r * 12) - 100) * speedEffector_value; camera.up.x = (Math.Sin(r * 12) / 50) * speedEffector_value; cameraTarget.y += (((camera.position.y + 80) + noise - mouseYpercent * 120) - cameraTarget.y) / 20; cameraTarget.x += (mouseXpercent * 400 - cameraTarget.x) / 20; var speed = (delta / 2) * speedEffector_value; camera.position.z -= speed; cameraTarget.z -= speed; camera.lookAt(cameraTarget); pointLight.position.z -= speed; if (moon != null) { moon.position.z -= speed; } if (cloud != null) { cloud.position.z -= speed; } if (sky != null) { sky.position.z -= speed; } #region sled if (sled != null) { sled.position.z -= speed; sled.position.x = camera.position.x; } #endregion #region bird if (bird != null) { bird.position.x = 200 * Math.Cos(r) + ((bird.position.z - camera.position.z) / 10); bird.position.y = 4000 + (Math.Sin(r) * 300); bird.position.z -= maxSpeed * 1.25; if (bird.position.z < camera.position.z - 10000) { bird.position.z = camera.position.z - 500; } bird.updateAnimation(delta); } #endregion #region horse if (horse != null) { horse.position.z -= speed; horse.position.x = camera.position.x; horse.updateAnimation(speed * 2); leftHandle.position.z -= speed; leftHandle.position.x = camera.position.x - 37; rightHandle.position.z -= speed; rightHandle.position.x = camera.position.x + 40; leftHandle.scale.y = 1 - Math.Abs(Math.Sin(camera.position.z / 150)) / 4; rightHandle.scale.y = leftHandle.scale.y; } #endregion particles.position.z -= speed; new IFunction("e", "window.uniforms.globalTime.value += e;").apply(Native.window, delta * 0.00015); new IFunction("e", "window.uniforms.speed.value = e;").apply(Native.window, speed / maxSpeed); new IFunction("window.runSubtitles();").apply(Native.window); //disableNextFrame = true; if (__WoodsXmasByRobert_loaded != null) __WoodsXmasByRobert_loaded(); } else { if (loadingSprite != null) { loadingSprite.position.set(Native.window.Width >> 1, Native.window.Height >> 1, 0); loadingSprite.rotation -= 0.08; } } if (bgSprite != null) { bgSprite.position.set(Native.window.Width >> 1, Native.window.Height >> 1, 0); } new IFunction("window.TWEEN.update();").apply(Native.window); //if (has_gl) { webglRenderer.clear(); composer.render(0.01); } }; #endregion #region animate Native.window.onframe += delegate { if (disableNextFrame) return; loop(); }; #endregion Action AtResize = delegate { // notify the renderer of the size change webglRenderer.setSize(Native.window.Width, Native.window.Height); // update the camera camera.aspect = Native.window.Width / Native.window.Height; camera.updateProjectionMatrix(); }; #region onresize Native.window.onresize += delegate { AtResize(); }; #endregion AtResize(); }; Native.Document.body.ondblclick += delegate { Native.Document.body.requestFullscreen(); }; Native.Document.body.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; } Native.Document.body.requestFullscreen(); Native.Document.body.requestPointerLock(); } }; Native.Document.oncontextmenu += e => { e.preventDefault(); }; }
/// <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) { { THREE.SkinnedMesh ref0; } { THREE.SpeedBlendCharacter ref0; } // will skip DefineVersionInfoResource //102c: 02:01:1e RewriteToAssembly error: System.NotSupportedException: Type 'xchrome.BCLImplementation.System.Net.Sockets.__TcpListener' was not completed. #region AtFormCreated FormStyler.AtFormCreated = s => { s.Context.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; // this is working? var x = new ChromeTCPServerWithFrameNone.HTML.Pages.AppWindowDrag().AttachTo(s.Context.GetHTMLTarget()); }; #endregion #if false #region ChromeTCPServer dynamic self = Native.self; dynamic self_chrome = self.chrome; object self_chrome_socket = self_chrome.socket; if (self_chrome_socket != null) { chrome.Notification.DefaultIconUrl = new HTML.Images.FromAssets.Preview().src; chrome.Notification.DefaultTitle = "WebGLYomotsuTPS"; ChromeTCPServer.TheServerWithStyledForm.Invoke( AppSource.Text, AtFormCreated: FormStyler.AtFormCreated ); return; } #endregion #endif var fov = 40; #region container Native.document.body.style.overflow = IStyle.OverflowEnum.hidden; var container = new IHTMLDiv(); container.AttachToDocument(); container.style.backgroundColor = "#000000"; container.style.SetLocation(0, 0, Native.window.Width, Native.window.Height); #endregion var player_model_objects = new THREE.Object3D(); var player_position_x = 0.0f; var player_position_y = 0.0f; var player_position_z = 0.0f; var player_position_direction = 0; var player_camera_speed = 300; var player_camera_distance = 5; var player_camera_x = 0.0f; var player_camera_y = 0.0f; var player_camera_z = 0.0f; var player_motion = default(motion); //var width = Native.window.Width; //var height = Native.window.Height; var clock = new Stopwatch(); clock.Start(); //var clock = new THREE.Clock(); var scene = new THREE.Scene(); scene.fog = new THREE.FogExp2(0x000000, 0.05f); scene.add(player_model_objects); var camera = new THREE.PerspectiveCamera(fov, Native.window.aspect, //width / height, 1, 1000); scene.add(camera); #region light var light = new THREE.DirectionalLight(0xffffff, 1.5); light.position.set(1, 1, 1).normalize(); light.castShadow = true; scene.add(light); #endregion var md2frames = new md2frames(); var moveState_moving = false; var moveState_front = false; var moveState_Backwards = false; var moveState_left = false; var moveState_right = false; var moveState_speed = .1; var moveState_angle = 0; #region move Action move = delegate { // if(player.model.motion !== 'run' && player.model.state === 'stand'){ // changeMotion('run'); //} //if(player.model.motion !== 'crwalk' && player.model.state === 'crstand'){ // changeMotion('crwalk'); //} var speed = moveState_speed; //if(player.model.state === 'crstand'){speed *= .5;} //if(player.model.state === 'freeze') {speed *= 0;} var direction = moveState_angle; if (moveState_front && !moveState_left && !moveState_Backwards && !moveState_right) { direction += 0; } if (moveState_front && moveState_left && !moveState_Backwards && !moveState_right) { direction += 45; } if (!moveState_front && moveState_left && !moveState_Backwards && !moveState_right) { direction += 90; } if (!moveState_front && moveState_left && moveState_Backwards && !moveState_right) { direction += 135; } if (!moveState_front && !moveState_left && moveState_Backwards && !moveState_right) { direction += 180; } if (!moveState_front && !moveState_left && moveState_Backwards && moveState_right) { direction += 225; } if (!moveState_front && !moveState_left && !moveState_Backwards && moveState_right) { direction += 270; } if (moveState_front && !moveState_left && !moveState_Backwards && moveState_right) { direction += 315; } player_model_objects.rotation.y = (float)(direction * Math.PI / 180); player_position_x -= (float)(Math.Sin(direction * Math.PI / 180) * speed); player_position_z -= (float)(Math.Cos(direction * Math.PI / 180) * speed); }; #endregion #region camera rotation Action rotate = delegate { }; var pointer_x = 0f; var pointer_y = 0f; var oldPointerX = 0f; var oldPointerY = 0f; container.onmousemove += e => { if (Native.document.pointerLockElement == container) { oldPointerX = 0; oldPointerY = 0; pointer_x = e.movementX * 0.01f; pointer_y = -e.movementY * 0.01f; rotate(); return; } pointer_x = (e.CursorX / Native.window.Width) * 2 - 1; pointer_y = -(e.CursorY / Native.window.Height) * 2 + 1; rotate(); }; container.onmouseup += e => { rotate = delegate { }; Native.document.exitPointerLock(); }; container.onmousedown += e => { oldPointerX = pointer_x; oldPointerY = pointer_y; rotate = delegate { player_camera_x += (oldPointerX - pointer_x) * player_camera_speed; player_camera_y += (oldPointerY - pointer_y) * player_camera_speed; if (player_camera_y > 150) { player_camera_y = 150; } if (player_camera_y < -150) { player_camera_y = -150; } moveState_angle = Convert.ToInt32(player_camera_x / 2) % 360; oldPointerX = pointer_x; oldPointerY = pointer_y; }; Console.WriteLine("requestPointerLock"); container.requestPointerLock(); }; #endregion var renderer = new THREE.WebGLRenderer(); //renderer.setSize(width, height); renderer.setSize(); renderer.shadowMapEnabled = true; renderer.shadowMapSoft = true; renderer.domElement.AttachTo(container); #region create field var planeGeometry = new THREE.PlaneGeometry(1000, 1000); var planeMaterial = new THREE.MeshLambertMaterial( new { map = THREE.ImageUtils.loadTexture(new HTML.Images.FromAssets.bg().src), color = 0xffffff } ); planeMaterial.map.repeat.x = 300; planeMaterial.map.repeat.y = 300; planeMaterial.map.wrapS = THREE.RepeatWrapping; planeMaterial.map.wrapT = THREE.RepeatWrapping; var plane = new THREE.Mesh(planeGeometry, planeMaterial); plane.castShadow = false; plane.receiveShadow = true; { var parent = new THREE.Object3D(); parent.add(plane); parent.rotation.x = -Math.PI / 2; scene.add(parent); } var random = new Random(); var meshArray = new List<THREE.Mesh>(); var geometry = new THREE.CubeGeometry(1, 1, 1); for (var i = 0; i < 100; i++) { var ii = new THREE.Mesh(geometry, new THREE.MeshLambertMaterial( new { color = (Convert.ToInt32(0xffffff * random.NextDouble())) })); ii.position.x = i % 2 * 5 - 2.5f; ii.position.y = .5f; ii.position.z = -1 * i * 4; ii.castShadow = true; ii.receiveShadow = true; meshArray.Add(ii); scene.add(ii); } #endregion //load converted md2 data var material = new THREE.MeshPhongMaterial( new { map = THREE.ImageUtils.loadTexture( new HTML.Images.FromAssets._1().src ), ambient = 0x999999, color = 0xffffff, specular = 0xffffff, shininess = 25, morphTargets = true } ); var loader = new THREE.JSONLoader(); loader.load( new global::WebGLYomotsuTPS.Design.droid().Content.src, xgeometry => { var md2meshBody = new THREE.MorphAnimMesh(xgeometry, material); md2meshBody.rotation.y = (float)(-Math.PI / 2); md2meshBody.scale.set(.02, .02, .02); md2meshBody.position.y = .5f; md2meshBody.castShadow = true; md2meshBody.receiveShadow = false; #region player_motion Action<motion> player_changeMotion = motion => { Console.WriteLine( new { motion, md2frames.run, md2frames.stand }); player_motion = motion; // player.state = md2frames[motion][3].state; var animMin = motion.min; var animMax = motion.max; var animFps = motion.fps; md2meshBody.time = 0; md2meshBody.duration = (int)( 1000 * ((animMax - animMin) / (double)animFps) ); Native.document.title = new { animMin, animMax }.ToString(); md2meshBody.setFrameRange(animMin, animMax); }; player_changeMotion(md2frames.stand); #endregion player_model_objects.add(md2meshBody); #region onkeydown Native.document.onkeydown += e => { if (e.KeyCode == 67) { if (player_motion == md2frames.stand) player_changeMotion(md2frames.crstand); else if (player_motion == md2frames.crstand) player_changeMotion(md2frames.stand); } else if (e.KeyCode == 87) { moveState_front = true; moveState_Backwards = false; } else if (e.KeyCode == 83) { moveState_front = false; moveState_Backwards = true; } else if (e.KeyCode == 65) { moveState_left = true; moveState_right = false; } else if (e.KeyCode == 68) { moveState_left = false; moveState_right = true; } var isStand = player_motion == md2frames.stand; Console.WriteLine( new { e.KeyCode, moveState_front, moveState_Backwards, isStand } ); if (moveState_front || moveState_Backwards || moveState_left || moveState_right) if (player_motion == md2frames.stand) player_changeMotion(md2frames.run); else if (player_motion == md2frames.crstand) player_changeMotion(md2frames.crwalk); }; #endregion #region onkeyup Native.document.onkeyup += e => { if (e.KeyCode == 87) { moveState_front = false; } else if (e.KeyCode == 83) { moveState_Backwards = false; } else if (e.KeyCode == 65) { moveState_left = false; } else if (e.KeyCode == 68) { moveState_right = false; } }; #endregion #region loop Native.window.onframe += delegate { if (moveState_front || moveState_Backwards || moveState_left || moveState_right) move(); else if (player_motion == md2frames.run) player_changeMotion(md2frames.stand); else if (player_motion == md2frames.crwalk) player_changeMotion(md2frames.crstand); player_model_objects.position.x = player_position_x; player_model_objects.position.y = player_position_y; player_model_objects.position.z = player_position_z; // camera rotate x camera.position.x = (float)(player_position_x + player_camera_distance * Math.Sin((player_camera_x) * Math.PI / 360.0)); camera.position.z = (float)(player_position_z + player_camera_distance * Math.Cos((player_camera_x) * Math.PI / 360.0)); //camera rotate y //camera.position.x = player.position.x + player.camera.distance * Math.cos( (player.camera.y) * Math.PI / 360 ); camera.position.y = (float)(player_position_y + player_camera_distance * Math.Sin((player_camera_y) * Math.PI / 360.0)); //camera.position.z = player.position.z + player.camera.distance * Math.cos( (player.camera.y) * Math.PI / 360 ); camera.position.y += 1; //console.log(camera.position.z) var vec3 = new THREE.Vector3(player_position_x, player_position_y, player_position_z); camera.lookAt(vec3); #region model animation var delta = clock.ElapsedMilliseconds * 0.001; clock.Restart(); var isEndFleame = (player_motion.max == md2meshBody.currentKeyframe); var isAction = player_motion.action; var x = (isAction && !isEndFleame); if (!isAction || x) { md2meshBody.updateAnimation(1000 * delta); } else if (player_motion.state == "freeze") { //dead... } else { player_changeMotion(player_motion); } #endregion renderer.render(scene, camera); }; #endregion #region AtResize Action AtResize = delegate { container.style.SetLocation(0, 0, Native.window.Width, Native.window.Height); renderer.setSize(Native.window.Width, Native.window.Height); camera.projectionMatrix.makePerspective(fov, Native.window.aspect, 1, 1100); //camera.aspect = Native.Window.Width / Native.Window.Height; //camera.updateProjectionMatrix(); }; Native.window.onresize += delegate { AtResize(); }; AtResize(); #endregion #region requestFullscreen Native.document.body.ondblclick += delegate { if (IsDisposed) return; // http://tutorialzine.com/2012/02/enhance-your-website-fullscreen-api/ Native.document.body.requestFullscreen(); //AtResize(); }; #endregion } ); }
/// <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 }
/// <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(IDefault page = null) { // var THREE = { REVISION: '67' }; Native.document.title = new { THREE.REVISION }.ToString(); // works on IE11 //DiagnosticsConsole.ApplicationContent.BindKeyboardToDiagnosticsConsole(); //var fov = 40; var fov = 100; #region container Native.document.body.style.overflow = IStyle.OverflowEnum.hidden; var container = new IHTMLDiv(); container.AttachToDocument(); container.style.backgroundColor = "#000000"; container.style.SetLocation(0, 0, Native.window.Width, Native.window.Height); #endregion var width = Native.window.Width; var height = Native.window.Height; var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera( fov, Native.window.aspect, 1, 1000 ).AttachTo(scene); //camera.AttachTo(scene); //scene.add(camera); //var ambient = new THREE.AmbientLight( 0xffffff); //scene.add( ambient ); var light = new THREE.DirectionalLight(0xffffff, 0.8); light.position.set(1, 1, 1).normalize(); scene.add(light); var light2 = new THREE.DirectionalLight(0xffffff); light2.position.set(-1, -1, -1).normalize(); scene.add(light2); var renderer = new THREE.WebGLRenderer(); renderer.setSize(width, height); renderer.domElement.AttachTo(container); var md2frames = new md2frames(); //load converted md2 data var material = new THREE.MeshPhongMaterial( new { map = THREE.ImageUtils.loadTexture( new HTML.Images.FromAssets._1().src ), ambient = 0x999999, color = 0xffffff, specular = 0xffffff, shininess = 25, morphTargets = true } ); #region AtResize Action AtResize = delegate { container.style.SetLocation(0, 0, Native.window.Width, Native.window.Height); renderer.setSize(Native.window.Width, Native.window.Height); camera.projectionMatrix.makePerspective(fov, Native.window.aspect, 1, 1100); //camera.aspect = Native.Window.Width / Native.Window.Height; //camera.updateProjectionMatrix(); }; Native.window.onresize += delegate { AtResize(); }; AtResize(); #endregion new THREE.JSONLoader().load( new global::WebGLYomotsuMD2Model.Design.tris_md2().Content.src, new Action<object>( geometry => { var player_mesh = new THREE.MorphAnimMesh(geometry, material); player_mesh.rotation.y = (float)(-Math.PI / 2); player_mesh.scale.set(2, 2, 2); player_mesh.castShadow = true; player_mesh.receiveShadow = false; #region player_motion var player_motion = default(motion); Action<motion> player_changeMotion = motion => { player_motion = motion; // player.state = md2frames[motion][3].state; var animMin = motion.min; var animMax = motion.max; var animFps = motion.fps; player_mesh.time = 0; player_mesh.duration = 1000 * ((animMax - animMin) / animFps); //Console.WriteLine( // "setFrameRange " + // new // { // motion.min, // motion.max, // motion.fps // } // ); player_mesh.setFrameRange(animMin, animMax); }; player_changeMotion(md2frames.stand); #endregion //player_mesh.att scene.add(player_mesh); var theta = 0; //var clock = new THREE.Clock(); var clock = new Stopwatch(); clock.Start(); #region loop Native.window.onframe += delegate { var delta = clock.ElapsedMilliseconds * 0.001; clock.Restart(); var isEndFleame = (player_motion.max == player_mesh.currentKeyframe); var isAction = player_motion.action; var x = (isAction && !isEndFleame); if (!isAction || x) { player_mesh.updateAnimation(1000 * delta); } else if (player_motion.state == "freeze") { //dead... } else { player_changeMotion(player_motion); } camera.position.x = (float)(150 * Math.Sin(theta / 2 * Math.PI / 360)); camera.position.y = (float)(150 * Math.Sin(theta / 2 * Math.PI / 360)); camera.position.z = (float)(150 * Math.Cos(theta / 2 * Math.PI / 360)); camera.lookAt(scene.position); theta++; renderer.render(scene, camera); }; #endregion #region Toolbar var toolbar = new Toolbar(); if (page != null) { toolbar.Container.style.Opacity = 0.7; toolbar.Container.AttachToDocument(); toolbar.Container.style.position = IStyle.PositionEnum.absolute; toolbar.Container.style.right = "0"; toolbar.Container.style.bottom = "0"; toolbar.HideButton.onclick += delegate { // ScriptCoreLib.Extensions toolbar.HideTarget.ToggleVisible(); }; Action<IHTMLButton, motion> bind = (btn, value) => btn.onclick += delegate { player_changeMotion(value); }; bind(toolbar.Stand, md2frames.stand); bind(toolbar.Run, md2frames.run); bind(toolbar.Attack, md2frames.attack); bind(toolbar.Pain1, md2frames.pain1); bind(toolbar.Pain2, md2frames.pain2); bind(toolbar.Pain3, md2frames.pain3); bind(toolbar.Jump, md2frames.jump); bind(toolbar.Flip, md2frames.flip); bind(toolbar.Salute, md2frames.salute); bind(toolbar.Taunt, md2frames.taunt); bind(toolbar.Wave, md2frames.wave); bind(toolbar.Point, md2frames.point); bind(toolbar.Crstand, md2frames.crstand); bind(toolbar.Crwalk, md2frames.crwalk); bind(toolbar.Crattack, md2frames.crattack); bind(toolbar.Crpain, md2frames.crpain); bind(toolbar.Crdeath, md2frames.crdeath); bind(toolbar.Death1, md2frames.death1); bind(toolbar.Death2, md2frames.death2); bind(toolbar.Death3, md2frames.death3); } #endregion } ) ); //var ze = new ZeProperties(); //ze.Show(); //ze.treeView1.Nodes.Clear(); //ze.Add(() => renderer); ////ze.Add(() => controls); //ze.Add(() => scene); //ze.Left = 0; }