예제 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="control"></param>
        public override void Load(Control control)
        {
            base.Load(control);

            camera = new PerspectiveCamera(75, control.Width / (float)control.Height, 1, 1100);

            controls = new DeviceOrientationControls(camera);

            scene = new Scene();

            geometry = new SphereGeometry(500, 16, 8);
            geometry.ApplyMatrix(new Matrix4().MakeScale(-1, 1, 1));

            var material = new MeshBasicMaterial()
            {
                Map = ImageUtils.LoadTexture(@"examples\textures/2294472375_24a3b8ef46_o.jpg")
            };

            mesh = new Mesh(geometry, material);
            scene.Add(mesh);

            var geometry2 = new BoxGeometry(100, 100, 100, 4, 4, 4);
            var material2 = new MeshBasicMaterial()
            {
                Color = Color.Purple, Side = Three.BackSide, Wireframe = true
            };
            var mesh2 = new Mesh(geometry2, material2);

            scene.Add(mesh2);

            controls.Connect();
        }
예제 #2
0
        public void init()
        {
            renderer = new OpenGLRenderer();

            renderer.setSize(width, height);

            camera            = new PerspectiveCamera((float)(System.Math.PI / 180.0f) * 70.0f, width / (float)height, 1.0f, 100.0f);
            camera.position.Z = 400.0f;

            scene = new Scene();

            CubeGeometry geometry = new CubeGeometry(200, 200, 200);


            Texture texture = (new ImageUtils()).loadTexture("textures/crate.gif");

            texture.anisotropy = renderer.getMaxAnisotropy();


            MeshBasicMaterial material = new MeshBasicMaterial(texture);

            mesh = new Mesh(geometry, material);
            scene.add(mesh);

            renderer.render(scene, camera);
        }
예제 #3
0
 private PointLightHelper(PointLight light, Geometry geometry, MeshBasicMaterial material)
     : base(geometry, material)
 {
     this.light = light;
     light.UpdateMatrixWorld();
     matrixWorld      = light.matrixWorld;
     matrixAutoUpdate = false;
 }
예제 #4
0
        public static PointLightHelper Create(Renderer renderer, PointLight light)
        {
            var geometry = new SphereGeometry(0.25f, 4, 3);
            var material = new MeshBasicMaterial(renderer)
            {
                UseWireframe = true,
                UseFog       = false,
                Diffuse      = light.Color.Multiply(light.Intensity)
            };
            var helper = new PointLightHelper(light, geometry, material);

            return(helper);
        }
예제 #5
0
        // a helper to show the world-axis-aligned bounding box for an object
        public static BoundingBoxHelper Create(Renderer renderer, Object3D o, Color?color = null)
        {
            var c   = color.HasValue ? color.Value : new Color(0x888888);
            var geo = new BoxGeometry(1, 1, 1);
            var mat = new MeshBasicMaterial(renderer)
            {
                Diffuse      = c,
                UseWireframe = true
            };
            var boundingBoxHelper = new BoundingBoxHelper(geo, mat);

            boundingBoxHelper.o   = o;
            boundingBoxHelper.box = Box3.Empty;
            return(boundingBoxHelper);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="control"></param>
        public override void Load(Control control)
        {
            base.Load(control);

            this.camera = new PerspectiveCamera(75, control.Width / (float)control.Height, 1, 1100);
            this.target = new Vector3(0, 0, 0);

            this.scene = new Scene();

            var geometry = new SphereGeometry(500, 60, 40);

            geometry.ApplyMatrix(new Matrix4().MakeScale(-1, 1, 1));

            var material = new MeshBasicMaterial {
                Map = ImageUtils.LoadTexture(@"examples/textures/2294472375_24a3b8ef46_o.jpg")
            };

            this.mesh = new Mesh(geometry, material);

            this.scene.Add(mesh);
        }
예제 #7
0
        public override void Render()
        {
            var widthSegments = (int)(Mat.Random() * 64);

            if (widthSegments <= 0)
            {
                widthSegments = 1;
            }
            var heightSegments = (int)(Mat.Random() * 32);

            if (heightSegments <= 0)
            {
                heightSegments = 1;
            }

            var geometry = new SphereGeometry(50, widthSegments, heightSegments);

            var texture = ImageUtils.LoadTexture(@"examples/textures/crate.gif");

            texture.NeedsUpdate = true;

            var material = new MeshBasicMaterial()
            {
                Map = texture, Wireframe = true
            };

            var mesh = new Mesh(geometry, material);

            scene.Add(mesh);

            renderer.Render(scene, camera);

            scene.Remove(mesh);

            // clean up

            geometry.Dispose();
            material.Dispose();
            texture.Dispose();
        }
예제 #8
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="control"></param>
        public override void Load(Control control)
        {
            base.Load(control);

            camera          = new PerspectiveCamera(60, control.Width / (float)control.Height, 1, 1000);
            camera.Position = new Vector3(0, 75, 100);

            scene = new Scene();

            var geometry = new PlaneGeometry(100, 100);

            var texture = new Texture(generateTexture());

            texture.NeedsUpdate = true;

            for (var i = 0; i < 15; i++)
            {
                var material = new MeshBasicMaterial()
                {
                    Color       = new HSLColor(0.3f, 0.75f, (i / 15.0f) * 0.4f + 0.1f),
                    Map         = texture,
                    DepthTest   = false,
                    DepthWrite  = false,
                    Transparent = true
                };

                mesh = new Mesh(geometry, material);

                mesh.Position.Y = i * 0.25f;
                mesh.Rotation.X = -(float)Math.PI / 2;

                scene.Add(mesh);
            }

            scene.Children.Reverse();

            renderer.SortObjects = false;
            renderer.SetClearColor((Color)colorConvertor.ConvertFromString("#003300"));
        }
예제 #9
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="control"></param>
        public override void Load(Control control)
        {
            base.Load(control);

            this.camera            = new PerspectiveCamera(70, control.Width / (float)control.Height, 1, 1000);
            this.camera.Position.Z = 400;

            this.scene = new Scene();

            var geometry = new BoxGeometry(200, 200, 200);

            var texture = ImageUtils.LoadTexture(@"examples/textures/crate.gif");

            texture.Anisotropy = this.renderer.MaxAnisotropy;

            var material = new MeshBasicMaterial {
                Map = texture
            };

            this.mesh = new Mesh(geometry, material);
            this.scene.Add(mesh);
        }
예제 #10
0
        private static void ParseMaterials(string fileName)
        {
            MeshBasicMaterial currentMaterial = null;
            var path  = Path.GetDirectoryName(fileName);
            var lines = File.ReadAllLines(fileName);

            foreach (var line in lines)
            {
                if (line.Length == 0 || line.StartsWith("#"))
                {
                    continue;
                }

                var parts = line.Trim().Split(' ');

                if (parts[0] == "newmtl")
                {
                    currentMaterial = new MeshPhongMaterial(renderer)
                    {
                        Name = parts[1].Trim()
                    };
                    materials.Add(currentMaterial.Name, currentMaterial);
                }
                else if (parts[0] == "Ns")
                {
                    var phong = currentMaterial as MeshPhongMaterial;
                    if (phong != null)
                    {
                        var hardness = Convert.ToSingle(parts[1]);
                        phong.Hardness = hardness;
                    }
                }
                else if (parts[0] == "Ni")
                {
                }
                else if (parts[0] == "Ka")
                {
                    var lambert = currentMaterial as MeshLambertMaterial;
                    if (lambert != null)
                    {
                        var r = Convert.ToSingle(parts[1]);
                        var g = Convert.ToSingle(parts[2]);
                        var b = Convert.ToSingle(parts[3]);
                        lambert.Ambient = new Color(r, g, b);
                    }
                }
                else if (parts[0] == "Kd")
                {
                    var r = Convert.ToSingle(parts[1]);
                    var g = Convert.ToSingle(parts[2]);
                    var b = Convert.ToSingle(parts[3]);
                    currentMaterial.Diffuse = new Color(r, g, b);
                }
                else if (parts[0] == "map_Kd")
                {
                    var fullPath = Path.Combine(path, parts[1].Trim());
                    currentMaterial.DiffuseMap = new Texture(fullPath);
                }
                else if (parts[0] == "Ks")
                {
                    var phong = currentMaterial as MeshPhongMaterial;
                    if (phong != null)
                    {
                        var r = Convert.ToSingle(parts[1]);
                        var g = Convert.ToSingle(parts[2]);
                        var b = Convert.ToSingle(parts[3]);
                        phong.Specular = new Color(r, g, b);
                    }
                }
                else if (parts[0] == "d")
                {
                }
                else if (parts[0] == "illum")
                {
                }
                else
                {
                    throw new NotSupportedException();
                }
            }
        }
예제 #11
0
 private BoundingBoxHelper(Geometry geometry, MeshBasicMaterial material)
     : base(geometry, material)
 {
 }
예제 #12
0
 public SkinnedMesh(Geometry geometry, MeshBasicMaterial material, bool useVertexTexture) : base(geometry, material)
 {
 }
예제 #13
0
        private static Mesh CreateCube(Renderer renderer, Scene scene, string texturesPath, MeshBasicMaterial material)
        {
            var cube = new Mesh(new SphereGeometry(1, 50, 50), material);

            return(cube);
        }
예제 #14
0
        private MeshBasicMaterial CreateMaterial(Renderer renderer, JToken materialJson, string texturePath = null)
        {
            dynamic material = new MeshLambertMaterial(renderer);

            var shadingData = materialJson["shading"];

            if (shadingData != null)
            {
                var shading = shadingData.Value <string>().ToLower();
                if (shading == "phong")
                {
                    throw new NotImplementedException();
                }
                else if (shading == "basic")
                {
                    material = new MeshBasicMaterial(renderer);
                }
            }

            material.DiffuseColor = new Color(0xeeeeee);
            //material.Opacity = 1;
            material.UseWireframe = false;

            var blendingData = materialJson["blending"];

            if (blendingData != null)
            {
                BlendMode mode;
                switch (blendingData.Value <string>())
                {
                case "NormalBlending": mode = BlendMode.Normal; break;

                default: throw new NotSupportedException();
                }
                material.Blending = mode;
            }

            var transparentData = materialJson["transparent"];

            if (transparentData != null)
            {
                material.IsTransparent = transparentData.Value <bool>();
            }

            var depthTestData = materialJson["depthTest"];

            if (depthTestData != null)
            {
                material.ShouldDepthTest = depthTestData.Value <bool>();
            }

            var depthWriteData = materialJson["depthWrite"];

            if (depthWriteData != null)
            {
                material.ShouldDepthWrite = depthWriteData.Value <bool>();
            }

            var isVisibleData = materialJson["visible"];

            if (isVisibleData != null)
            {
                material.isVisible = isVisibleData.Value <bool>();
            }

            var isFlipSidedData = materialJson["flipSided"];

            if (isFlipSidedData != null)
            {
                material.side = SideMode.Back;
            }

            var isDoubleSidedData = materialJson["doubleSided"];

            if (isFlipSidedData != null)
            {
                material.side = SideMode.Double;
            }

            var useWireframeData = materialJson["wireframe"];

            if (useWireframeData != null)
            {
                material.useWireframe = useWireframeData.Value <bool>();
            }

            var vertexColorsData = materialJson["vertexColors"];

            if (vertexColorsData != null)
            {
                if (vertexColorsData.Value <string>() == "face")
                {
                    material.VertexColors = VertexColorMode.Face;
                }
                else
                {
                    material.VertexColors = VertexColorMode.Vertex;
                }
            }

            #region colors

            var colorDiffuseData = materialJson["colorDiffuse"];
            if (colorDiffuseData != null)
            {
                var rgb = colorDiffuseData.Values <float>().ToArray();
                material.DiffuseColor = new Color(rgb[0], rgb[1], rgb[2]);
            }
            else
            {
                var debugColorData = materialJson["DbgColor"];
                if (debugColorData != null)
                {
                    material.DiffuseColor = new Color(debugColorData.Value <uint>());
                }
            }

            var colorSpecularData = materialJson["colorSpecular"];
            if (material is MeshPhongMaterial && colorSpecularData != null)
            {
                var rgb = colorSpecularData.Values <float>().ToArray();
                material.Specular = new Color(rgb[0], rgb[1], rgb[2]);
            }

            var ambientData = materialJson["colorAmbient"];
            if (ambientData != null)
            {
                var rgb = ambientData.Values <float>().ToArray();
                material.Ambient = new Color(rgb[0], rgb[1], rgb[2]);
            }

            var emissiveData = materialJson["colorEmissive"];
            if (emissiveData != null)
            {
                var rgb = emissiveData.Values <float>().ToArray();
                material.Emissive = new Color(rgb[0], rgb[1], rgb[2]);
            }
            #endregion

            #region modifiers
            // TODO is opactiy needed?
            //if (transparentData != null)
            //{
            //    material.opacity = transparentData.Value<float>();
            //}

            var shininessData = materialJson["shininess"];
            if (shininessData != null)
            {
                material.shininess = shininessData.Value <float>();
            }
            #endregion

            #region textures
            var mapDiffuseData = materialJson["mapDiffuse"];
            if (mapDiffuseData != null && texturePath != null)
            {
                var      d        = materialJson["mapDiffuse"].Value <string>();
                var      r        = materialJson["mapDiffuseRepeat"];
                var      o        = materialJson["mapDiffuseOffset"];
                var      wrapData = materialJson["mapDiffuseWrap"];
                WrapMode wrapS;
                switch (wrapData[0].Value <string>())
                {
                case "repeat": wrapS = WrapMode.Repeat; break;

                default: throw new NotSupportedException();
                }
                WrapMode wrapT;
                switch (wrapData[1].Value <string>())
                {
                case "repeat": wrapT = WrapMode.Repeat; break;

                default: throw new NotSupportedException();
                }

                var a = materialJson["mapDiffuseAnisotropy"];
                CreateTexture(texturePath, materialJson, "map", d, null, null, wrapS, wrapT, null);
            }

            var mapLightData = materialJson["mapLight"];
            if (mapLightData != null && texturePath != null)
            {
                var d = materialJson["mapLight"];
                var r = materialJson["mapLightRepeat"];
                var o = materialJson["mapLightOffset"];
                var w = materialJson["mapLightWrap"];
                var a = materialJson["mapLightAnisotropy"];
                throw new NotImplementedException();//CreateTexture( mpars, "lightMap", d,r, o, w, a);
            }


            var mapBumpData = materialJson["mapBump"];
            if (mapBumpData != null && texturePath != null)
            {
                var d = materialJson["mapBump"];
                var r = materialJson["mapBumpRepeat"];
                var o = materialJson["mapBumpOffset"];
                var w = materialJson["mapBumpWrap"];
                var a = materialJson["mapBumpAnisotropy"];
                throw new NotImplementedException();//CreateTexture( mpars, "bumpMap", d,r, o, w, a);
            }

            var mapNormalData = materialJson["mapNormal"];
            if (mapNormalData != null && texturePath != null)
            {
                var d = materialJson["mapNormal"];
                var r = materialJson["mapNormalRepeat"];
                var o = materialJson["mapNormalOffset"];
                var w = materialJson["mapNormalWrap"];
                var a = materialJson["mapNormalAnisotropy"];
                throw new NotImplementedException();//CreateTexture( mpars, "normalMap", d,r, o, w, a);
            }

            var mapSpecularData = materialJson["mapSpecular"];
            if (mapSpecularData != null && texturePath != null)
            {
                var d = materialJson["mapSpecular"];
                var r = materialJson["mapSpecularRepeat"];
                var o = materialJson["mapSpecularOffset"];
                var w = materialJson["mapSpecularWrap"];
                var a = materialJson["mapSpecularAnisotropy"];
                throw new NotImplementedException();//CreateTexture( mpars, "specularMap", d,r, o, w, a);
            }

            var mapAlphaData = materialJson["mapAlpha"];
            if (mapAlphaData != null && texturePath != null)
            {
                var d = materialJson["mapAlpha"];
                var r = materialJson["mapAlphaRepeat"];
                var o = materialJson["mapAlphaOffset"];
                var w = materialJson["mapAlphaWrap"];
                var a = materialJson["mapAlphaAnisotropy"];
                throw new NotImplementedException();//CreateTexture( mpars, "alphaMap", d,r, o, w, a);
            }
            #endregion

            var mapBumpScaleData = materialJson["mapBumpScale"];
            if (mapBumpScaleData != null)
            {
                material.bumpScale = mapBumpScaleData.Value <float>();
            }

            if (mapNormalData != null)
            {
                throw new NotImplementedException();
            }

            return(material);
        }
예제 #15
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="control"></param>
        public override void Load(Control control)
        {
            base.Load(control);

            camera = new PerspectiveCamera(70, control.Width / (float)control.Height, 1, 10000);

            scene = new Scene();

            var sphereGeometry = new SphereGeometry(5);
            var material       = new MeshBasicMaterial()
            {
                Color = Color.Red
            };

            sphereInter         = new Mesh(sphereGeometry, material);
            sphereInter.Visible = false;
            scene.Add(sphereInter);

            var geometry = new Geometry();

            var point     = new Vector3();
            var direction = new Vector3();

            for (var i = 0; i < 100; i++)
            {
                direction.X += Mat.Random() - 0.5f;
                direction.Y += Mat.Random() - 0.5f;
                direction.Z += Mat.Random() - 0.5f;
                direction.Normalize().MultiplyScalar(5);

                point.Add(direction);

                geometry.Vertices.Add((Vector3)point.Clone());
            }

            parentTransform            = new Object3D();
            parentTransform.Position.X = Mat.Random() * 40 - 20;
            parentTransform.Position.Y = Mat.Random() * 40 - 20;
            parentTransform.Position.Z = Mat.Random() * 40 - 20;

            parentTransform.Rotation.X = Mat.Random() * 2 * (float)Math.PI;
            parentTransform.Rotation.Y = Mat.Random() * 2 * (float)Math.PI;
            parentTransform.Rotation.Z = Mat.Random() * 2 * (float)Math.PI;

            parentTransform.Scale.X = Mat.Random() + 0.5f;
            parentTransform.Scale.Y = Mat.Random() + 0.5f;
            parentTransform.Scale.Z = Mat.Random() + 0.5f;

            for (var i = 0; i < 50; i++)
            {
                var type     = Mat.Random() > 0.5f ? Three.LineStrip : Three.LinePieces;
                var object3D = new Line(geometry, new LineBasicMaterial()
                {
                    Color = new Color().Random()
                }, type);

                object3D.Position.X = Mat.Random() * 400 - 200;
                object3D.Position.Y = Mat.Random() * 400 - 200;
                object3D.Position.Z = Mat.Random() * 400 - 200;

                object3D.Rotation.X = Mat.Random() * 2 * (float)Math.PI;
                object3D.Rotation.Y = Mat.Random() * 2 * (float)Math.PI;
                object3D.Rotation.Z = Mat.Random() * 2 * (float)Math.PI;

                object3D.Scale.X = Mat.Random() + 0.5f;
                object3D.Scale.Y = Mat.Random() + 0.5f;
                object3D.Scale.Z = Mat.Random() + 0.5f;

                parentTransform.Add(object3D);
            }

            scene.Add(parentTransform);

            raycaster = new Raycaster();
            raycaster.LinePrecision = 3;

            renderer.SetClearColor((Color)colorConvertor.ConvertFromString("#f0f0f0"));
        }
예제 #16
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="control"></param>
        public override void Load(Control control)
        {
            base.Load(control);

            this.camera            = new PerspectiveCamera(50, control.Width / (float)control.Height, 1, 2000);
            this.camera.Position.Z = 1000;

            this.scene = new Scene();

            this.geometry = new BoxGeometry(200, 200, 200);

            /*
             * This is how compressed textures are supposed to be used:
             *
             * DXT1 - RGB - opaque textures
             * DXT3 - RGBA - transparent textures with sharp alpha transitions
             * DXT5 - RGBA - transparent textures with full alpha range
             */

            var loader = new DDSLoader();

            loader.Loaded += (o, args) =>
            {
            };

            var map1 = loader.Load("examples/textures/compressed/disturb_dxt1_nomip.dds");

            map1.MinFilter  = map1.MagFilter = Three.LinearFilter;
            map1.Anisotropy = 4;

            var map2 = loader.Load("examples/textures/compressed/disturb_dxt1_mip.dds");

            map2.Anisotropy = 4;

            var map3 = loader.Load("examples/textures/compressed/hepatica_dxt3_mip.dds");

            map3.Anisotropy = 4;

            var map4 = loader.Load("examples/textures/compressed/explosion_dxt5_mip.dds");

            map4.Anisotropy = 4;

            var map5 = loader.Load("examples/textures/compressed/disturb_argb_nomip.dds");

            map5.MinFilter  = map5.MagFilter = Three.LinearFilter;
            map5.Anisotropy = 4;

            var map6 = loader.Load("examples/textures/compressed/disturb_argb_mip.dds");

            map6.Anisotropy = 4;

            var cubemap1 = loader.Load("examples/textures/compressed/Mountains.dds", texture => {
                texture.MagFilter = Three.LinearFilter;
                texture.MinFilter = Three.LinearFilter;
                texture.Mapping   = new Three.CubeReflectionMapping();
                //    material1.needsUpdate = true;
            });

            var cubemap2 = loader.Load("examples/textures/compressed/Mountains_argb_mip.dds", texture => {
                texture.MagFilter = Three.LinearFilter;
                texture.MinFilter = Three.LinearFilter;
                texture.Mapping   = new Three.CubeReflectionMapping();
                //    material5.needsUpdate = true;
            });

            var cubemap3 = loader.Load("examples/textures/compressed/Mountains_argb_nomip.dds", texture => {
                texture.MagFilter = Three.LinearFilter;
                texture.MinFilter = Three.LinearFilter;
                texture.Mapping   = new Three.CubeReflectionMapping();
                //    material6.needsUpdate = true;
            });

            var material1 = new MeshBasicMaterial()
            {
                Map = map1, EnvMap = cubemap1
            };
            var material2 = new MeshBasicMaterial()
            {
                Map = map2
            };
            var material3 = new MeshBasicMaterial()
            {
                Map = map3, AlphaTest = 0.5f, Side = Three.DoubleSide
            };
            var material4 = new MeshBasicMaterial()
            {
                Map = map4, Side = Three.DoubleSide, Blending = Three.AdditiveBlending, DepthTest = false, Transparent = true
            };
            var material5 = new MeshBasicMaterial()
            {
                EnvMap = cubemap2
            };
            var material6 = new MeshBasicMaterial()
            {
                EnvMap = cubemap3
            };
            var material7 = new MeshBasicMaterial()
            {
                Map = map5
            };
            var material8 = new MeshBasicMaterial()
            {
                Map = map6
            };

            // After loading setting

            material1.NeedsUpdate = true;
            material5.NeedsUpdate = true;
            material6.NeedsUpdate = true;



            // Testing purposes

            var texture1 = ImageUtils.LoadTexture(@"examples/textures/crate.gif");

            texture1.Anisotropy = this.renderer.MaxAnisotropy;

            var material = new MeshBasicMaterial {
                Map = texture1
            };


            // TODO NOTE EnvMap is not working properly


            // . . . .
            // X . . .

            var mesh = new Mesh(new TorusGeometry(100, 50, 32, 16), material1); // material1

            mesh.Position.X = -600;
            mesh.Position.Y = -200;
            this.scene.Add(mesh);
            this.meshes.Add(mesh);

            // . . . .
            // . X . .

            mesh            = new Mesh(this.geometry, material2); // material2
            mesh.Position.X = -200;
            mesh.Position.Y = -200;
            this.scene.Add(mesh);
            this.meshes.Add(mesh);

            // . X . .
            // . . . .

            mesh            = new Mesh(this.geometry, material3); // material3
            mesh.Position.X = -200;
            mesh.Position.Y = 200;
            this.scene.Add(mesh);
            this.meshes.Add(mesh);

            // X . . .
            // . . . .

            mesh            = new Mesh(this.geometry, material4); // material4
            mesh.Position.X = -600;
            mesh.Position.Y = 200;
            this.scene.Add(mesh);
            this.meshes.Add(mesh);

            // . . X .
            // . . . .

            mesh            = new Mesh(new BoxGeometry(200, 200, 200), material5); // material5
            mesh.Position.X = 200;
            mesh.Position.Y = 200;
            this.scene.Add(mesh);
            this.meshes.Add(mesh);

            // . . . .
            // . . X .

            mesh            = new Mesh(new BoxGeometry(200, 200, 200), material6); // material6
            mesh.Position.X = 200;
            mesh.Position.Y = -200;
            this.scene.Add(mesh);
            this.meshes.Add(mesh);

            // . . . .
            // . . . X

            mesh            = new Mesh(this.geometry, material7); // material7
            mesh.Position.X = 600;
            mesh.Position.Y = -200;
            this.scene.Add(mesh);
            this.meshes.Add(mesh);

            // . . . X
            // . . . .

            mesh            = new Mesh(this.geometry, material8); // material8
            mesh.Position.X = 600;
            mesh.Position.Y = 200;
            this.scene.Add(mesh);
            this.meshes.Add(mesh);
        }
예제 #17
0
        public static Object3D Parse(Renderer renderer, string path, Action <string> mtllibCallback = null)
        {
            ObjMtlLoader.renderer = renderer;

            var text = File.ReadAllText(path);

            var vector = new Func <string, string, string, Vector3>((x, y, z) =>
            {
                var vx = Convert.ToSingle(x);
                var vy = Convert.ToSingle(y);
                var vz = Convert.ToSingle(z);
                return(new Vector3(vx, vy, vz));
            });

            var uv = new Func <string, string, Vector2>((u, v) =>
            {
                var vu = Convert.ToSingle(u);
                var vv = Convert.ToSingle(v);
                return(new Vector2(vu, vv));
            });

            var parseVertexIndex = new Func <string, int>((indexString) =>
            {
                var index = Convert.ToInt32(indexString);
                return(index >= 0 ? index - 1 : index + vertexIndicies.Count);
            });

            var parseNormalIndex = new Func <string, int>((indexString) =>
            {
                var index = Convert.ToInt32(indexString);
                return(index >= 0 ? index - 1 : index + normals.Count);
            });

            var parseUVIndex = new Func <string, int>((indexString) =>
            {
                var index = Convert.ToInt32(indexString);
                return(index >= 0 ? index - 1 : index + uvs2.Count);
            });

            var add_face = new Action <string, string, string, List <string> >((a, b, c, normals_inds) =>
            {
                if (normals_inds == null)
                {
                    geometry.faces.Add(new Face3(
                                           vertexIndicies[parseVertexIndex(a)] - 1,
                                           vertexIndicies[parseVertexIndex(b)] - 1,
                                           vertexIndicies[parseVertexIndex(c)] - 1
                                           ));
                }
                else
                {
                    geometry.faces.Add(new Face3(
                                           vertexIndicies[parseVertexIndex(a)] - 1,
                                           vertexIndicies[parseVertexIndex(b)] - 1,
                                           vertexIndicies[parseVertexIndex(c)] - 1,
                                           normals[parseNormalIndex(normals_inds[0])],
                                           normals[parseNormalIndex(normals_inds[1])],
                                           normals[parseNormalIndex(normals_inds[2])]));
                }
            });

            var add_uvs = new Action <string, string, string>((a, b, c) =>
            {
                geometry.faceVertexUvs[0].Add(new UVFaceSet(uvs2[parseUVIndex(a)], uvs2[parseUVIndex(b)], uvs2[parseUVIndex(c)]));
            });

            var handle_face_line = new Action <List <string>, List <string>, List <string> >((faces, uvs, normals_inds) =>
            {
                if (faces.Count == 3)
                {
                    add_face(faces[0], faces[1], faces[2], normals_inds);

                    if (uvs != null && uvs.Count > 0)
                    {
                        add_uvs(uvs[0], uvs[1], uvs[2]);
                    }
                }
                else
                {
                    if (normals_inds != null && normals_inds.Count > 0)
                    {
                        add_face(faces[0], faces[1], faces[3], new List <string>()
                        {
                            normals_inds[0], normals_inds[1], normals_inds[3]
                        });
                        add_face(faces[1], faces[2], faces[3], new List <string>()
                        {
                            normals_inds[1], normals_inds[2], normals_inds[3]
                        });
                    }
                    else
                    {
                        add_face(faces[0], faces[1], faces[3], null);
                        add_face(faces[1], faces[2], faces[3], null);
                    }

                    if (uvs != null && uvs.Count > 0)
                    {
                        add_uvs(uvs[0], uvs[1], uvs[3]);
                        add_uvs(uvs[1], uvs[2], uvs[3]);
                    }
                }
            });

            var o = new Object3D();

            var lines = text.Split('\n');

            // create mesh if no objects in text
            if (lines.Where(l => l.StartsWith("o")).Count() == 0)
            {
                geometry = new Geometry();
                material = new MeshBasicMaterial(renderer);
                mesh     = new Mesh(geometry, material);
                o.Add(mesh);
            }

            vertexIndicies = new List <int>();
            normals        = new List <Vector3>();
            uvs2           = new List <Vector2>();

            // fixes

            //text = text.Replace("\r\n",string.Empty); // handles line continuations \
            foreach (var l in lines)
            {
                if (l.Length == 0 || l[0] == '#')
                {
                    continue;
                }

                var line   = l.Trim();
                var result = line.Split(' ', '/');

                if (vertex_pattern.IsMatch(line))
                {
                    // ["v 1.0 2.0 3.0", "1.0", "2.0", "3.0"]
                    geometry.vertices.Add(
                        vector(
                            result[1], result[2], result[3]
                            )
                        );
                    vertexIndicies.Add(geometry.vertices.Count);
                }

                else if (normal_pattern.IsMatch(line))
                {
                    // ["vn 1.0 2.0 3.0", "1.0", "2.0", "3.0"]
                    normals.Add(vector(result[1], result[2], result[3]));
                }
                else if (uv_pattern.IsMatch(line))
                {
                    // ["vt 0.1 0.2", "0.1", "0.2"]
                    uvs2.Add(
                        uv(
                            result[1], result[2]
                            )
                        );
                }
                else if (face_pattern1.IsMatch(line))
                {
                    // ["f 1 2 3", "1", "2", "3", undefined]WDEAADEAWAAAADD
                    if (result.Length == 4)
                    {
                        handle_face_line(new List <string>()
                        {
                            result[1], result[2], result[3]
                        }, null, null);
                    }
                    else
                    {
                        handle_face_line(new List <string>()
                        {
                            result[1], result[2], result[3], result[4]
                        }, null, null);
                    }
                }
                else if (face_pattern2.IsMatch(line))
                {
                    // ["f 1/1 2/2 3/3", " 1/1", "1", "1", " 2/2", "2", "2", " 3/3", "3", "3", undefined, undefined, undefined]
                    if (result.Length == 7)
                    {
                        handle_face_line(
                            new List <string>()
                        {
                            result[1], result[3], result[5]
                        },                                                          //faces
                            new List <string>()
                        {
                            result[2], result[4], result[6]
                        },                                                          //uv
                            null
                            );
                    }
                    else
                    {
                        handle_face_line(
                            new List <string>()
                        {
                            result[1], result[3], result[5], result[7]
                        },                                                                     //faces
                            new List <string>()
                        {
                            result[2], result[4], result[6], result[8]
                        },                                                                     //uv
                            null
                            );
                    }
                }
                else if (face_pattern3.IsMatch(line))
                {
                    if (result.Length == 10)
                    {
                        handle_face_line(
                            new List <string>()
                        {
                            result[1], result[4], result[7],
                        },                                                          //faces
                            new List <string>()
                        {
                            result[2], result[5], result[8],
                        },                                                          //uv
                            new List <string>()
                        {
                            result[3], result[6], result[9],
                        }                                                          //normal
                            );
                    }
                    else
                    {
                        // ["f 1/1/1 2/2/2 3/3/3", " 1/1/1", "1", "1", "1", " 2/2/2", "2", "2", "2", " 3/3/3", "3", "3", "3", undefined, undefined, undefined, undefined]
                        handle_face_line(
                            new List <string>()
                        {
                            result[1], result[4], result[7], result[10]
                        },                                                                      //faces
                            new List <string>()
                        {
                            result[2], result[5], result[8], result[11]
                        },                                                                      //uv
                            new List <string>()
                        {
                            result[3], result[6], result[9], result[12]
                        }                                                                      //normal
                            );
                    }
                }
                else if (face_pattern4.IsMatch(line))
                {
                    if (result.Length == 10)
                    {
                        // ["f 1//1 2//2 3//3", " 1//1", "1", "1", " 2//2", "2", "2", " 3//3", "3", "3", undefined, undefined, undefined]
                        handle_face_line(
                            new List <string>()
                        {
                            result[1], result[4], result[7]
                        },        //faces
                            null, //uv
                            new List <string>()
                        {
                            result[3], result[6], result[9]
                        }                                                          //normal
                            );
                    }
                    else
                    {
                        // ["f 1//1 2//2 3//3", " 1//1", "1", "1", " 2//2", "2", "2", " 3//3", "3", "3", undefined, undefined, undefined]
                        handle_face_line(
                            new List <string>()
                        {
                            result[1], result[4], result[7], result[10]
                        },        //faces
                            null, //uv
                            new List <string>()
                        {
                            result[3], result[6], result[9], result[12]
                        }                                                                      //normal
                            );
                    }
                }
                else if (objectTest.IsMatch(line))
                {
                    geometry = new Geometry();
                    material = new MeshBasicMaterial(renderer);

                    mesh      = new Mesh(geometry, material);
                    mesh.Name = line.Substring(2).Trim();
                    o.Add(mesh);
                }
                else if (groupTest.IsMatch(line))
                {
                    // group
                }
                else if (useMTLTest.IsMatch(line))
                {
                    // material
                    material      = materials[result[1].Trim()];
                    mesh.Material = material;
                }
                else if (mtlTest.IsMatch(line))
                {
                    // mtl file
                    var objPath  = Path.GetDirectoryName(path);
                    var fullPath = Path.Combine(objPath, result[1].Trim());
                    ParseMaterials(fullPath);
                }
                else if (smoothShadingTest.IsMatch(line))
                {
                    // smooth shading
                }
                else
                {
                    throw new NotSupportedException(line);
                }
            }

            var children = o.Children;

            foreach (var c in o.Children)
            {
                var geometry = c.geometry;
                geometry.ComputeNormals();
                geometry.ComputeBoundingSphere();
            }

            return(o);
        }
예제 #18
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="control"></param>
        public override void Load(Control control)
        {
            base.Load(control);

            camera = new PerspectiveCamera(40, control.Width / (float)control.Height, 1, 2000);
            this.camera.Position.Z = 800;

            scene = new Scene();

            const int Size = 150;

            var geometryLines = new BoxGeometry(Size, Size, Size);
            var geometryTris  = new BoxGeometry(Size, Size, Size);

            // wireframe using gl.LINES

            var materialLines = new MeshBasicMaterial()
            {
                Wireframe = true
            };

            meshLines            = new Mesh(geometryLines, materialLines);
            meshLines.Position.X = -150;
            scene.Add(meshLines);

            // wireframe using gl.TRIANGLES (interpreted as triangles)

            var attributesTris = new Attributes
            {
                { "center", new Attribute {
                      { "type", "v3" }, { "value", new List <List <Vector3> >() }, { "boundTo", "faceVertices" },
                  } }
            };

            SetupAttributes(geometryTris, (List <List <Vector3> >)(attributesTris["center"])["value"]);

            var materialTris = new ShaderMaterial()
            {
                Attributes = attributesTris, VertexShader = VertexShader, FragmentShader = FragmentShader
            };

            meshTris            = new Mesh(geometryTris, materialTris);
            meshTris.Position.X = 150;
            scene.Add(meshTris);

            // wireframe using gl.TRIANGLES (mixed triangles and quads)

            var mixedGeometry = new SphereGeometry(Size / 2, 32, 16);

            var attributesMixed = new Attributes
            {
                { "center", new Attribute {
                      { "type", "v3" }, { "value", new List <List <Vector3> >() }, { "boundTo", "faceVertices" },
                  } }
            };

            SetupAttributes(mixedGeometry, (List <List <Vector3> >)attributesMixed["center"]["value"]);

            var materialMixed = new ShaderMaterial()
            {
                Attributes     = attributesMixed,
                VertexShader   = VertexShader,
                FragmentShader = FragmentShader
            };

            meshMixed            = new Mesh(mixedGeometry, materialMixed);
            meshMixed.Position.X = -150;
            scene.Add(meshMixed);
        }
예제 #19
0
        private static void Init()
        {
            camera = new PerspectiveCamera(renderer, 30, 1, 10000)
            {
                Position = new Vector3(0, 0, 100)
            };

            cameraRTT = new OrthographicCamera(renderer, -10000, 10000)
            {
                Position = new Vector3(0, 0, 100)
            };

            scene       = new Scene();
            sceneRTT    = new Scene();
            sceneScreen = new Scene();

            var light = new DirectionalLight(Color.White)
            {
                Position = Vector3.UnitZ.Normalized()
            };

            sceneRTT.Add(light);

            light = new DirectionalLight(new Color(0xffaaaa))
            {
                Position  = Vector3.UnitNegativeZ.Normalized(),
                Intensity = 1.5f
            };
            sceneRTT.Add(light);

            rtTexture = new RenderTarget(renderer.Width, renderer.Height)
            {
                MinFilter = TextureMinFilter.Linear,
                MagFilter = TextureMagFilter.Nearest,
                Format    = Three.Net.Renderers.PixelFormat.RGB
            };

            var vertexShaderSource = @"
varying vec2 vUv;
void main() 
{
	vUv = uv;
	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}";

            var fragment_shader_screenSource = @"
varying vec2 vUv;
uniform sampler2D tDiffuse;
void main() 
{
	gl_FragColor = texture2D( tDiffuse, vUv );
}";
            var fragment_shader_pass_1Source = @"
varying vec2 vUv;
uniform float time;
void main() 
{
	float r = vUv.x;
	if( vUv.y < 0.5 ) r = 0.0;
	float g = vUv.y;
	if( vUv.x < 0.5 ) g = 0.0;

	gl_FragColor = vec4( r, g, time, 1.0 );
}";

            material = new CustomShaderMaterial(renderer, vertexShaderSource, fragment_shader_pass_1Source, m => { });

            var materialScreen = new CustomShaderMaterial(renderer, vertexShaderSource, fragment_shader_screenSource, m => {})
            {
                ShouldDepthWrite = false
            };

            var plane = new PlaneGeometry(renderer.Width, renderer.Height);
            var quad  = new Mesh(plane, material)
            {
                Position = new Vector3(0, 0, -100)
            };

            sceneRTT.Add(quad);

            var geometry = new TorusGeometry(100, 25, 15, 30);

            var mat1 = new MeshPhongMaterial(renderer)
            {
                Diffuse   = new Color(0x555555),
                Specular  = new Color(0xffaa00),
                Shininess = 5
            };
            var mat2 = new MeshPhongMaterial(renderer)
            {
                Diffuse   = new Color(0x550000),
                Specular  = new Color(0xff2200),
                Shininess = 5
            };

            zmesh1 = new Mesh(geometry, mat1)
            {
                Position = new Vector3(0, 0, 100),
                Scale    = new Vector3(1.5f, 1.5f, 1.5f)
            };
            sceneRTT.Add(zmesh1);

            zmesh2 = new Mesh(geometry, mat2)
            {
                Position = new Vector3(0, 150, 100),
                Scale    = new Vector3(0.75f, 0.75f, 0.75f)
            };
            sceneRTT.Add(zmesh2);

            quad = new Mesh(plane, materialScreen)
            {
                Position = new Vector3(0, 0, -100)
            };
            sceneScreen.Add(quad);

            var n = 5;
            var sphereGeometry = new SphereGeometry(10, 64, 32);
            var material2      = new MeshBasicMaterial(renderer)
            {
                Diffuse    = Color.White,
                DiffuseMap = rtTexture
            };

            for (var j = 0; j < n; j++)
            {
                for (var i = 0; i < n; i++)
                {
                    var mesh = new Mesh(sphereGeometry, material2)
                    {
                        Position = new Vector3(
                            (i - (n - 1) / 2) * 20,
                            (j - (n - 1) / 2) * 20,
                            0),
                        Rotation = new Euler(0, -Mathf.Pi / 2, 0)
                    };
                    scene.Add(mesh);
                }
            }

            renderer.ShouldAutoClear = false;
        }
예제 #20
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="control"></param>
        public override void Load(Control control)
        {
            base.Load(control);

            camera = new PerspectiveCamera(60, control.Width / (float)control.Height, 1, 10000);
            this.camera.Position.Z = 100;

            this.cameraRtt            = new OrthographicCamera(control.Width / -2, control.Width / 2, control.Height / 2, control.Height / -2, -10000, 10000);
            this.cameraRtt.Position.Z = 100;

            scene         = new Scene();
            this.sceneRtt = new Scene();
            sceneScreen   = new Scene();

            var light = new DirectionalLight(Color.White);

            light.Position.set(0, 0, 1).Normalize();
            this.sceneRtt.Add(light);

            light = new DirectionalLight((Color)colorConvertor.ConvertFromString("#ffaaaa"), 1.5f);
            light.Position.set(0, 0, -1).Normalize();
            this.sceneRtt.Add(light);

            rtTexture = new WebGLRenderTarget(control.Width, control.Height)
            {
                MinFilter = ThreeCs.Three.LinearFilter, MagFilter = ThreeCs.Three.NearestFilter, Format = ThreeCs.Three.RGBFormat
            };

            material = new ShaderMaterial()
            {
                Uniforms = new Uniforms {
                    { "time", new Uniform()
                      {
                          { "type", "f" }, { "value", 0.0f }
                      } }
                },
                VertexShader   = VertexShader,
                FragmentShader = FragmentShaderPass1,
            };

            materialScreen = new ShaderMaterial()
            {
                Uniforms = new Uniforms {
                    { "tDiffuse", new Uniform()
                      {
                          { "type", "t" }, { "value", rtTexture }
                      } }
                },
                VertexShader   = VertexShader,
                FragmentShader = FragmentShaderScreen,
            };

            var plane = new PlaneBufferGeometry(control.Width, control.Height);

            quad            = new Mesh(plane, material);
            quad.Position.Z = -100;
            this.sceneRtt.Add(quad);

            var geometry = new TorusGeometry(100, 25, 15, 30);

            var mat1 = new MeshPhongMaterial()
            {
                Color = (Color)colorConvertor.ConvertFromString("#555555"), Specular = (Color)colorConvertor.ConvertFromString("#ffaa00"), Shininess = 5
            };
            var mat2 = new MeshPhongMaterial()
            {
                Color = (Color)colorConvertor.ConvertFromString("#550000"), Specular = (Color)colorConvertor.ConvertFromString("#ff2200"), Shininess = 5
            };

            zmesh1 = new Mesh(geometry, mat1);
            zmesh1.Position.set(0, 0, 100);
            zmesh1.Scale.set(1.5f, 1.5f, 1.5f);
            this.sceneRtt.Add(zmesh1);

            zmesh2 = new Mesh(geometry, mat2);
            zmesh2.Position.set(0, 150, 100);
            zmesh2.Scale.set(0.75f, 0.75f, 0.75f);
            this.sceneRtt.Add(zmesh2);

            quad            = new Mesh(plane, materialScreen);
            quad.Position.Z = -100;
            sceneScreen.Add(quad);

            //
            var geometry3 = new SphereGeometry(10, 64, 32);
            var material2 = new MeshBasicMaterial()
            {
                Color = Color.White                                                  /*, Map = rtTexture*/
            };

            int n = 5;

            for (var j = 0; j < n; j++)
            {
                for (var i = 0; i < n; i++)
                {
                    var mesh = new Mesh(geometry3, material2);

                    mesh.Position.X = (i - (n - 1) / 2) * 20;
                    mesh.Position.Y = (j - (n - 1) / 2) * 20;
                    mesh.Position.Z = 0;

                    mesh.Rotation.Y = (float)-Math.PI / 2.0f;

                    scene.Add(mesh);
                }
            }

            renderer.AutoClear = false;
        }
예제 #21
0
        /// <summary>
        /// Constructor
        /// </summary>
        public void init()
        {
            this.handles = new Object3D();
            this.pickers = new Object3D();
            this.planes  = new Object3D();

            this.Add(this.handles);
            this.Add(this.pickers);
            this.Add(this.planes);

            //// PLANES

            var planeGeometry = new PlaneGeometry(50, 50, 2, 2);
            var planeMaterial = new MeshBasicMaterial {
                Wireframe = true
            };

            planeMaterial.Side = ThreeCs.Three.DoubleSide;

            var planes = new Hashtable();

            planes["XY"]   = new Mesh(planeGeometry, planeMaterial);
            planes["YZ"]   = new Mesh(planeGeometry, planeMaterial);
            planes["XZ"]   = new Mesh(planeGeometry, planeMaterial);
            planes["XYZE"] = new Mesh(planeGeometry, planeMaterial);

            this.activePlane = (Mesh)planes["XYZE"];

            ((Object3D)planes["YZ"]).Rotation.set(0, (float)Math.PI / 2, 0);
            ((Object3D)planes["XZ"]).Rotation.set((float)-Math.PI / 2, 0, 0);

            foreach (DictionaryEntry i in planes)
            {
                ((Mesh)planes[i.Key]).Name = (string)i.Key;
                this.planes.Add((Object3D)planes[i.Key]);
                this.planes[i.Key] = planes[i.Key];
                ((Object3D)planes[i.Key]).Visible = false;
            }

            //// HANDLES AND PICKERS

            setupGizmos(this.handleGizmos, this.handles);
            setupGizmos(this.pickerGizmos, this.pickers);

            // reset Transformations

            this.Traverse(child => {
                if (child is Mesh)
                {
                    child.UpdateMatrix();

                    var tempGeometry = new Geometry();
                    tempGeometry.Merge((Geometry)child.Geometry, child.Matrix);

                    child.Geometry = tempGeometry;
                    child.Position.set(0, 0, 0);
                    child.Rotation.set(0, 0, 0);
                    child.Scale.set(1, 1, 1);
                }
            });
        }