public void MakeMesh() { THREE.SphereGeometry ballGeo = new THREE.SphereGeometry(Radius - 10, 20, 20); THREE.MeshPhongMaterial ballMaterial = new THREE.MeshPhongMaterial(); ballMaterial.color = new THREE.Color().setHex(0xaaaaaa); Mesh = new THREE.Mesh(ballGeo, ballMaterial); Mesh.castShadow = true; Mesh.receiveShadow = true; Mesh.visible = Apply; }
private void MakeClothMesh(THREE.Texture t) { THREE.Texture clothTexture = t; clothTexture.wrapS = THREE.WrapType.MirroredRepeatWrapping; clothTexture.wrapT = THREE.WrapType.RepeatWrapping; clothTexture.repeat.y = -1; clothTexture.anisotropy = 16; THREE.MeshPhongMaterial clothMaterial = new THREE.MeshPhongMaterial(); clothMaterial.specular = new THREE.Color().setHex(0x030303); //clothMaterial.color = new THREE.Color(1, 0.4, 0); clothMaterial.map = clothTexture; clothMaterial.side = THREE.SideType.DoubleSide; clothMaterial.alphaTest = 0.5; clothMaterial.wireframe = false; clothMaterial.wireframeLinewidth = 2; // cloth mesh THREE.Mesh clothMesh = new THREE.Mesh(cloth.Geometry, clothMaterial); clothMesh.position.set(0, 0, 0); clothMesh.castShadow = true; THREE.ShaderMaterial shaderMat = null;; THREE.ShaderMaterialOptions o = new THREE.ShaderMaterialOptions() { texture = new THREE.Uniform() { type = "t", value = clothTexture } }; shaderMat = new THREE.ShaderMaterial(); shaderMat.side = THREE.SideType.DoubleSide; string vertexShader = Shaders.vertex; string fragmentShader = Shaders.fragment; shaderMat.vertexShader = vertexShader; shaderMat.fragmentShader = fragmentShader; clothMesh.customDepthMaterial = shaderMat; scene.add(clothMesh); }
public void MakeMesh() { THREE.Geometry g = new THREE.BoxGeometry(Width - 25, Height - 25, Depth - 25); THREE.MeshPhongMaterial mat = new THREE.MeshPhongMaterial(); mat.color = new THREE.Color().setHex(0xaaaaaa); mat.transparent = false; mat.opacity = 0.5; Mesh = new THREE.Mesh(g, mat); Mesh.castShadow = true; Mesh.receiveShadow = true; Mesh.visible = Apply; Mesh.position.copy(Center); }
private void MakePortal() { // poles var poleGeo = new THREE.BoxGeometry(5, 375, 5); var poleMat = new THREE.MeshPhongMaterial(); // { color: 0xffffff, specular: 0x111111, shininess: 100 } ); poleMat.color = new THREE.Color().setHex(0xffffff); poleMat.specular = new THREE.Color().setHex(0x111111); poleMat.shininess = 100; THREE.Mesh mesh = new THREE.Mesh(poleGeo, poleMat); mesh.position.x = -125; mesh.position.y = -62; mesh.receiveShadow = true; mesh.castShadow = true; scene.add(mesh); mesh = new THREE.Mesh(poleGeo, poleMat); mesh.position.x = 125; mesh.position.y = -62; mesh.receiveShadow = true; mesh.castShadow = true; scene.add(mesh); mesh = new THREE.Mesh(new THREE.BoxGeometry(255, 5, 5), poleMat); mesh.position.y = -250 + 750 / 2; mesh.position.x = 0; mesh.receiveShadow = true; mesh.castShadow = true; scene.add(mesh); var gg = new THREE.BoxGeometry(10, 10, 10); mesh = new THREE.Mesh(gg, poleMat); mesh.position.y = -250; mesh.position.x = 125; mesh.receiveShadow = true; mesh.castShadow = true; scene.add(mesh); mesh = new THREE.Mesh(gg, poleMat); mesh.position.y = -250; mesh.position.x = -125; mesh.receiveShadow = true; mesh.castShadow = true; scene.add(mesh); }
private void MakeClothMesh(THREE.Texture t) { THREE.Texture clothTexture = t; clothTexture.wrapS = THREE.WrapType.MirroredRepeatWrapping; clothTexture.wrapT = THREE.WrapType.RepeatWrapping; clothTexture.repeat.y = -1; clothTexture.anisotropy = 16; THREE.MeshPhongMaterial clothMaterial = new THREE.MeshPhongMaterial(); clothMaterial.specular = new THREE.Color().setHex(0x030303); //clothMaterial.color = new THREE.Color(1, 0.4, 0); clothMaterial.map = clothTexture; clothMaterial.side = THREE.SideType.DoubleSide; clothMaterial.alphaTest = 0.5; clothMaterial.wireframe = false; clothMaterial.wireframeLinewidth= 2; // cloth mesh THREE.Mesh clothMesh = new THREE.Mesh(cloth.Geometry, clothMaterial); clothMesh.position.set(0, 0, 0); clothMesh.castShadow = true; THREE.ShaderMaterial shaderMat = null; ; THREE.ShaderMaterialOptions o = new THREE.ShaderMaterialOptions() { texture = new THREE.Uniform() { type = "t", value = clothTexture } }; shaderMat = new THREE.ShaderMaterial(); shaderMat.side = THREE.SideType.DoubleSide; string vertexShader = Shaders.vertex; string fragmentShader = Shaders.fragment; shaderMat.vertexShader = vertexShader; shaderMat.fragmentShader = fragmentShader; clothMesh.customDepthMaterial = shaderMat; scene.add(clothMesh); }
private void MakeGroundPlane(THREE.Texture t) { THREE.Texture groundTexture = t; groundTexture.wrapS = THREE.WrapType.RepeatWrapping; groundTexture.wrapT = THREE.WrapType.RepeatWrapping; groundTexture.repeat.set(25, 25); groundTexture.anisotropy = 16; var groundMaterial = new THREE.MeshPhongMaterial(); groundMaterial.color = new THREE.Color().setHex(0xffffff); groundMaterial.specular = new THREE.Color().setHex(0x111111); groundMaterial.map = groundTexture;; THREE.Mesh planeMesh = new THREE.Mesh(new THREE.PlaneBufferGeometry(20000, 20000), groundMaterial); planeMesh.position.y = -250; planeMesh.rotation.x = -Math.PI / 2; planeMesh.receiveShadow = true; scene.add(planeMesh); }
/// <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() { base.Init(); controls = new THREE.TrackballControls(camera, Container); controls.rotateSpeed = 3.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 }; scene = new THREE.Scene(); // THREE.FogExp2 fg2 = new THREE.FogExp2(new THREE.Color().setHex(0xcccccc), 0.002); THREE.FogExp2 fg2 = new THREE.FogExp2(0xcccccc, 0.002); scene.fog = fg2; var geometry = new THREE.CylinderGeometry(0, 10, 30, 4, 1); var material = new THREE.MeshPhongMaterial(); material.color = new THREE.Color().setHex(0xffffff); // 0xffffff; material.shading = THREE.ShadingType.FlatShading; for (var i = 0; i < 500; i++) { var mesh = new THREE.Mesh(geometry, material); mesh.position.x = (Math.Random() - 0.5) * 1000; mesh.position.y = (Math.Random() - 0.5) * 1000; mesh.position.z = (Math.Random() - 0.5) * 1000; mesh.updateMatrix(); mesh.matrixAutoUpdate = false; scene.add(mesh); } // lights THREE.Light light = new THREE.DirectionalLight(); light.color = new THREE.Color().setHex(0xffffff); light.position.set(1, 1, 1); scene.add(light); light = new THREE.DirectionalLight(); light.color = new THREE.Color().setHex(0x002288); light.position.set(-1, -1, -1); scene.add(light); light = new THREE.AmbientLight(0x222222); light.color = new THREE.Color().setHex(0x222222); scene.add(light); // renderer renderer = new THREE.WebGLRenderer(false); renderer.antialias = false; renderer.setClearColor(scene.fog.color); //TODO: renderer.setPixelRatio( Window.devicePixelRatio ); renderer.setSize(Width, Height); Container.AppendChild(renderer.domElement); //stats = new Stats(); //stats.domElement.style.position = 'absolute'; //stats.domElement.style.top = '0px'; //stats.domElement.style.zIndex = 100; //container.appendChild( stats.domElement ); // // }
/// <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(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; }
private void MakeGroundPlane(THREE.Texture t) { THREE.Texture groundTexture = t; groundTexture.wrapS = THREE.WrapType.RepeatWrapping; groundTexture.wrapT = THREE.WrapType.RepeatWrapping; groundTexture.repeat.set(25, 25); groundTexture.anisotropy = 16; var groundMaterial = new THREE.MeshPhongMaterial(); groundMaterial.color = new THREE.Color().setHex(0xffffff); groundMaterial.specular = new THREE.Color().setHex(0x111111); groundMaterial.map = groundTexture; ; THREE.Mesh planeMesh = new THREE.Mesh(new THREE.PlaneBufferGeometry(20000, 20000), groundMaterial); planeMesh.position.y = -250; planeMesh.rotation.x = -Math.PI / 2; planeMesh.receiveShadow = true; scene.add(planeMesh); }
/// <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) { // 20140704 no balls shown? // broken? // view-source:http://www.mrdoob.com/lab/javascript/beachballs/ //Action Toggle = DiagnosticsConsole.ApplicationContent.BindKeyboardToDiagnosticsConsole(); var origin = new THREE.Vector3(0, 15, 0); var isMouseDown = false; var renderer = new THREE.WebGLRenderer( new { antialias = true, alpha = false }); renderer.setClearColor(new THREE.Color(0x101010)); renderer.domElement.AttachToDocument(); // scene var camera = new THREE.PerspectiveCamera( 40, Native.window.aspect, 1, 1000 ); camera.position.x = -30; camera.position.y = 10; camera.position.z = 30; camera.lookAt(new THREE.Vector3(0, 10, 0)); #region AtResize Action AtResize = delegate { camera.aspect = (double)Native.window.aspect; camera.updateProjectionMatrix(); renderer.setSize(Native.window.Width, Native.window.Height); }; Native.window.onresize += delegate { AtResize(); }; AtResize(); #endregion var scene = new THREE.Scene(); var light = new THREE.HemisphereLight(0xffffff, 0x606060, 1.2); light.position.set(-10, 10, 10); scene.add(light); { var geometry = new THREE.CubeGeometry(20, 20, 20); var material = new THREE.MeshBasicMaterial( new { wireframe = true, opacity = 0.1, transparent = true }); var mesh = new THREE.Mesh(geometry, material); mesh.position.y = 10; scene.add(mesh); } var intersectionPlane = new THREE.Mesh(new THREE.PlaneGeometry(20, 20, 8, 8)); intersectionPlane.position.y = 10; intersectionPlane.visible = false; scene.add(intersectionPlane); // geometry var ballGeometry = new THREE.Geometry(); var ballMaterial = new THREE.MeshPhongMaterial( new __MeshPhongMaterialDictionary { vertexColors = THREE.FaceColors, specular = 0x808080, shininess = 2000 } ); // var colors = new[] { new THREE.Color( 0xe52b30 ), new THREE.Color( 0xe52b30 ), new THREE.Color( 0x2e1b6a ), new THREE.Color( 0xdac461 ), new THREE.Color( 0xf07017 ), new THREE.Color( 0x38b394 ), new THREE.Color( 0xeaf1f7 ) }; var amount = colors.Length; var geometryTop = new THREE.SphereGeometry(1, 5 * amount, 2, 0, Math.PI * 2.0, 0, 0.30); for (var j = 0; j < geometryTop.faces.Length; j++) { geometryTop.faces[j].color = colors[0]; } THREE.GeometryUtils.merge(ballGeometry, geometryTop); var geometryBottom = new THREE.SphereGeometry(1, 5 * amount, 2, 0, Math.PI * 2, Math.PI - 0.30, 0.30); for (var j = 0; j < geometryBottom.faces.Length; j++) { geometryBottom.faces[j].color = colors[0]; } THREE.GeometryUtils.merge(ballGeometry, geometryBottom); { var sides = amount - 1; var size = (Math.PI * 2) / sides; for (var i = 0; i < sides; i++) { var patch = new THREE.SphereGeometry(1, 5, 10, i * size, size, 0.30, Math.PI - 0.60); for (var j = 0; j < patch.faces.Length; j++) { patch.faces[j].color = colors[i + 1]; } THREE.GeometryUtils.merge(ballGeometry, patch); } } // physics var world = new CANNON.World(); world.broadphase = new CANNON.NaiveBroadphase(); world.gravity.set(0, -15, 0); world.solver.iterations = 7; world.solver.tolerance = 0.1; var groundShape = new CANNON.Plane(); var groundMaterial = new CANNON.Material(); var groundBody = new CANNON.RigidBody(0, groundShape, groundMaterial); groundBody.quaternion.setFromAxisAngle(new CANNON.Vec3(1, 0, 0), -Math.PI / 2.0); world.add(groundBody); var planeShapeXmin = new CANNON.Plane(); var planeXmin = new CANNON.RigidBody(0, planeShapeXmin, groundMaterial); planeXmin.quaternion.setFromAxisAngle(new CANNON.Vec3(0, 1, 0), Math.PI / 2.0); planeXmin.position.set(-10, 0, 0); world.add(planeXmin); var planeShapeXmax = new CANNON.Plane(); var planeXmax = new CANNON.RigidBody(0, planeShapeXmax, groundMaterial); planeXmax.quaternion.setFromAxisAngle(new CANNON.Vec3(0, 1, 0), -Math.PI / 2.0); planeXmax.position.set(10, 0, 0); world.add(planeXmax); var planeShapeYmin = new CANNON.Plane(); var planeZmin = new CANNON.RigidBody(0, planeShapeYmin, groundMaterial); planeZmin.position.set(0, 0, -10); world.add(planeZmin); var planeShapeYmax = new CANNON.Plane(); var planeZmax = new CANNON.RigidBody(0, planeShapeYmax, groundMaterial); planeZmax.quaternion.setFromAxisAngle(new CANNON.Vec3(0, 1, 0), Math.PI); planeZmax.position.set(0, 0, 10); world.add(planeZmax); var ballBodyMaterial = new CANNON.Material(); world.addContactMaterial(new CANNON.ContactMaterial(groundMaterial, ballBodyMaterial, 0.2, 0.5)); world.addContactMaterial(new CANNON.ContactMaterial(ballBodyMaterial, ballBodyMaterial, 0.2, 0.8)); var spheres = new Queue<THREE.Mesh>(); var bodies = new Queue<CANNON.RigidBody>(); Func<double> random = new Random().NextDouble; #region addBall Action<double, double, double> addBall = (x, y, z) => { x = Math.Max(-10, Math.Min(10, x)); y = Math.Max(5, y); z = Math.Max(-10, Math.Min(10, z)); var size = 1.25; var sphere = new THREE.Mesh(ballGeometry, ballMaterial); sphere.scale.multiplyScalar(size); //sphere.useQuaternion = true; scene.add(sphere); spheres.Enqueue(sphere); var sphereShape = new CANNON.Sphere(size); var sphereBody = new CANNON.RigidBody(0.1, sphereShape, ballBodyMaterial); sphereBody.position.set(x, y, z); var q = new { a = random() * 3.0, b = random() * 3.0, c = random() * 3.0, d = random() * 3.0 }; Console.WriteLine("addBall " + new { x, y, z, q }); //sphereBody.quaternion.set(q.a, q.b, q.c, q.d); world.add(sphereBody); bodies.Enqueue(sphereBody); }; #endregion for (var i = 0; i < 100; i++) { addBall( random() * 10 - 5, random() * 20, random() * 10 - 5 ); } // var projector = new THREE.Projector(); var ray = new THREE.Raycaster(); var mouse3D = new THREE.Vector3(); Native.Document.body.ontouchstart += e => { e.preventDefault(); isMouseDown = true; }; Native.Document.body.ontouchmove += e => { e.preventDefault(); }; Native.Document.body.ontouchend += e => { e.preventDefault(); isMouseDown = false; }; #region onmousemove Native.document.body.onmousedown += e => { e.preventDefault(); isMouseDown = true; }; Native.document.body.onmouseup += e => { e.preventDefault(); isMouseDown = false; 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"); Native.Document.body.requestFullscreen(); Native.Document.body.requestPointerLock(); return; } }; Native.document.body.onmousemove += e => { mouse3D.set( ((double)e.CursorX / (double)Native.window.Width) * 2 - 1, -((double)e.CursorY / (double)Native.window.Height) * 2 + 1, 0.5 ); projector.unprojectVector(mouse3D, camera); ray.set(camera.position, mouse3D.sub(camera.position).normalize()); var intersects = ray.intersectObject(intersectionPlane); if (intersects.Length > 0) { origin.copy(intersects[0].point); } }; #endregion #region removeBall Action removeBall = delegate { scene.remove(spheres.Dequeue()); world.remove(bodies.Dequeue()); }; #endregion var sw0 = Stopwatch.StartNew(); var sw = Stopwatch.StartNew(); //var time = Native.window.performance.now(); //var lastTime = Native.window.performance.now(); #region animate Action render = delegate { var delta = sw.ElapsedMilliseconds; sw.Restart(); //time = Native.window.performance.now(); camera.position.x = -Math.Cos(sw.ElapsedMilliseconds * 0.0001) * 40; camera.position.z = Math.Sin(sw.ElapsedMilliseconds * 0.0001) * 40; camera.lookAt(new THREE.Vector3(0, 10, 0)); intersectionPlane.lookAt(camera.position); world.step(delta * 0.001); //lastTime = time; for (var i = 0; i < spheres.Count; i++) { var sphere = spheres.ElementAt(i); var body = bodies.ElementAt(i); sphere.position.copy(body.position); sphere.quaternion.copy(body.quaternion); } renderer.render(scene, camera); }; Native.window.onframe += delegate { if (isMouseDown) { if (spheres.Count > 200) { removeBall(); } addBall( origin.x + (random() * 4.0 - 2), origin.y + (random() * 4.0 - 2), origin.z + (random() * 4.0 - 2) ); } render(); }; #endregion }
// no animation no more? /// <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) { // 20150527 i see a red blob. broken? var sw = Stopwatch.StartNew(); // X:\jsc.svn\examples\javascript\synergy\webgl\WebGLMD2MorphtargetExample\WebGLMD2MorphtargetExample\Application.cs Console.WriteLine("before three"); // fails with gallery? why? //Action Toggle = DiagnosticsConsole.ApplicationContent.BindKeyboardToDiagnosticsConsole(); Console.WriteLine("InitializeContent"); // http://oos.moxiecode.com/js_webgl/md5_test/ var oldTime = 0L; var cameraTarget = new THREE.Vector3 { x = 0, y = 300, z = 0 }; var positionVector = new THREE.Vector3(); var lookVector = new THREE.Vector3(); var lastframe = 0; var scene = new THREE.Scene(); scene.fog = new THREE.Fog(0x000000, 1000, 5000); var camera = new THREE.PerspectiveCamera(50, Native.window.aspect, 1, 10000); camera.position.z = 800; camera.position.y = 100; camera.lookAt(scene.position); scene.add(camera); // floor var plane = new THREE.PlaneGeometry(10000, 10000, 50, 50); var floorMaterial = new THREE.MeshBasicMaterial(new { wireframe = true, color = 0x333333 }); var floor = new THREE.Mesh(plane, floorMaterial); floor.rotation.x = -Math.PI / 2; scene.add(floor); // renderer var renderer = new THREE.WebGLRenderer(new { antialias = true }); //renderer.setClearColorHex(0x000000); renderer.domElement.AttachToDocument(); // 0200001f WebGLBossHarvesterByOutsideOfSociety.Application +<> c__DisplayClass2 // script: error JSC1000: unsupported flow detected, try to simplify. //Assembly V:\WebGLBossHarvesterByOutsideOfSociety.Application.exe //DeclaringType WebGLBossHarvesterByOutsideOfSociety.Application +<> c__DisplayClass2, //OwnerMethod <.ctor > b__5 //Offset 005b // did the problem just dissapear? var controls = new THREE.OrbitControls(camera, renderer.domElement); #region harvester_md5mesh new THREE.JSONLoader().load( new WebGLBossHarvesterByOutsideOfSociety.Models.harvester_md5mesh().Content.src, (Action<dynamic>) (geometry => { Console.WriteLine("geometry ready!"); //console.log("Number of bones: "+geometry.bones.length); var material = new THREE.MeshBasicMaterial(new { color = 0xffffff, wireframe = true, opacity = 0.25, transparent = true, skinning = true }); object geometry_object = geometry; var skin = new THREE.SkinnedMesh(geometry_object, material); scene.add(skin); object geometry_animation = geometry.animation; //THREE.AnimationHandler.add(geometry_animation); //var animation = new THREE.Animation(skin, "walk1"); //animation.play(); skin.rotation.x = -Math.PI / 2; skin.rotation.z = -Math.PI / 2; // view-source:http://threejs.org/examples/webgl_animation_skinning_morph.html var boneArray = new Dictionary<int, THREE.Mesh>(); var boneContainer = new THREE.Object3D(); boneContainer.rotation.x = -Math.PI / 2; boneContainer.rotation.z = -Math.PI / 2; scene.add(boneContainer); var index = 0; var pmaterial = new THREE.MeshPhongMaterial(new { color = 0xff0000 }); //for (var b = 1; b != skin.bones.Length; b++) //{ // var bone = skin.bones[b]; // var nc = bone.children.Length; // for (var c = 0; c != nc; c++) // { // var child = bone.children[c]; // var size = Math.Min(child.position.length() * 0.05, 8); // var cylinder = new THREE.CylinderGeometry(size, 0.1, child.position.length(), 6); // // ERROR: Matrix's .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order. Please update your code. // cylinder.applyMatrix( // new THREE.Matrix4().makeRotationFromEuler( // new THREE.Euler(Math.PI / 2, 0, 0) // ) // ); // cylinder.applyMatrix(new THREE.Matrix4().setPosition(new THREE.Vector3(0, 0, 0.5 * child.position.length()))); // var mesh = new THREE.Mesh(cylinder, pmaterial); // boneArray[child.id] = mesh; // boneContainer.add(mesh); // } //} #region render Native.window.onframe += delegate { Func<long> Date_now = () => (long)new IFunction("return Date.now();").apply(null); var time = Date_now(); double delta = time - oldTime; if (oldTime == 0) { delta = 1000 / 60.0; } oldTime = time; THREE.AnimationHandler.update(delta / 1000.0); // does not exist? //for (var b = 1; b != skin.bones.Length; b++) //{ // var bone = skin.bones[b]; // var nc = bone.children.Length; // for (var c = 0; c != nc; c++) // { // var child = bone.children[c]; // var child_bone = (THREE.Bone)(object)child; // var id = child.id; // var mesh = boneArray[id]; // positionVector.getPositionFromMatrix(child_bone.skinMatrix); // mesh.position.copy(positionVector); // var child_parent_bone = (THREE.Bone)(object)child.parent; // lookVector.getPositionFromMatrix(child_parent_bone.skinMatrix); // mesh.lookAt(lookVector); // } //} boneContainer.position.z = skin.position.z; //var frame = (int)Math.Floor(animation.currentTime * 24.0); var frame = (int)Math.Floor(sw.ElapsedMilliseconds * 24.0); if (frame >= 0 && lastframe > frame) { skin.position.z += 304.799987793; // got that from the root bone, total movement of one walk cycle } lastframe = frame; var speed = delta * 0.131; cameraTarget.z += speed; if (skin.position.z > floor.position.z + 1000.0) { floor.position.z += 1000.0; }; //camera.position.x = 800.0 * Math.Sin(time / 3000.0); //camera.position.z = cameraTarget.z + 800.0 * Math.Cos(time / 3000.0); //camera.lookAt(cameraTarget); controls.update(); camera.position = controls.center.clone(); renderer.render(scene, camera); }; #endregion } ) ); #endregion //var harvester_src = new WebGLBossHarvesterByOutsideOfSociety.Models.harvester().Content.src; //Console.WriteLine("before harvester " + new { harvester_src }); //loader.load(harvester_src, harvesterLoaded); // lights var pointLight = new THREE.PointLight(0xffffff, 1.0, 0); pointLight.AttachTo(camera); #region AtResize 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 Console.WriteLine("renderer ready!"); //#region onmousedown //Native.document.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"); // //Native.document.body.requestFullscreen(); // Native.document.body.requestPointerLock(); // return; // } // }; //#endregion #region ZeProperties var ze = new ZeProperties(); ze.Show(); ze.treeView1.Nodes.Clear(); ze.Add(() => renderer); ze.Add(() => controls); ze.Add(() => scene); ze.Left = 0; #endregion }