public RoadScene() { Object3dInfo waterInfo = Object3dGenerator.CreateGround(new Vector2(-200, -200), new Vector2(200, 200), new Vector2(100, 100), Vector3.UnitY); /* var color = GenericMaterial.FromMedia("checked.png"); Mesh3d water = new Mesh3d(waterInfo, color); water.SetMass(0); water.SetCollisionShape(new BulletSharp.StaticPlaneShape(Vector3.UnitY, 0)); World.Root.Add(water); */ var lod1 = Object3dInfo.LoadFromObjSingle(Media.Get("train.obj")); // lod1.MakeDoubleFaced() var mat = new GenericMaterial(new Vector4(1, 1, 1, 1)); var dragon = new Mesh3d(lod1, mat); dragon.Transformation.Scale(19); // dragon.DisableDepthWrite = true; Add(dragon); /* var roadtile = Object3dGenerator.CreateGround(new Vector2(-0.47f, -0.5f) * 20, new Vector2(0.47f, 0.5f) * 20, new Vector2(1, 1), Vector3.UnitY); var roadsInstances = new InstancedMesh3d(roadtile, GenericMaterial.FromMedia("roadtex.png", "roadnormaltex.png")); var advancer = new Vector3(0, 0, (roadtile.GetAxisAlignedBox() * 2).Z); roadsInstances.Transformations.Add(new TransformationManager(new Vector3(0, 0.1f, 0))); for(int i = 0; i < 1600; i++) { roadsInstances.Transformations.Add(new TransformationManager(new Vector3(0, 0.1f, 0) + advancer * i)); } roadsInstances.UpdateMatrix(); Add(roadsInstances);*/ }
public static void Resolve() { foreach (var link in Links) { if (link.Child is Mesh3d) { Mesh3d mesh = link.Child as Mesh3d; link.Child.GetTransformationManager().SetPosition(link.Parent.GetTransformationManager().GetPosition() + link.Offset.Rotate(link.Parent.GetTransformationManager().GetOrientation())); if (link.UpdateRotation) { link.Child.GetTransformationManager().SetOrientation(Quaternion.Multiply(link.Parent.GetTransformationManager().GetOrientation(), link.Rotation)); } } else if (link.Child is Camera) { link.Child.GetTransformationManager().SetPosition(link.Parent.GetTransformationManager().GetPosition() + link.Offset.Rotate(link.Parent.GetTransformationManager().GetOrientation())); if (link.UpdateRotation) { link.Child.GetTransformationManager().SetOrientation(Quaternion.Multiply(link.Parent.GetTransformationManager().GetOrientation(), link.Rotation)); } ((Camera)link.Child).Update(); } else { link.Child.GetTransformationManager().SetPosition(link.Parent.GetTransformationManager().GetPosition() + link.Offset.Rotate(link.Parent.GetTransformationManager().GetOrientation())); if (link.UpdateRotation) { link.Child.GetTransformationManager().SetOrientation(Quaternion.Multiply(link.Parent.GetTransformationManager().GetOrientation(), link.Rotation)); } } } }
public static Mesh3d Create(Object3dInfo objectInfo, GenericMaterial material) { var m = new Mesh3d(); m.AddLodLevel(objectInfo, material, 0, 99999); m.AddInstance(new Mesh3dInstance(new TransformationManager(Vector3.Zero), "")); return m; }
public static Mesh3d Create(Object3dInfo objectInfo, GenericMaterial material) { var m = new Mesh3d(); m.AddLodLevel(objectInfo, material, 0, 99999); m.AddInstance(new Mesh3dInstance(new TransformationManager(Vector3.Zero), "")); return(m); }
public IndirectTestScene() { var obj = Object3dInfo.LoadFromObjSingle(Media.Get("indirect.obj")); obj.MakeDoubleFaced(); Mesh3d mesh = new Mesh3d(obj, new GenericMaterial(Color.White)); mesh.Transformation.SetScale(0.2f); // mesh.SetMass(0); // mesh.SetCollisionShape(obj.GetAccurateCollisionShape()); Add(mesh); }
public PlanetScene() { var sphere = Object3dInfo.LoadFromObjSingle(Media.Get("planet.obj")); var planet = new Mesh3d(sphere, new GenericMaterial(Color.Red)); planet.Scale(30000); (planet.MainMaterial as GenericMaterial).Type = GenericMaterial.MaterialType.PlanetSurface; (planet.MainMaterial as GenericMaterial).TesselationMultiplier = 0.007f; planet.Translate(0, -30500, 0); Add(planet); }
public BoxesScene() { var obj = Object3dInfo.LoadFromObjSingle(Media.Get("head.obj")); //obj.MakeDoubleFaced(); var mat = GenericMaterial.FromMedia("lambertian.jpg"); //mat.SetBumpMapFromMedia("bumplow.png"); var head = new Mesh3d(obj, mat); mat.SpecularComponent = 0f; head.Transformation.Translate(new Vector3(30, 0, 0)); Add(head); }
public void Draw(Mesh3d container, int instances) { /*if(instances < 3 || ForceFrustumCull) // special case optimization * { * var inst = container.GetInstances(); * bool visibility = true; * for(int i = 0; i < instances; i++) * { * var pos = inst[i].Transformation.Position; * visibility = visibility && Camera.Current.IsAABBVisible(Info3d.BoundingBoxMin + pos, Info3d.BoundingBoxMax + pos); * } * if(!visibility) * return; * }*/ if (InternalRenderingState.PassState == InternalRenderingState.State.ForwardOpaquePass) { if (Material.UseForwardRenderer) { return; } } if (InternalRenderingState.PassState == InternalRenderingState.State.ForwardTransparentBlendingAdditivePass || InternalRenderingState.PassState == InternalRenderingState.State.ForwardTransparentBlendingAlphaPass) { if (!Material.UseForwardRenderer) { return; } } if (Material.Blending == GenericMaterial.BlendingEnum.Alpha && InternalRenderingState.PassState == InternalRenderingState.State.ForwardTransparentBlendingAdditivePass) { return; } if (Material.Blending == GenericMaterial.BlendingEnum.AdditiveNormalized && InternalRenderingState.PassState == InternalRenderingState.State.ForwardTransparentBlendingAlphaPass) { return; } Material.Use(); container.SetUniforms(); ShaderProgram.Current.SetUniform("ForwardPass", InternalRenderingState.PassState == InternalRenderingState.State.ForwardTransparentBlendingAlphaPass ? 0 : 1); ModelInfosBuffer.Use(0); // if(DisableFaceCulling) // GL.Disable(EnableCap.CullFace); Info3d.DrawInstanced(InstancesFiltered); //if(DisableFaceCulling) // GL.Enable(EnableCap.CullFace); }
public static void SaveArray(string file, Mesh3d[] meshes) { List<byte> buffer = new List<byte>(); foreach(var mesh in meshes) { buffer.AddRange(BitConverter.GetBytes(mesh.Transformation.GetPosition().X)); buffer.AddRange(BitConverter.GetBytes(mesh.Transformation.GetPosition().Y)); buffer.AddRange(BitConverter.GetBytes(mesh.Transformation.GetPosition().Z)); buffer.AddRange(BitConverter.GetBytes(mesh.Transformation.GetOrientation().X)); buffer.AddRange(BitConverter.GetBytes(mesh.Transformation.GetOrientation().Y)); buffer.AddRange(BitConverter.GetBytes(mesh.Transformation.GetOrientation().Z)); buffer.AddRange(BitConverter.GetBytes(mesh.Transformation.GetOrientation().W)); } System.IO.File.WriteAllBytes(file, buffer.ToArray()); }
public void DrawBoundingBoxes(Mesh3d container, int instances) { Material.Use(); container.SetUniforms(); //ShaderProgram.Current.SetUniform("ForwardPass", InternalRenderingState.PassState == InternalRenderingState.State.ForwardTransparentBlendingAlphaPass ? 0 : 1); ModelInfosBuffer.Use(0); //BoundingBoxInfo3d.DrawInstanced(InstancesFiltered); if (DisableFaceCulling) { GL.Disable(EnableCap.CullFace); } Info3d.DrawInstanced(InstancesFiltered); if (DisableFaceCulling) { GL.Enable(EnableCap.CullFace); } }
public PathTraceTest() { Object3dInfo[] skydomeInfo = Object3dInfo.LoadFromObj(Media.Get("ptracetest.obj")); // var sponza = Object3dInfo.LoadSceneFromObj(Media.Get("cryteksponza.obj"), Media.Get("cryteksponza.mtl"), 0.03f); List<Mesh3d> meshes = new List<Mesh3d>(); List<GenericMaterial> mats = new List<GenericMaterial> { new GenericMaterial(new Vector4(10.0f, 10.0f, 10.0f, 1.0f)), new GenericMaterial(new Vector4(0.1f, 0, 0, 1.0f)), new GenericMaterial(new Vector4(0, 0.1f, 0, 1.0f)), new GenericMaterial(new Vector4(0, 0, 0.1f, 1.0f)), new GenericMaterial(new Vector4(0, 0, 0.1f, 1.0f)), new GenericMaterial(new Vector4(1, 0, 0.1f, 1.0f)), new GenericMaterial(new Vector4(1, 0, 0.1f, 1.0f)), new GenericMaterial(new Vector4(1, 0, 0.1f, 1.0f)), new GenericMaterial(new Vector4(1, 0, 0.1f, 1.0f)), new GenericMaterial(new Vector4(1, 0, 0.1f, 1.0f)), }; int ix = 0; foreach(var sd in skydomeInfo) { var skydomeMaterial = mats[ix++ % mats.Count]; var skydome = new Mesh3d(sd, skydomeMaterial); meshes.Add(skydome); } Tracer = new PathTracer(); Tracer.PrepareTrianglesData(meshes); foreach(var m in meshes) Add(m); PointLight pd = new PointLight(new Vector3(3, 10, 3), new Vector3(1, 1, 1), 0.2f, 16); Tracer.SetLights(new List<PointLight> { pd }); Commons.FreeCam.Cam.SetPosition(10, 5, 10); Commons.FreeCam.Cam.LookAt(new Vector3(0, 0, 0)); PostProcessing.Tracer = Tracer; }
public LucyScene() { /* var dragon3dInfo = Object3dInfo.LoadFromRaw(Media.Get("lucyhires.vbo.raw"), Media.Get("lucyhires.indices.raw")); dragon3dInfo.ScaleUV(0.1f); var dragon = new Mesh3d(dragon3dInfo, SingleTextureMaterial.FromMedia("180.jpg", "180_norm.jpg")); Add(dragon);*/ var dragon3dInfo = Object3dInfo.LoadFromObjSingle(Media.Get("kamaz.obj")); var dragon = new Mesh3d(dragon3dInfo, new GenericMaterial(Color.PapayaWhip)); dragon.Transformation.Scale(4); Add(dragon); /* var ballobj = Object3dInfo.LoadFromRaw(Media.Get("mustang.vbo.raw"), Media.Get("mustang.indices.raw")); ballobj.MakeDoubleFaced(); var ball2 = new Mesh3d(ballobj, new SolidColorMaterial(Color.Red)); ball2.Transformation.Scale(4); Add(ball2); */ /*var ballobj = Object3dInfo.LoadFromObjSingle(Media.Get("sphere.obj")); Random rand = new Random(); for(float x = -20; x < 20; x += 10) { for(float y = -20; y < 20; y += 10) { var ball2 = new Mesh3d(ballobj, new SolidColorMaterial(Color.White) { Color = new Vector4((float)rand.NextDouble() * 60.0f, (float)rand.NextDouble() * 60.0f, (float)rand.NextDouble() * 60.0f, 1) }); ball2.Transformation.Translate(new Vector3(x, 0, y)); Add(ball2); } }*/ }
public void Draw(Mesh3d container, int instances) { if(InternalRenderingState.PassState == InternalRenderingState.State.ShadowMapPass) { if(!Material.CastShadows) return; } if(InternalRenderingState.PassState == InternalRenderingState.State.EarlyZPass) { if(Material.SupportTransparency) return; } if(InternalRenderingState.PassState == InternalRenderingState.State.DistancePass) { if(Material.SupportTransparency) return; } if(InternalRenderingState.PassState == InternalRenderingState.State.ForwardOpaquePass) { if(Material.SupportTransparency) return; } if(InternalRenderingState.PassState == InternalRenderingState.State.ForwardTransparentPass) { if(!Material.SupportTransparency) return; } Material.Use(); container.SetUniforms(); SetUniforms(); ModelMatricesBuffer.Use(0); RotationMatricesBuffer.Use(1); Ids.Use(2); Info3d.DrawInstanced(InstancesFiltered); }
public RigidBody CreateRigidBody(float mass, Matrix4 startTransform, CollisionShape shape, Mesh3d reference) { bool isDynamic = (mass != 0.0f); Vector3 localInertia = Vector3.Zero; if(isDynamic) shape.CalculateLocalInertia(mass, out localInertia); DefaultMotionState myMotionState = new DefaultMotionState(startTransform); RigidBodyConstructionInfo rbInfo = new RigidBodyConstructionInfo(mass, myMotionState, shape, localInertia); RigidBody body = new RigidBody(rbInfo); body.UserObject = reference; PhysicalWorld.AddRigidBody(body); return body; }
public void SetSkyDome(Mesh3d dome) { }
public CarScene() { Object3dInfo waterInfo = Object3dGenerator.CreateGround(new Vector2(-200, -200), new Vector2(200, 200), new Vector2(100, 100), Vector3.UnitY); var color = GenericMaterial.FromMedia("checked.png", "183_norm.JPG"); Mesh3d water = new Mesh3d(waterInfo, color); water.SetMass(0); water.Translate(0, -10, 0); water.SetCollisionShape(new BulletSharp.StaticPlaneShape(Vector3.UnitY, 0)); World.Root.Add(water); var lod1 = Object3dInfo.LoadFromRaw(Media.Get("lucy_lod1.vbo.raw"), Media.Get("lucy_lod1.indices.raw")); var mat = new GenericMaterial(new Vector4(0, 0, 1, 1f)); var dragon = new Mesh3d(lod1, mat); dragon.Transformation.Scale(2); Add(dragon); var rand = new Random(); var grasslod0 = Object3dInfo.LoadFromObjSingle(Media.Get("grasslod1.obj")); var grasslod1 = Object3dInfo.LoadFromObjSingle(Media.Get("grasslod1.obj")); var grasslod2 = Object3dInfo.LoadFromObjSingle(Media.Get("grasslod2.obj")); var grasslod3 = Object3dInfo.LoadFromObjSingle(Media.Get("grasslod3.obj")); var grasscolor = new GenericMaterial(Color.DarkGreen); var grassInstanced = new InstancedMesh3d(grasslod2, grasscolor); for(int x = -15; x < 15; x++) { for(int y = -15; y < 15; y++) { grassInstanced.Transformations.Add(new TransformationManager(new Vector3(x, 0, y), Quaternion.FromAxisAngle(Vector3.UnitY, (float)rand.NextDouble() * MathHelper.Pi), new Vector3(1, 1, 1))); grassInstanced.Instances++; } } grassInstanced.UpdateMatrix(); Add(grassInstanced); ProjectionLight redConeLight = new ProjectionLight(new Vector3(1, 25, 1), Quaternion.Identity, 5000, 5000, MathHelper.PiOver2, 1.0f, 10000.0f); redConeLight.LightColor = new Vector4(1, 1, 1, 1); redConeLight.BuildOrthographicProjection(500, 500, -100, 100); redConeLight.camera.LookAt(Vector3.Zero); LightPool.Add(redConeLight); var wheel3dInfo = Object3dInfo.LoadFromObjSingle(Media.Get("fcarwheel.obj")); var car3dInfo = Object3dInfo.LoadFromObjSingle(Media.Get("fcarbody.obj")); var car = new Mesh3d(car3dInfo, new GenericMaterial(Color.LightGreen)); car.SetMass(200); //car.Translate(0, 3.76f, 0); car.SetCollisionShape(new BoxShape(0.5f, 0.5f, 0.5f)); car.CreateRigidBody(new Vector3(0, -25, 0), true); car.PhysicalBody.SetSleepingThresholds(0, 0); car.PhysicalBody.ContactProcessingThreshold = 0; car.PhysicalBody.CcdMotionThreshold = 0; CurrentCar = car; World.Root.Add(car); GLThread.OnUpdate += (o, e) => { redConeLight.SetPosition(car.GetPosition() + new Vector3(0, 15, 0)); }; var shape = new SphereShape(0.5f); //var shape = wheel3dInfo.GetAccurateCollisionShape(); var wheelLF = new Mesh3d(wheel3dInfo, new GenericMaterial(Color.White)); wheelLF.SetMass(100); wheelLF.Translate(1.640539f, 0.48866f, -1.94906f); wheelLF.SetCollisionShape(shape); wheelLF.CreateRigidBody(); World.Root.Add(wheelLF); var wheelRF = new Mesh3d(wheel3dInfo, new GenericMaterial(Color.White)); wheelRF.SetMass(100); wheelRF.Translate(1.640539f, 0.48866f, 1.94906f); wheelRF.SetCollisionShape(shape); wheelRF.CreateRigidBody(); World.Root.Add(wheelRF); var wheelLR = new Mesh3d(wheel3dInfo, new GenericMaterial(Color.White)); wheelLR.SetMass(100); wheelLR.Translate(-1.640539f, 0.48866f, -1.94906f); wheelLR.SetCollisionShape(shape); wheelLR.CreateRigidBody(); World.Root.Add(wheelLR); var wheelRR = new Mesh3d(wheel3dInfo, new GenericMaterial(Color.White)); wheelRR.SetMass(100); wheelRR.Translate(-1.640539f, 0.48866f, 1.94906f); wheelRR.SetCollisionShape(shape); wheelRR.CreateRigidBody(); World.Root.Add(wheelRR); wheelLF.PhysicalBody.SetSleepingThresholds(0, 0); wheelLF.PhysicalBody.ContactProcessingThreshold = 0; wheelLF.PhysicalBody.CcdMotionThreshold = 0; wheelRF.PhysicalBody.SetSleepingThresholds(0, 0); wheelRF.PhysicalBody.ContactProcessingThreshold = 0; wheelRF.PhysicalBody.CcdMotionThreshold = 0; wheelLR.PhysicalBody.SetSleepingThresholds(0, 0); wheelLR.PhysicalBody.ContactProcessingThreshold = 0; wheelLR.PhysicalBody.CcdMotionThreshold = 0; wheelLR.PhysicalBody.SetSleepingThresholds(0, 0); wheelLR.PhysicalBody.ContactProcessingThreshold = 0; wheelLR.PhysicalBody.CcdMotionThreshold = 0; wheelRR.PhysicalBody.SetSleepingThresholds(0, 0); wheelRR.PhysicalBody.ContactProcessingThreshold = 0; wheelRR.PhysicalBody.CcdMotionThreshold = 0; wheelLF.PhysicalBody.Friction = 1200; wheelRF.PhysicalBody.Friction = 1200; wheelLR.PhysicalBody.Friction = 1200; wheelRR.PhysicalBody.Friction = 1200; car.PhysicalBody.SetIgnoreCollisionCheck(wheelLF.PhysicalBody, true); car.PhysicalBody.SetIgnoreCollisionCheck(wheelRF.PhysicalBody, true); car.PhysicalBody.SetIgnoreCollisionCheck(wheelLR.PhysicalBody, true); car.PhysicalBody.SetIgnoreCollisionCheck(wheelRR.PhysicalBody, true); // location left rear x -5.27709 y 1.56474 z -3.13906 // location right rear x -5.27709 y 1.56474 z 3.13906 // location left front x 5.500539 y 1.56474 z -3.13906 // location right front x 5.500539 y 1.56474 z 3.13906 //public HingeConstraint(RigidBody rigidBodyA, RigidBody rigidBodyB, Vector3 pivotInA, Vector3 pivotInB, Vector3 axisInA, Vector3 axisInB); var frontAxis = new HingeConstraint(wheelLF.PhysicalBody, wheelRF.PhysicalBody, new Vector3(1.640539f, 0.48866f, 1.94906f), new Vector3(1.640539f, 0.48866f, -1.94906f), Vector3.UnitZ, Vector3.UnitZ); var rearAxis = new HingeConstraint(wheelLR.PhysicalBody, wheelRR.PhysicalBody, new Vector3(-1.640539f, 0.48866f, 1.94906f), new Vector3(-1.640539f, 0.48866f, -1.94906f), Vector3.UnitZ, Vector3.UnitZ); var centerAxis1 = new HingeConstraint(car.PhysicalBody, wheelLF.PhysicalBody, new Vector3(1.640539f, -0.48866f, -1.94906f), new Vector3(0), Vector3.UnitZ, Vector3.UnitZ); var centerAxis2 = new HingeConstraint(car.PhysicalBody, wheelRF.PhysicalBody, new Vector3(1.640539f, -0.48866f, 1.94906f), new Vector3(0), Vector3.UnitZ, Vector3.UnitZ); var centerAxis3 = new HingeConstraint(car.PhysicalBody, wheelLR.PhysicalBody, new Vector3(-1.640539f, -0.48866f, 1.94906f), new Vector3(0), Vector3.UnitZ, Vector3.UnitZ); var centerAxis4 = new HingeConstraint(car.PhysicalBody, wheelRR.PhysicalBody, new Vector3(-1.640539f, -0.48866f, -1.94906f), new Vector3(0), Vector3.UnitZ, Vector3.UnitZ); centerAxis1.SetLimit(0, 10, 0, 0, 0); centerAxis2.SetLimit(0, 10, 0, 0, 0); centerAxis3.SetLimit(0, 10, 0, 0, 0); centerAxis4.SetLimit(0, 10, 0, 0, 0); //World.Root.PhysicalWorld.AddConstraint(frontAxis); // World.Root.PhysicalWorld.AddConstraint(rearAxis); // centerAxis1.SetLimit(0, 0.01f); // centerAxis2.SetLimit(0, 0.01f); //centerAxis3.SetLimit(0, 0.01f); //centerAxis4.SetLimit(0, 0.01f); World.Root.PhysicalWorld.AddConstraint(centerAxis1); World.Root.PhysicalWorld.AddConstraint(centerAxis2); World.Root.PhysicalWorld.AddConstraint(centerAxis3); World.Root.PhysicalWorld.AddConstraint(centerAxis4); GLThread.OnKeyDown += (object sender, OpenTK.Input.KeyboardKeyEventArgs e) => { if(e.Key == OpenTK.Input.Key.R) { car.SetOrientation(Quaternion.Identity); } if(e.Key == OpenTK.Input.Key.Space) { centerAxis1.EnableMotor = false; centerAxis2.EnableMotor = false; } if(e.Key == OpenTK.Input.Key.Up) { centerAxis1.EnableMotor = true; centerAxis1.EnableAngularMotor(true, -100.0f, 10.0f); centerAxis2.EnableMotor = true; centerAxis2.EnableAngularMotor(true, -100.0f, 10.0f); } if(e.Key == OpenTK.Input.Key.Down) { centerAxis1.EnableMotor = true; centerAxis1.EnableAngularMotor(true, 100.0f, 6.0f); centerAxis2.EnableMotor = true; centerAxis2.EnableAngularMotor(true, 100.0f, 6.0f); } if(e.Key == OpenTK.Input.Key.Left) { float angle = 0.6f / (car.PhysicalBody.LinearVelocity.Length + 1.0f); centerAxis3.SetFrames(Matrix4.CreateRotationY(angle) * Matrix4.CreateTranslation(new Vector3(-1.640539f, -0.48866f, 1.94906f)), Matrix4.CreateTranslation(new Vector3(0))); centerAxis4.SetFrames(Matrix4.CreateRotationY(angle) * Matrix4.CreateTranslation(new Vector3(-1.640539f, -0.48866f, -1.94906f)), Matrix4.CreateTranslation(new Vector3(0))); //centerAxis3.SetAxis(new Vector3(1, 0, 1)); //centerAxis4.SetAxis(new Vector3(1, 0, 1)); } if(e.Key == OpenTK.Input.Key.Right) { float angle = 0.6f / (car.PhysicalBody.LinearVelocity.Length + 1.0f); centerAxis3.SetFrames(Matrix4.CreateRotationY(-angle) * Matrix4.CreateTranslation(new Vector3(-1.640539f, -0.48866f, 1.94906f)), Matrix4.CreateTranslation(new Vector3(0))); centerAxis4.SetFrames(Matrix4.CreateRotationY(-angle) * Matrix4.CreateTranslation(new Vector3(-1.640539f, -0.48866f, -1.94906f)), Matrix4.CreateTranslation(new Vector3(0))); //centerAxis3.SetAxis(new Vector3(-1, 0, 1)); //centerAxis4.SetAxis(new Vector3(-1, 0, 1)); } }; GLThread.OnKeyUp += (object sender, OpenTK.Input.KeyboardKeyEventArgs e) => { if(e.Key == OpenTK.Input.Key.Up) { centerAxis1.EnableMotor = false; centerAxis2.EnableMotor = false; } if(e.Key == OpenTK.Input.Key.Down) { centerAxis1.EnableMotor = false; centerAxis2.EnableMotor = false; } if(e.Key == OpenTK.Input.Key.Left) { centerAxis3.SetFrames(Matrix4.CreateTranslation(new Vector3(-1.640539f, -0.48866f, 1.94906f)), Matrix4.CreateTranslation(new Vector3(0))); centerAxis4.SetFrames(Matrix4.CreateTranslation(new Vector3(-1.640539f, -0.48866f, -1.94906f)), Matrix4.CreateTranslation(new Vector3(0))); //centerAxis3.SetAxis(new Vector3(0, 0, 1)); //centerAxis4.SetAxis(new Vector3(0, 0, 1)); } if(e.Key == OpenTK.Input.Key.Right) { centerAxis3.SetFrames( Matrix4.CreateTranslation(new Vector3(-1.640539f, -0.48866f, 1.94906f)), Matrix4.CreateTranslation(new Vector3(0))); centerAxis4.SetFrames(Matrix4.CreateTranslation(new Vector3(-1.640539f, -0.48866f, -1.94906f)), Matrix4.CreateTranslation(new Vector3(0))); //centerAxis3.SetAxis(new Vector3(0, 0, 1)); //centerAxis4.SetAxis(new Vector3(0, 0, 1)); } }; }
public static List<Mesh3d> LoadSceneFromObj(string objfile, string mtlfile, float scale = 1.0f) { string[] lines = File.ReadAllLines(objfile); var objs = ParseOBJString(lines); var mtllib = LoadMaterialsFromMtl(mtlfile); List<Mesh3d> meshes = new List<Mesh3d>(); Dictionary<string, GenericMaterial> texCache = new Dictionary<string, GenericMaterial>(); Dictionary<Color, GenericMaterial> colorCache = new Dictionary<Color, GenericMaterial>(); Dictionary<GenericMaterial, MaterialInfo> mInfos = new Dictionary<GenericMaterial, MaterialInfo>(); Dictionary<GenericMaterial, List<Object3dInfo>> linkCache = new Dictionary<GenericMaterial, List<Object3dInfo>>(); var colorPink = new GenericMaterial(Color.Pink); mInfos = new Dictionary<GenericMaterial, MaterialInfo>(); foreach(var obj in objs) { var mat = mtllib.ContainsKey(obj.MaterialName) ? mtllib[obj.MaterialName] : null; GenericMaterial material = null; if(mat != null && mat.TextureName.Length > 0) { if(texCache.ContainsKey(mat.TextureName + mat.AlphaMask)) { material = texCache[mat.TextureName + mat.AlphaMask]; mInfos[material] = mat; } else { var m = GenericMaterial.FromMedia(Path.GetFileName(mat.TextureName)); m.NormalMapScale = 10; material = m; mInfos[material] = mat; texCache.Add(mat.TextureName + mat.AlphaMask, material); // material = colorPink; } //material = new GenericMaterial(Color.Pink); } else if(mat != null) { if(colorCache.ContainsKey(mat.DiffuseColor)) { material = colorCache[mat.DiffuseColor]; mInfos[material] = mat; } else { material = new GenericMaterial(Color.White); mInfos[material] = mat; colorCache.Add(mat.DiffuseColor, material); } } else { material = colorPink; mInfos[material] = mat; } for(int i = 0; i < obj.VBO.Count; i += 8) { obj.VBO[i] *= scale; obj.VBO[i + 1] *= scale; obj.VBO[i + 2] *= scale; } var o3di = new Object3dInfo(obj.VBO, obj.Indices); if(!linkCache.ContainsKey(material)) linkCache.Add(material, new List<Object3dInfo> { o3di }); else linkCache[material].Add(o3di); } foreach(var kv in linkCache) { Object3dInfo o3di = kv.Value[0]; if(kv.Value.Count > 1) { foreach(var e in kv.Value.Skip(1)) o3di.Append(e); } var trans = o3di.GetAverageTranslationFromZero(); o3di.OriginToCenter(); //o3di.CorrectFacesByNormals(); // o3di.CorrectFacesByNormals(); Mesh3d mesh = new Mesh3d(o3di, kv.Key); kv.Key.SpecularComponent = 1.0f - mInfos[kv.Key].SpecularStrength + 0.01f; kv.Key.Roughness = (mInfos[kv.Key].SpecularStrength); kv.Key.ReflectionStrength = 1.0f - (mInfos[kv.Key].SpecularStrength); kv.Key.DiffuseComponent = mInfos[kv.Key].DiffuseColor.GetBrightness() + 0.01f; if(mInfos[kv.Key].AlphaMask.Length > 1) (kv.Key as GenericMaterial).SetAlphaMaskFromMedia(mInfos[kv.Key].AlphaMask); if(mInfos[kv.Key].BumpMapName.Length > 1) ((GenericMaterial)kv.Key).SetBumpMapFromMedia(mInfos[kv.Key].BumpMapName); // mesh.SpecularComponent = kv.Key.SpecularStrength; mesh.Transformation.Translate(trans); // mesh.SetCollisionShape(o3di.GetConvexHull(mesh.Transformation.GetPosition(), 1.0f, 1.0f)); meshes.Add(mesh); } return meshes; }
public PostProcessing(int initialWidth, int initialHeight) { //FullScene3DTexture = new Texture3D(new Vector3(64, 64, 64)); TestBuffer = new ShaderStorageBuffer(); NumbersTexture = new Texture(Media.Get("numbers.png")); CShader = new ComputeShader("Blur.compute.glsl"); GLThread.Invoke(() => { TestBuffer.MapData(new Vector3[4]{ new Vector3(1, 0.25f, 1), new Vector3(0, 0.55f, 0.75f), new Vector3(1, 0.25f, 0), new Vector3(0.55f, 0, 0.75f) }); }); Width = initialWidth; Height = initialHeight; MSAAResolvingFrameBuffer = new Framebuffer(initialWidth, initialHeight); MSAAResolvingFrameBuffer.SetMultiSample(true); MRT = new MRTFramebuffer(initialWidth, initialHeight); BackMRT = new MRTFramebuffer(initialWidth / 4, initialHeight / 4); Pass1FrameBuffer = new Framebuffer(initialWidth, initialHeight); Pass2FrameBuffer = new Framebuffer(initialWidth, initialHeight); LightPointsFrameBuffer = new Framebuffer(initialWidth / 6, initialHeight / 6); BloomFrameBuffer = new Framebuffer(initialWidth / 4, initialHeight / 4); FogFramebuffer = new Framebuffer(initialWidth, initialHeight); SmallFrameBuffer = new Framebuffer(initialWidth / 10, initialHeight / 10); LastWorldPositionFramebuffer = new Framebuffer(initialWidth / 1, initialHeight / 1); RSMFramebuffer = new Framebuffer(initialWidth / 1, initialHeight / 1); SSReflectionsFramebuffer = new Framebuffer(initialWidth / 1, initialHeight / 1); VDAOFramebuffer = new Framebuffer(initialWidth / 1, initialHeight / 1); GlobalIlluminationFrameBuffer = new Framebuffer(initialWidth, initialHeight); //GlobalIlluminationFrameBuffer.ColorInternalFormat = PixelInternalFormat.R8; //GlobalIlluminationFrameBuffer.ColorPixelFormat = PixelFormat.Red; //GlobalIlluminationFrameBuffer.ColorPixelType = PixelType.UnsignedByte; GlobalIlluminationFrameBuffer.Use(); //BackDiffuseFrameBuffer = new Framebuffer(initialWidth / 2, initialHeight / 2); //BackNormalsFrameBuffer = new Framebuffer(initialWidth / 2, initialHeight / 2); ScreenSpaceNormalsWriterShader = ShaderProgram.Compile("Generic.vertex.glsl", "ScreenSpaceNormalsWriter.fragment.glsl"); BackDepthWriterShader = ShaderProgram.Compile("Generic.vertex.glsl", "BackDepthWriter.fragment.glsl"); BloomShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "Bloom.fragment.glsl"); MSAAShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "MSAA.fragment.glsl"); SSAOShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "SSAO.fragment.glsl"); FogShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "Fog.fragment.glsl"); LightPointsShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "LightPoints.fragment.glsl"); LensBlurShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "LensBlur.fragment.glsl"); HDRShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "HDR.fragment.glsl"); BlitShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "Blit.fragment.glsl"); DeferredShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "Deferred.fragment.glsl"); CombinerShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "Combiner.fragment.glsl"); PathTracerOutputShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "Output.fragment.glsl"); GlobalIlluminationShaderX = ShaderProgram.Compile("PostProcess.vertex.glsl", "GlobalIllumination.fragment.glsl"); GlobalIlluminationShaderX.SetGlobal("SEED", "gl_FragCoord.x"); GlobalIlluminationShaderY = ShaderProgram.Compile("PostProcess.vertex.glsl", "GlobalIllumination.fragment.glsl"); GlobalIlluminationShaderY.SetGlobal("SEED", "gl_FragCoord.y"); RSMShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "RSM.fragment.glsl"); SSReflectionsShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "SSReflections.fragment.glsl"); VDAOShader = ShaderProgram.Compile("PostProcess.vertex.glsl", "VDAO.fragment.glsl"); //ReflectShader = ShaderProgram.Compile(Media.ReadAllText("PostProcess.vertex.glsl"), Media.ReadAllText("Reflect.fragment.glsl")); Object3dInfo postPlane3dInfo = new Object3dInfo(postProcessingPlaneVertices, postProcessingPlaneIndices); PostProcessingMesh = new Mesh3d(postPlane3dInfo, new GenericMaterial(Color.Pink)); }
public static List<Mesh3d> LoadSceneFromCollada(string infile) { List<Mesh3d> infos = new List<Mesh3d>(); XDocument xml = XDocument.Load(infile); var colladaNode = xml.Elements().First(); var lib = colladaNode.SelectSingle("library_geometries"); var geometries = lib.SelectMany("geometry"); foreach(var geom in geometries) { try { string geoID = geom.Attribute("id").Value; string geoName = geom.Attribute("name").Value; List<float> xyzs = geom.SelectSingle("mesh").SelectMany("source").ElementAt(0).SelectSingle("float_array").Value.Split(new char[] { ' ' }).Select<string, float>((a) => float.Parse(a, System.Globalization.NumberFormatInfo.InvariantInfo)).ToList(); List<float> normals = geom.SelectSingle("mesh").SelectMany("source").ElementAt(1).SelectSingle("float_array").Value.Trim().Split(new char[] { ' ' }).Select<string, float>((a) => float.Parse(a, System.Globalization.NumberFormatInfo.InvariantInfo)).ToList(); List<float> uvs = null; try { uvs = geom.SelectSingle("mesh").SelectMany("source").ElementAt(2).SelectSingle("float_array").Value.Trim().Split(new char[] { ' ' }).Select<string, float>((a) => float.Parse(a, System.Globalization.NumberFormatInfo.InvariantInfo)).ToList(); } catch { uvs = new List<float>(); } List<int> indices = geom.SelectSingle("mesh").SelectSingle("polylist").SelectSingle("p").Value.Trim().Split(new char[] { ' ' }).Select<string, int>((a) => int.Parse(a)).ToList(); List<float> VBO = new List<float>(); List<uint> indicesNew = new List<uint>(); uint vcount = 0; for(int i = 0; i < indices.Count; ) { int vid = indices[i] * 3; int nid = indices[i + 1] * 3; int uid = indices[i + 2] * 2; indicesNew.Add(vcount++); VBO.AddRange(new float[] { -xyzs[vid + 1], xyzs[vid + 2], -xyzs[vid] }); if(uvs.Count > 0) { VBO.AddRange(new float[] { uvs[uid], uvs[uid + 1] }); i += 3; } else { VBO.AddRange(new float[] { 0, 0 }); i += 2; } VBO.AddRange(new float[] { -normals[nid + 1], normals[nid + 2], -normals[nid] }); } var objinfo = new Object3dInfo(VBO, indicesNew); var transformationNode = colladaNode.SelectSingle("library_visual_scenes").SelectSingle("visual_scene").SelectMany("node").First((a) => a.SelectSingle("instance_geometry").Attribute("url").Value == "#" + geoID); var mesh = new Mesh3d(objinfo, new GenericMaterial(Color.White)); List<float> transVector = transformationNode.SelectMany("translate").First((a) => a.Attribute("sid").Value == "location").Value.Trim().Split(new char[] { ' ' }).Select<string, float>((a) => float.Parse(a, System.Globalization.NumberFormatInfo.InvariantInfo)).ToList(); List<List<float>> rots = transformationNode.SelectMany("rotate").Select<XElement, List<float>>((a) => a.Value.Trim().Split(new char[] { ' ' }).Select<string, float>((ax) => float.Parse(ax, System.Globalization.NumberFormatInfo.InvariantInfo)).ToList()).ToList(); List<float> scale = transformationNode.SelectMany("scale").First((a) => a.Attribute("sid").Value == "scale").Value.Trim().Split(new char[] { ' ' }).Select<string, float>((a) => float.Parse(a, System.Globalization.NumberFormatInfo.InvariantInfo)).ToList(); mesh.Translate(-transVector[1], transVector[2], -transVector[0]); foreach(var r in rots) mesh.Rotate(Quaternion.FromAxisAngle(new Vector3(-r[1], r[2], -r[0]), MathHelper.DegreesToRadians(r[3]))); mesh.Scale(scale[1], scale[2], scale[0]); infos.Add(mesh); } catch { } } return infos; }
public NatureScene() { var sun = new Sun(new Vector3(0.1f, -1, 0).ToQuaternion(Vector3.UnitY), new Vector4(1, 0.97f, 0.92f, 120), 100, 70, 10, 4, 1); GLThread.OnUpdate += (o, e) => { var kb = OpenTK.Input.Keyboard.GetState(); if(kb.IsKeyDown(OpenTK.Input.Key.U)) { var quat = Quaternion.FromAxisAngle(sun.Orientation.GetTangent(MathExtensions.TangentDirection.Left), -0.01f); sun.Orientation = Quaternion.Multiply(sun.Orientation, quat); } if(kb.IsKeyDown(OpenTK.Input.Key.J)) { var quat = Quaternion.FromAxisAngle(sun.Orientation.GetTangent(MathExtensions.TangentDirection.Left), 0.01f); sun.Orientation = Quaternion.Multiply(sun.Orientation, quat); } if(kb.IsKeyDown(OpenTK.Input.Key.H)) { var quat = Quaternion.FromAxisAngle(Vector3.UnitY, -0.01f); sun.Orientation = Quaternion.Multiply(sun.Orientation, quat); } if(kb.IsKeyDown(OpenTK.Input.Key.K)) { var quat = Quaternion.FromAxisAngle(Vector3.UnitY, 0.01f); sun.Orientation = Quaternion.Multiply(sun.Orientation, quat); } }; int scale = 2; /* var protagonist = Object3dInfo.LoadSceneFromObj(Media"protagonist.obj", "protagonist.mtl", 1.0f); foreach(var o in protagonist) Add(o);*/ var hmap = System.IO.File.ReadAllBytes(Media.Get("map1.raw")); int count = 0; Func<uint, uint, float> terrainGen = (x, y) => { int yy = (int)(((double)y / (1024.0 / scale)) * 2000); int xx = (int)(((double)x / (1024.0 / scale)) * 3000); int ix = (int)(yy * 3000 + xx) * 3; count++; if(count % 1000 == 0) Console.WriteLine(count * 100 / ((1024 / scale) * (1024 / scale))); return ix < hmap.Length ? hmap[ix] * 0.3f : 0; }; Object3dGenerator.UseCache = false; Object3dInfo terrainInfo = Object3dGenerator.CreateTerrain(new Vector2(-1500, -1000), new Vector2(1500, 1000), new Vector2(1096, 1096), Vector3.UnitY, 1024 / scale, terrainGen); hmap = null; GC.Collect(); Object3dInfo waterInfo = Object3dGenerator.CreateTerrain(new Vector2(-1500, -1000), new Vector2(1500, 1000), new Vector2(1096, 1096), Vector3.UnitY, 121, (x, y) => 0); //var terrainInfo = Object3dInfo.LoadFromObjSingle(Media.Get("terrain11.obj")); //terrainInfo.ScaleUV(100); var color = GenericMaterial.FromMedia("151.JPG", "151_norm.JPG"); color.SetBumpMapFromMedia("grassbump.png"); color.Type = GenericMaterial.MaterialType.Grass; var terrain = new Mesh3d(terrainInfo, color); // terrain.Scale(5); Add(terrain); var waterMat = new GenericMaterial(new Vector4(0.55f, 0.74f, 0.97f, 1.0f)); waterMat.SetNormalMapFromMedia("151_norm.JPG"); waterMat.Type = GenericMaterial.MaterialType.Water; var water = new Mesh3d(waterInfo, waterMat); water.Transformation.Translate(0, 15, 0); //water.DisableDepthWrite = true; //water.ReflectionStrength = 1; Add(water); /* var dragon3dInfo = Object3dInfo.LoadFromRaw(Media.Get("lucyhires.vbo.raw"), Media.Get("lucyhires.indices.raw")); dragon3dInfo.ScaleUV(0.1f); var dragon = new Mesh3d(dragon3dInfo, SingleTextureMaterial.FromMedia("180.jpg", "180_norm.jpg")); Add(dragon); */ // var daetest = Object3dInfo.LoadFromObjSingle(Media.Get("carreragt.obj")); // daetest.CorrectFacesByNormals(); // var car = new Mesh3d(daetest, new SolidColorMaterial(Color.Red)); // Add(car); /* var rand = new Random(); var scene1 = Object3dInfo.LoadSceneFromObj(Media.Get("tree1.obj"), Media.Get("tree1.mtl"), 12); List<Mesh3d> trees = new List<Mesh3d>(); for(int i = 0; i < 44; i++) { foreach(var ob in scene1) { var copy = new Mesh3d(ob.MainObjectInfo, ob.MainMaterial); copy.Translate(rand.Next(-40, 40), 10, rand.Next(-40, 40)); copy.Scale((float)rand.NextDouble() + 1.0f); trees.Add(copy); } } InstancedMesh3d.FromMesh3dList(trees).ForEach((a) => { a.UpdateMatrix(); Add(a); }); var grasslod0 = Object3dInfo.LoadFromObjSingle(Media.Get("grasslod1.obj")); var grasslod1 = Object3dInfo.LoadFromObjSingle(Media.Get("grasslod1.obj")); var grasslod2 = Object3dInfo.LoadFromObjSingle(Media.Get("grasslod2.obj")); var grasslod3 = Object3dInfo.LoadFromObjSingle(Media.Get("grasslod3.obj")); //var grassBlock3dInfo = Object3dInfo.LoadFromRaw(Media.Get("grassblock2.vbo.raw"), Media.Get("grassblock2.indices.raw")); //grassBlock3dInfo.MakeDoubleFaced(); var grasscolor = new GenericMaterial(Color.DarkGreen); var grassInstanced = new InstancedMesh3d(grasslod3, grasscolor); //grassInstanced.AddLodLevel(15, grasslod0, grasscolor); //grassInstanced.AddLodLevel(60, grasslod1, grasscolor); //grassInstanced.AddLodLevel(200, grasslod2, grasscolor); //grassInstanced.AddLodLevel(600, grasslod3, grasscolor); // GLThread.CreateTimer(() => //{ // grassInstanced.RecalculateLod(); //}, 100).Start(); /*for(int x = -500; x < 500; x++) { for(int y = -500; y < 500; y++) { grassInstanced.Transformations.Add(new TransformationManager(new Vector3(x, 0, y), Quaternion.FromAxisAngle(Vector3.UnitY, (float)rand.NextDouble() * MathHelper.Pi), new Vector3(1, 1, 1))); grassInstanced.Instances++; } } grassInstanced.UpdateMatrix(); Add(grassInstanced);*/ /* var grassBlock3dInfo2 = Object3dInfo.LoadFromRaw(Media.Get("grassblock2.vbo.raw"), Media.Get("grassblock2.indices.raw")); //grassBlock3dInfo2.MakeDoubleFaced(); var grassInstanced2 = new InstancedMesh3d(grassBlock3dInfo2, new SolidColorMaterial(Color.DarkGoldenrod)); for(int x = -20; x < 20; x++) { for(int y = -20; y < 20; y++) { grassInstanced2.Transformations.Add(new TransformationManager(new Vector3(x * 2, 0, y * 2), Quaternion.FromAxisAngle(Vector3.UnitY, (float)rand.NextDouble() * MathHelper.Pi), 2.3f)); grassInstanced2.Instances++; } } grassInstanced2.UpdateMatrix(); Add(grassInstanced2);*/ /*var scene = Object3dInfo.LoadSceneFromObj(Media.Get("cryteksponza.obj"), Media.Get("cryteksponza.mtl"), 0.03f); //var instances = InstancedMesh3d.FromMesh3dList(testroom); foreach(var ob in scene) { //ob.SetMass(0); // ob.SetCollisionShape(ob.ObjectInfo.GetAccurateCollisionShape()); //ob.SpecularComponent = 0.1f; this.Add(ob); }*/ Object3dInfo skydomeInfo = Object3dInfo.LoadFromObjSingle(Media.Get("usky.obj")); var skydomeMaterial = GenericMaterial.FromMedia("skyreal.png"); var skydome = new Mesh3d(skydomeInfo, skydomeMaterial); skydome.Transformation.Scale(55000); skydome.Transformation.Translate(0, -100, 0); skydome.MainMaterial.IgnoreLighting = true; skydome.MainMaterial.DiffuseComponent = 0.2f; World.Root.Add(skydome); }
public DragonScene() { var dragon3dInfo = Object3dInfo.LoadFromRaw(Media.Get("dragon.vbo.raw"), Media.Get("dragon.indices.raw")); var dragon = new Mesh3d(dragon3dInfo, new GenericMaterial(Color.White)); Add(dragon); }
public static List <Mesh3d> LoadSceneFromObj(string objfile, string mtlfile, float scale = 1.0f) { string[] lines = File.ReadAllLines(Media.Get(objfile)); var objs = ParseOBJString(lines); var mtllib = LoadMaterialsFromMtl(Media.Get(mtlfile)); List <Mesh3d> meshes = new List <Mesh3d>(); Dictionary <string, GenericMaterial> texCache = new Dictionary <string, GenericMaterial>(); Dictionary <Vector3, GenericMaterial> colorCache = new Dictionary <Vector3, GenericMaterial>(); Dictionary <GenericMaterial, MaterialInfo> mInfos = new Dictionary <GenericMaterial, MaterialInfo>(); Dictionary <GenericMaterial, Object3dManager> linkCache = new Dictionary <GenericMaterial, Object3dManager>(); var colorPink = new GenericMaterial(Color.White); foreach (var obj in objs) { Console.WriteLine("Loading " + obj.Name); Console.WriteLine("GC MEMORY USED {0} MB", GC.GetTotalMemory(true) / 1024.0 / 1024); var mat = mtllib.ContainsKey(obj.MaterialName) ? mtllib[obj.MaterialName] : new MaterialInfo(); GenericMaterial material = colorPink; if (mat != null && mat.TextureName.Length > 0) { var m = new GenericMaterial(); m.SetDiffuseTexture(Path.GetFileName(mat.TextureName)); m.SpecularTexture = m.DiffuseTexture; // m.NormalMapScale = 10; material = m; material.Name = obj.MaterialName; mInfos[material] = mat; // texCache.Add(mat.TextureName + mat.AlphaMask, material); // material = colorPink; } else if (mat != null) { material = new GenericMaterial(mat.DiffuseColor); mInfos[material] = mat; } else { material = colorPink; mInfos[material] = mat; } for (int i = 0; i < obj.VBO.Count; i++) { obj.VBO[i].Position *= scale; } var o3di = new Object3dManager(obj.VBO); o3di.Name = obj.Name; // if(!linkCache.ContainsKey(material)) linkCache.Add(material, o3di); // else // linkCache[material].Add(o3di); } foreach (var kv in linkCache) { Object3dManager o3di = kv.Value; // var trans = o3di.GetAverageTranslationFromZero(); // o3di.OriginToCenter(); //o3di.CorrectFacesByNormals(); // o3di.CorrectFacesByNormals(); var oi = new Object3dInfo(o3di.Vertices); oi.Manager = o3di; // GC.Collect(); Mesh3d mesh = Mesh3d.Create(oi, kv.Key); //kv.Key.SpecularComponent = 1.0f - mInfos[kv.Key].SpecularStrength + 0.01f; kv.Key.Roughness = mInfos[kv.Key].SpecularStrength; kv.Key.DiffuseColor = mInfos[kv.Key].DiffuseColor; kv.Key.SpecularColor = mInfos[kv.Key].SpecularColor; // kv.Key.ReflectionStrength = 1.0f - (mInfos[kv.Key].SpecularStrength); //kv.Key.DiffuseComponent = mInfos[kv.Key].DiffuseColor.GetBrightness() + 0.01f; var kva = kv.Key; if (!mInfos.ContainsKey(kva)) { kva = mInfos.Keys.First(); } if (mInfos[kva].BumpMapName.Length > 1) { ((GenericMaterial)kv.Key).SetBumpTexture(mInfos[kv.Key].BumpMapName); } if (mInfos[kva].RoughnessMapName.Length > 1) { ((GenericMaterial)kv.Key).SetRoughnessTexture(mInfos[kv.Key].RoughnessMapName); } if (mInfos[kva].NormapMapName.Length > 1) { ((GenericMaterial)kv.Key).SetNormalsTexture(mInfos[kv.Key].NormapMapName); } if (mInfos[kva].TextureName.Length > 1) { ((GenericMaterial)kv.Key).SetDiffuseTexture(mInfos[kv.Key].TextureName); } // mesh.SpecularComponent = kv.Key.SpecularStrength; // mesh.GetInstance(0).Translate(trans); // mesh.SetCollisionShape(o3di.GetConvexHull(mesh.Transformation.GetPosition(), // 1.0f, 1.0f)); meshes.Add(mesh); } return(meshes); }
public FortressScene() { Object3dInfo skydomeInfo = Object3dInfo.LoadFromObjSingle(Media.Get("usky.obj")); var skydomeMaterial = GenericMaterial.FromMedia("skyreal.png"); var skydome = new Mesh3d(skydomeInfo, skydomeMaterial); skydome.Scale(55000); skydome.Translate(0, -100, 0); //skydome.IgnoreLighting = true; //skydome.DiffuseComponent = 0.2f; Add(skydome); /* var sun = new Sun(new Vector3(0.1f, -1, 0).ToQuaternion(Vector3.UnitY), new Vector4(1, 0.97f, 0.92f, 120), 300, 100, 70, 40, 10, 1); GLThread.OnUpdate += (o, e) => { var kb = OpenTK.Input.Keyboard.GetState(); if(kb.IsKeyDown(OpenTK.Input.Key.U)) { var quat = Quaternion.FromAxisAngle(sun.Orientation.GetTangent(MathExtensions.TangentDirection.Left), -0.01f); sun.Orientation = Quaternion.Multiply(sun.Orientation, quat); } if(kb.IsKeyDown(OpenTK.Input.Key.J)) { var quat = Quaternion.FromAxisAngle(sun.Orientation.GetTangent(MathExtensions.TangentDirection.Left), 0.01f); sun.Orientation = Quaternion.Multiply(sun.Orientation, quat); } if(kb.IsKeyDown(OpenTK.Input.Key.H)) { var quat = Quaternion.FromAxisAngle(Vector3.UnitY, -0.01f); sun.Orientation = Quaternion.Multiply(sun.Orientation, quat); } if(kb.IsKeyDown(OpenTK.Input.Key.K)) { var quat = Quaternion.FromAxisAngle(Vector3.UnitY, 0.01f); sun.Orientation = Quaternion.Multiply(sun.Orientation, quat); } };*/ List<Mesh3d> nodes1 = new List<Mesh3d>(); List<Mesh3d> leaves1 = new List<Mesh3d>(); Random rand = new Random(); for(int x = 0; x < 3; x++) { for(int z = 0; z < 3; z++) { var tree = TreeGenerator.CreateTree(MathHelper.DegreesToRadians(30), MathHelper.DegreesToRadians(45), 4, 4, 6666, 0.3f, true); var scale = (float)rand.NextDouble() * 2 + 1; var tx = (float)rand.NextDouble() * 2 + 4; var ty = (float)rand.NextDouble() * 2 + 4; var mergedNodes = tree[0].Merge(); mergedNodes.Translate(x * 5 + tx, 0, z * 5 + ty); mergedNodes.Scale(scale); nodes1.Add(mergedNodes); var mergedLeaves = tree[1].Merge(); mergedLeaves.Translate(x * 5 + tx, 0, z * 5 + ty); mergedLeaves.Scale(scale); leaves1.Add(mergedLeaves); //tree[0].ObjectInfo.FreeCPUMemory(); //tree[1].ObjectInfo.FreeCPUMemory(); } } Mesh3d singleNodes = Mesh3d.Merge(nodes1); Mesh3d singleLeaves = Mesh3d.Merge(leaves1); foreach(var o in nodes1) o.MainObjectInfo.FreeCPUMemory(); foreach(var o in leaves1) o.MainObjectInfo.FreeCPUMemory(); InstancedMesh3d nodes = new InstancedMesh3d(singleNodes.MainObjectInfo, singleNodes.MainMaterial); InstancedMesh3d leaves = new InstancedMesh3d(singleLeaves.MainObjectInfo, singleLeaves.MainMaterial); for(int x = 0; x < 1; x++) { for(int z = 0; z < 1; z++) { nodes.Transformations.Add(new TransformationManager(new Vector3(x * 50, 0, z * 50))); leaves.Transformations.Add(new TransformationManager(new Vector3(x * 50, 0, z * 50))); } } nodes.UpdateMatrix(); leaves.UpdateMatrix(); Add(nodes); Add(leaves); /*GLThread.CreateTimer(() => { GLThread.Invoke(() => read()); }, 2000).Start();*/ Object3dInfo waterInfo = Object3dGenerator.CreateTerrain(new Vector2(-200, -200), new Vector2(200, 200), new Vector2(100, 100), Vector3.UnitY, 333, (x, y) => 0); var color = GenericMaterial.FromMedia("checked.png"); //color.SetBumpMapFromMedia("lightref.png"); Mesh3d water = new Mesh3d(waterInfo, color); water.SetMass(0); water.Translate(0, 0, 0); water.SetCollisionShape(new BulletSharp.StaticPlaneShape(Vector3.UnitY, 0)); Add(water); }
public OldCityScene() { var scene = Object3dInfo.LoadSceneFromObj(Media.Get("cryteksponza.obj"), Media.Get("cryteksponza.mtl"), 0.03f); //var instances = InstancedMesh3d.FromMesh3dList(testroom); foreach(var ob in scene) { ob.SetMass(0); //ob.SetCollisionShape(ob.MainObjectInfo.GetAccurateCollisionShape()); //ob.SpecularComponent = 0.1f; //ob.MainMaterial.ReflectionStrength = ob.MainMaterial.SpecularComponent; //ob.SetCollisionShape(ob.ObjectInfo.GetAccurateCollisionShape()); // ob.Material = new SolidColorMaterial(new Vector4(1, 1, 1, 0.1f)); //(ob.MainMaterial as GenericMaterial).Type = GenericMaterial.MaterialType.WetDrops; //(ob.MainMaterial as GenericMaterial).BumpMap = null; this.Add(ob); } PathTracer tracer = new PathTracer(); tracer.PrepareTrianglesData(scene); //var protagonist = Object3dInfo.LoadSceneFromObj(Media.Get("protagonist.obj"), Media.Get("protagonist.mtl"), 1.0f); //foreach(var o in protagonist) // Add(o); /* var fountainWaterObj = Object3dInfo.LoadFromObjSingle(Media.Get("turbinegun.obj")); var water = new Mesh3d(fountainWaterObj, new GenericMaterial(new Vector4(1, 1, 1, 1))); water.Transformation.Scale(1.0f); water.Translate(0, 10, 0); Add(water);*/ Object3dInfo waterInfo = Object3dGenerator.CreateTerrain(new Vector2(-200, -200), new Vector2(200, 200), new Vector2(100, 100), Vector3.UnitY, 333, (x, y) => 0); var color = GenericMaterial.FromMedia("checked.png"); color.SetNormalMapFromMedia("stones_map.png"); //color.SetBumpMapFromMedia("lightref.png"); Mesh3d water2 = new Mesh3d(waterInfo, color); water2.SetMass(0); water2.Translate(0, 0.1f, 0); water2.MainMaterial.ReflectionStrength = 1; //water.SetCollisionShape(new BulletSharp.StaticPlaneShape(Vector3.UnitY, 0)); Add(water2); var dragon3dInfo = Object3dInfo.LoadFromObjSingle(Media.Get("apple.obj")); dragon3dInfo.ScaleUV(0.1f); var mat = GenericMaterial.FromMedia("skin.jpg"); var dragon = new Mesh3d(dragon3dInfo, mat); //mat.Type = GenericMaterial.MaterialType.WetDrops; //dragon.Scale(5); dragon.SetMass(0); dragon.SetCollisionShape(dragon3dInfo.GetAccurateCollisionShape()); Add(dragon); /* Object3dInfo waterInfo = Object3dGenerator.CreateTerrain(new Vector2(-200, -200), new Vector2(200, 200), new Vector2(100, 100), Vector3.UnitY, 333, (x, y) => 0); var color = new GenericMaterial(Color.Green); color.SetBumpMapFromMedia("grassbump.png"); color.Type = GenericMaterial.MaterialType.Grass; Mesh3d water = new Mesh3d(waterInfo, color); water.SetMass(0); water.Translate(0, 1, 0); water.SetCollisionShape(new BulletSharp.StaticPlaneShape(Vector3.UnitY, 0)); Add(water); var dragon3dInfo = Object3dInfo.LoadFromRaw(Media.Get("lucymidres.vbo.raw"), Media.Get("lucymidres.indices.raw")); dragon3dInfo.ScaleUV(0.1f); var dragon = new Mesh3d(dragon3dInfo, new GenericMaterial(Color.White)); //dragon.Translate(0, 0, 20); dragon.Scale(80); Add(dragon); */ }
public ManyCubesScene() { Object3dInfo wall = Object3dGenerator.CreateCube(new Vector3(10.0f, 10.0f, 1.0f), new Vector2(1, 1)); InstancedMesh3d wallsInst = new InstancedMesh3d(wall, new GenericMaterial(Color.Red)); wallsInst.Transformations.Add(new TransformationManager(new Vector3(0, 5, 10), Quaternion.Identity, 1)); wallsInst.Transformations.Add(new TransformationManager(new Vector3(0, 5, -10), Quaternion.Identity, 1)); wallsInst.Transformations.Add(new TransformationManager(new Vector3(10, 5, 0), Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.PiOver2), 1)); wallsInst.Transformations.Add(new TransformationManager(new Vector3(-10, 5, 0), Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.PiOver2), 1)); wallsInst.Instances = 4; wallsInst.UpdateMatrix(); World.Root.CreateRigidBody(0, wallsInst.Transformations[0].GetWorldTransform(), new BulletSharp.BoxShape(wall.GetAxisAlignedBox()/2), null); World.Root.CreateRigidBody(0, wallsInst.Transformations[1].GetWorldTransform(), new BulletSharp.BoxShape(wall.GetAxisAlignedBox() / 2), null); World.Root.CreateRigidBody(0, wallsInst.Transformations[2].GetWorldTransform(), new BulletSharp.BoxShape(wall.GetAxisAlignedBox() / 2), null); World.Root.CreateRigidBody(0, wallsInst.Transformations[3].GetWorldTransform(), new BulletSharp.BoxShape(wall.GetAxisAlignedBox() / 2), null); Add(wallsInst); World.Root.CreateRigidBody(0, Matrix4.Identity, new BulletSharp.StaticPlaneShape(Vector3.UnitY, 0), null); /* var roadtile = Object3dGenerator.CreateGround(new Vector2(-0.47f, -0.5f) * 20, new Vector2(0.47f, 0.5f) * 20, new Vector2(1, 1), Vector3.UnitY); var roadsInstances = new InstancedMesh3d(roadtile, GenericMaterial.FromMedia("roadtex.png", "roadnormaltex.png")); var advancer = new Vector3(0, 0, (roadtile.GetAxisAlignedBox() * 2).Z); roadsInstances.Transformations.Add(new TransformationManager(new Vector3(0, 0.1f, 0))); for(int i = 0; i < 120; i++) { roadsInstances.Transformations.Add(new TransformationManager(new Vector3(0, 0.1f, 0) + advancer * i)); } roadsInstances.UpdateMatrix(); Add(roadsInstances);*/ //Object3dInfo cube = Object3dGenerator.CreateCube(new Vector3(1, 1, 1), new Vector2(1, 1)); var cube = Object3dInfo.LoadFromObjSingle(Media.Get("portalcube.obj")); cube.MakeDoubleFaced(); GenericMaterial material = new GenericMaterial(new Vector4(1, 1, 1, 1.000f)); int allCount = 0; var meshes = new List<Mesh3d>(); Mesh3d lastmesh = null; var rand = new Random(); var sphere3dInfo = Object3dInfo.LoadFromObjSingle(Media.Get("lightsphere.obj")); sphere3dInfo.Normalize(); for(int y = 0; y < 100; y++) { Mesh3d mesh = new Mesh3d(cube, material); mesh.DisableDepthWrite = true; mesh.Transformation.SetPosition(new Vector3(0, (y + 10.0f) * 12.0f, 0)); Vector3 scaleRand = new Vector3((float)rand.NextDouble() * 6.0f + 5.0f, (float)rand.NextDouble() * 6.0f + 5.0f, (float)rand.NextDouble() * 6.0f + 5.0f); mesh.SetMass(11.0f); mesh.Transformation.Scale(1); mesh.SetCollisionShape(new BulletSharp.BoxShape(cube.GetAxisAlignedBox() / 2)); meshes.Add(mesh); World.Root.PhysicalWorld.AddCollisionObject(mesh.CreateRigidBody()); if(lastmesh != null) { //var offset = (mesh.Transformation.GetPosition() - lastmesh.Transformation.GetPosition()) / 2; //var cst = new BulletSharp.FixedConstraint(mesh.PhysicalBody, lastmesh.PhysicalBody, (-offset).ToMatrix(), offset.ToMatrix()); //World.Root.PhysicalWorld.AddConstraint(cst, true); } lastmesh = mesh; } var inst = InstancedMesh3d.FromSimilarMesh3dList(meshes); GLThread.OnUpdate += (o, e) => { inst.UpdateMatrix(); //wallsInst.UpdateMatrix(); }; Add(inst); Console.WriteLine("allCount " + allCount); }
public SculptScene() { var sun = new Sun(new Vector3(0.1f, -1, 0).ToQuaternion(Vector3.UnitY), new Vector4(1, 0.97f, 0.92f, 120), 300, 100, 70, 40, 10, 1); GLThread.OnUpdate += (o, e) => { var kb = OpenTK.Input.Keyboard.GetState(); if(kb.IsKeyDown(OpenTK.Input.Key.U)) { var quat = Quaternion.FromAxisAngle(sun.Orientation.GetTangent(MathExtensions.TangentDirection.Left), -0.01f); sun.Orientation = Quaternion.Multiply(sun.Orientation, quat); } if(kb.IsKeyDown(OpenTK.Input.Key.J)) { var quat = Quaternion.FromAxisAngle(sun.Orientation.GetTangent(MathExtensions.TangentDirection.Left), 0.01f); sun.Orientation = Quaternion.Multiply(sun.Orientation, quat); } if(kb.IsKeyDown(OpenTK.Input.Key.H)) { var quat = Quaternion.FromAxisAngle(Vector3.UnitY, -0.01f); sun.Orientation = Quaternion.Multiply(sun.Orientation, quat); } if(kb.IsKeyDown(OpenTK.Input.Key.K)) { var quat = Quaternion.FromAxisAngle(Vector3.UnitY, 0.01f); sun.Orientation = Quaternion.Multiply(sun.Orientation, quat); } }; var skysphere = Object3dInfo.LoadFromObjSingle(Media.Get("skyicosphere.obj")); var skymesh = new Mesh3d(skysphere, new GenericMaterial(Color.SkyBlue)); skymesh.Scale(8000); skymesh.MainMaterial.IgnoreLighting = true; Add(skymesh); var dragon3dInfo = Object3dInfo.LoadFromObjSingle(Media.Get("apple.obj")); dragon3dInfo.ScaleUV(0.1f); var mat = GenericMaterial.FromMedia("skin.jpg"); var dragon = new Mesh3d(dragon3dInfo, mat); //mat.Type = GenericMaterial.MaterialType.WetDrops; dragon.Translate(0, 0, 20); //dragon.Scale(5); dragon.SetMass(0); dragon.SetCollisionShape(dragon3dInfo.GetAccurateCollisionShape()); Add(dragon); /* var planeinfo = Object3dGenerator.CreateTerrain(new Vector2(-100, -100), new Vector2(100, 100), new Vector2(50, 50), Vector3.UnitY, 300, (x, y) => 0); var plane = new Mesh3d(planeinfo, new GenericMaterial(Color.Gainsboro)); (plane.MainMaterial as GenericMaterial).SetBumpMapFromMedia("bumpy.jpg"); Add(plane);*/ //var text = new Text(0.0f, 0.5f, "Hello żółć 汉语 / 漢語; Hànyǔ or 中文; Zhōngwén", "Segoe UI", 24, Color.White); //World.Root.UI.Elements.Add(text); /* var tree = TreeGenerator.CreateTreeSingle(MathHelper.DegreesToRadians(30), MathHelper.DegreesToRadians(45), 5, 5, 6666, 0.3f, false, true); Mesh3d nodes = tree[0]; foreach(var t in tree) Add(t); Random rand = new Random(); GLThread.OnUpdate += (o, e) => { foreach(var b in nodes.Bones) { if(b.Name == "root" || b.Name == "rootofroot") continue; var orient = b.Orientation; var randomQuat = Quaternion.Multiply(Quaternion.FromAxisAngle(Vector3.UnitX, (float)rand.NextDouble() - 0.5f), Quaternion.FromAxisAngle(Vector3.UnitZ, (float)rand.NextDouble() - 0.5f)); var neworient = Quaternion.Slerp(orient, randomQuat, 0.11f); b.Orientation = neworient; } };*/ }