/// <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(); }
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); }
private PointLightHelper(PointLight light, Geometry geometry, MeshBasicMaterial material) : base(geometry, material) { this.light = light; light.UpdateMatrixWorld(); matrixWorld = light.matrixWorld; matrixAutoUpdate = false; }
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); }
// 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); }
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(); }
/// <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")); }
/// <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); }
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(); } } }
private BoundingBoxHelper(Geometry geometry, MeshBasicMaterial material) : base(geometry, material) { }
public SkinnedMesh(Geometry geometry, MeshBasicMaterial material, bool useVertexTexture) : base(geometry, material) { }
private static Mesh CreateCube(Renderer renderer, Scene scene, string texturesPath, MeshBasicMaterial material) { var cube = new Mesh(new SphereGeometry(1, 50, 50), material); return(cube); }
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); }
/// <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")); }
/// <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); }
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); }
/// <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); }
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; }
/// <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; }
/// <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); } }); }