public override bool Load() { if (IsLoaded) { return(true); } if (base.Load()) { this.entityHandle = MogitorsRoot.Instance.SceneManager.CreateEntity(Name, MeshFile); this.handle.AttachObject(this.entityHandle); this.entityHandle.QueryFlags = QueryFlags.Movable; this.entityHandle.CastShadows = this.castShadows; for (int i = 0; i < subMeshes.Count; ++i) { this.entityHandle.GetSubEntity((uint)i).SetVisible(this.subMeshes[i].Visible); this.entityHandle.GetSubEntity((uint)i).MaterialName = this.subMeshes[i].Material; } if (this.subMeshes.Count == 0) { SubMeshData data = new SubMeshData(); for (int i = 0; i < this.entityHandle.NumSubEntities; ++i) { data.Visible = this.entityHandle.GetSubEntity((uint)i).IsVisible; data.Material = this.entityHandle.GetSubEntity((uint)i).MaterialName; this.subMeshes.Add(data); } } } else { return(false); } return(true); }
public static SubMeshData ReadXMLMesh() { var loaded = DataContainer.Load(Path.Combine(Application.dataPath, Program.gameScene.Terreno.name + ".xml")); Debug.Log("ReadXMLMesh: " + Path.Combine(Application.dataPath, Program.gameScene.Terreno.name + ".xml")); ProgramData1 = ReadXMLProgram(); SubMeshData res = null; if (loaded != null) { res = loaded.SubMeshData; } ////if the FBX is newer than the pertaining XML will return null ////in that way ScanTerra() in MeshController.cs will fire up //if (IsFBXNewerThanXML()) //{ // res = null; //} ////if ress is null I will delete the Spawneed.xml for this terrain //if (res == null) //{ // File.Delete(dataPath + "/" + Program.gameScene.Terreno.name + ".Spawned" + ".xml"); //} return(res); }
/// <summary> /// Trys to load submesh from file.. if cant will scan the terrain /// </summary> /// <param name="inPolyDiv">how many div ex 5x5 a real poly will have</param> /// <param name="polyX">real polys in X will cover in each scan pass</param> /// <param name="polyZ">real polys in Z will cover in each scan pass</param> void LoadMeshFromFile(int inPolyDiv, int polyX, int polyZ) { iniTerr.InitializeLotStepVal(ref nextStart, subDivide, wholeMalla, Vertices, ref lotStepX, ref lotStepZ, inPolyDiv, polyX, polyZ); subMesh = XMLSerie.ReadXMLMesh(); if (subMesh == null) { print("error loading .XML: "); IsLoading = true; isTerraScanning = true; subMesh = new SubMeshData(); return; } //print(subMesh.amountOfSubVertices + " subMesh.amountOfSubVertices"); float dist = 0.001f; Malla.Lots = subMesh.AllSubMeshedLots; for (int i = 0; i < Malla.Lots.Count; i++) { for (int j = 0; j < Malla.Lots[i].LotVertices.Count; j++) { AllVertexs.Add(Malla.Lots[i].LotVertices[j]); } } //print(AllVertexs.Count + ".AllVertexs.count. in mshContrl"); }
public static void WriteXMLMesh(SubMeshData subMesh) { DataContainer DataCollection = new DataContainer(); DataCollection.SubMeshData = subMesh; DataCollection.Save(Path.Combine(dataPath, Program.gameScene.Terreno.name + ".xml")); }
private SubMeshData GetSubMesh(int index) { while (index >= this.subMeshes.Count) { SubMeshData temp = new SubMeshData(); temp.Visible = true; temp.Material = ""; this.subMeshes.Add(temp); } return(this.subMeshes[index]); }
public static void CopySubMesh(SubMesh dstSubMesh, SubMesh srcSubMesh, SubMeshData subMeshData) { dstSubMesh.OperationType = srcSubMesh.OperationType; dstSubMesh.useSharedVertices = srcSubMesh.useSharedVertices; dstSubMesh.MaterialName = srcSubMesh.MaterialName; CopyIndexData(dstSubMesh.IndexData, srcSubMesh.IndexData, subMeshData.VertexIdMap); if (!srcSubMesh.useSharedVertices) { dstSubMesh.useSharedVertices = false; dstSubMesh.vertexData = new VertexData(); CopyVertexData(dstSubMesh.VertexData, srcSubMesh.VertexData, subMeshData.VertexIdMap); CopyBoneAssignments(dstSubMesh, srcSubMesh, subMeshData.VertexIdMap); } Debug.Assert(srcSubMesh.VertexAnimationType == VertexAnimationType.None); }
public void AddSubmeshData(SubMesh subMesh) { SubMeshData smd = null; if (!subMesh.useSharedVertices) { smd = new SubMeshData(subMesh.VertexData); } else { if (sharedSubMeshData == null) { sharedSubMeshData = new SubMeshData(subMesh.VertexData); } smd = sharedSubMeshData; } smd.AddSubmesh(subMesh); subMeshDataMap[subMesh.Name] = smd; }
public static MeshData FullScreenQuad() { Vertex[] quadVertices = { new Vertex(new vec3(-1f, 1f, 0), new vec3(0, 0, 1), new vec2(0, 1)), new Vertex(new vec3(1f, 1f, 0), new vec3(0, 0, 1), new vec2(1, 1)), new Vertex(new vec3(-1f, -1f, 0), new vec3(0, 0, 1), new vec2(0, 0)), new Vertex(new vec3(1f, -1f, 0), new vec3(0, 0, 1), new vec2(1, 0)) }; UInt32[] quadIndices = { 0, 1, 2, 2, 1, 3 }; SubMeshData subMesh = new SubMeshData(quadVertices, quadIndices); MeshData meshData = new MeshData(); meshData.subMeshes = new[] { subMesh }; return(meshData); }
// Use this for initialization void Start() { camera = USearch.FindCurrentCamera(); Malla = (Malla)General.Create(Root.malla, container: Program.ClassContainer.transform); Poly = new UPoly(); subDivide = new SubDivider(); Vertex = new Vertexer(); iniTerr = new InitializerTerrain(); iniTerr.Initializer(ref Vertices, ref mesh); iniTerr.InitializeMallaStats(Vertices, ref wholeMalla, ref nextStart, ref zLot); SubPolyr = new SubPolyr(); subMesh = new SubMeshData(); IsLoading = true; //bz is static and if a new game is started needs to clean up and start again CrystalManager1 = new CrystalManager(); }
public void AddSubMesh(Mesh subMesh, MeshChecker checker) { foreach (var v in subMeshList) { if (v.meshObject == subMesh) { return; } } SubMeshData data = new SubMeshData(); data.meshObject = subMesh; data.format = GetMeshFormat(subMesh); data.name = subMesh.name; data.vertexCount = subMesh.vertexCount; data.tranCount = subMesh.triangles.Length / 3; subMeshList.Add(data); //重算总体顶点以及面数 checkMap[checker.meshSubMeshCount] = subMeshList.Count; checkMap[checker.meshVertexCount] = subMeshList.Sum(x => x.vertexCount); checkMap[checker.meshTrangleCount] = subMeshList.Sum(x => x.tranCount); }
public override bool Load() { if (IsLoaded) return true; if (base.Load()) { this.entityHandle = MogitorsRoot.Instance.SceneManager.CreateEntity(Name, MeshFile); this.handle.AttachObject(this.entityHandle); this.entityHandle.QueryFlags = QueryFlags.Movable; this.entityHandle.CastShadows = this.castShadows; for (int i = 0; i < subMeshes.Count; ++i) { this.entityHandle.GetSubEntity((uint)i).SetVisible(this.subMeshes[i].Visible); this.entityHandle.GetSubEntity((uint)i).MaterialName = this.subMeshes[i].Material; } if (this.subMeshes.Count == 0) { SubMeshData data = new SubMeshData(); for (int i = 0; i < this.entityHandle.NumSubEntities; ++i) { data.Visible = this.entityHandle.GetSubEntity((uint)i).IsVisible; data.Material = this.entityHandle.GetSubEntity((uint)i).MaterialName; this.subMeshes.Add(data); } } } else { return false; } return true; }
private SubMeshData GetSubMesh(int index) { while (index >= this.subMeshes.Count) { SubMeshData temp = new SubMeshData(); temp.Visible = true; temp.Material = ""; this.subMeshes.Add(temp); } return this.subMeshes[index]; }
public static MeshData UnitCube() { Vertex[] cubeVertices = { //front /*0-0*/ new Vertex(new vec3(-0.5f, -0.5f, 0.5f), new vec3(0, 0, 1), new vec2(0, 0)), /*1-1*/ new Vertex(new vec3(0.5f, -0.5f, 0.5f), new vec3(0, 0, 1), new vec2(1, 0)), /*2-2*/ new Vertex(new vec3(0.5f, 0.5f, 0.5f), new vec3(0, 0, 1), new vec2(1, 1)), /*3-3*/ new Vertex(new vec3(-0.5f, 0.5f, 0.5f), new vec3(0, 0, 1), new vec2(0, 1)), //right /*6-4*/ new Vertex(new vec3(0.5f, 0.5f, -0.5f), new vec3(1, 0, 0), new vec2(1, 0)), /*5-5*/ new Vertex(new vec3(0.5f, -0.5f, -0.5f), new vec3(1, 0, 0), new vec2(0, 0)), /*1-6*/ new Vertex(new vec3(0.5f, -0.5f, 0.5f), new vec3(1, 0, 0), new vec2(0, 1)), /*2-7*/ new Vertex(new vec3(0.5f, 0.5f, 0.5f), new vec3(1, 0, 0), new vec2(1, 1)), //back /*5-8*/ new Vertex(new vec3(0.5f, -0.5f, -0.5f), new vec3(0, 0, -1), new vec2(1, 0)), /*6-9*/ new Vertex(new vec3(0.5f, 0.5f, -0.5f), new vec3(0, 0, -1), new vec2(1, 1)), /*7-10*/ new Vertex(new vec3(-0.5f, 0.5f, -0.5f), new vec3(0, 0, -1), new vec2(0, 1)), /*4-11*/ new Vertex(new vec3(-0.5f, -0.5f, -0.5f), new vec3(0, 0, -1), new vec2(0, 0)), //left /*3-12*/ new Vertex(new vec3(-0.5f, 0.5f, 0.5f), new vec3(-1, 0, 0), new vec2(1, 1)), /*0-13*/ new Vertex(new vec3(-0.5f, -0.5f, 0.5f), new vec3(-1, 0, 0), new vec2(0, 1)), /*4-14*/ new Vertex(new vec3(-0.5f, -0.5f, -0.5f), new vec3(-1, 0, 0), new vec2(0, 0)), /*7-15*/ new Vertex(new vec3(-0.5f, 0.5f, -0.5f), new vec3(-1, 0, 0), new vec2(1, 0)), //bottom /*1-16*/ new Vertex(new vec3(0.5f, -0.5f, 0.5f), new vec3(0, -1, 0), new vec2(1, 1)), /*5-17*/ new Vertex(new vec3(0.5f, -0.5f, -0.5f), new vec3(0, -1, 0), new vec2(1, 0)), /*4-18*/ new Vertex(new vec3(-0.5f, -0.5f, -0.5f), new vec3(0, -1, 0), new vec2(0, 0)), /*0-19*/ new Vertex(new vec3(-0.5f, -0.5f, 0.5f), new vec3(0, -1, 0), new vec2(0, 1)), //top /*6-20*/ new Vertex(new vec3(0.5f, 0.5f, -0.5f), new vec3(0, 1, 0), new vec2(1, 0)), /*2-21*/ new Vertex(new vec3(0.5f, 0.5f, 0.5f), new vec3(0, 1, 0), new vec2(1, 1)), /*3-22*/ new Vertex(new vec3(-0.5f, 0.5f, 0.5f), new vec3(0, 1, 0), new vec2(0, 1)), /*7-23*/ new Vertex(new vec3(-0.5f, 0.5f, -0.5f), new vec3(0, 1, 0), new vec2(0, 0)), }; UInt32[] cubeIndices = { //front 2, 1, 0, 0, 3, 2, // right 4, 5, 6, 6, 7, 4, // back 8, 9, 10, 10, 11, 8, // left 12, 13, 14, 14, 15, 12, // bottom 16, 17, 18, 18, 19, 16, // top 20, 21, 22, 22, 23, 20 }; //Vertex[] cubeVertices = { // /*0*/ new Vertex(new vec3(-1.0f, -1.0f, 1.0f), new vec3(0, 0, 0), new vec2(0, 1)), // /*1*/ new Vertex(new vec3(1.0f, -1.0f, 1.0f), new vec3(0, 0, 0), new vec2(0, 1)), // /*2*/ new Vertex(new vec3(1.0f, 1.0f, 1.0f), new vec3(0, 0, 0), new vec2(0, 1)), // /*3*/ new Vertex(new vec3(-1.0f, 1.0f, 1.0f), new vec3(0, 0, 0), new vec2(0, 1)), // /*4*/ new Vertex(new vec3(-1.0f, -1.0f, -1.0f), new vec3(0, 0, 0), new vec2(0, 1)), // /*5*/ new Vertex(new vec3(1.0f, -1.0f, -1.0f), new vec3(0, 0, 0), new vec2(0, 1)), // /*6*/ new Vertex(new vec3(1.0f, 1.0f, -1.0f), new vec3(0, 0, 0), new vec2(0, 1)), // /*7*/ new Vertex(new vec3(-1.0f, 1.0f, -1.0f), new vec3(0, 0, 0), new vec2(0, 1)) //}; //ushort[] cubeIndices = { // //front // 2, 1, 0, // 0, 3, 2, // // right // 6, 5, 1, // 1, 2, 6, // // back // 5, 6, 7, // 7, 4, 5, // // left // 3, 0, 4, // 4, 7, 3, // // bottom // 1, 5, 4, // 4, 0, 1, // // top // 6, 2, 3, // 3, 7, 6 //}; /* * //Counter clockwise winding * ushort[] cubeIndices = { * //front * 0, 1, 2, * 2, 3, 0, * // right * 1, 5, 6, * 6, 2, 1, * // back * 7, 6, 5, * 5, 4, 7, * // left * 4, 0, 3, * 3, 7, 4, * // bottom * 4, 5, 1, * 1, 0, 4, * // top * 3, 2, 6, * 6, 7, 3 };*/ SubMeshData subMesh = new SubMeshData(cubeVertices, cubeIndices); MeshData meshData = new MeshData(); meshData.subMeshes = new[] { subMesh }; return(meshData); }
protected internal override void Draw(double deltaTime) { var objects = MMW.FindGameObjects((obj) => obj.Enabled && !obj.Destroyed /*&& obj.Layer < GameObject.LayerUI && layerMask.Get(obj.Layer)*/); var drawMeshDic = new Dictionary <Shader, Dictionary <Material, List <SubMeshData> > >(); var animList = new List <AAnimator>(); var morphList = new List <AMorpher>(); var wp = Transform.WorldPosition; var distDic = new Dictionary <GameObject, float>(); var distTask = Task.Factory.StartNew(() => { foreach (var obj in objects) { var dist = (wp - obj.Transform.WorldPosition).Length; distDic.Add(obj, dist); } }); // オブジェクトレイヤ抽出 //DrawableGameComponent[] meshComs = null; DrawableGameComponent[] beforeComs = null; DrawableGameComponent[] afterComs = null; //DrawableGameComponent[] uiMeshComs = null; DrawableGameComponent[] uiComs = null; var layerSortTask = Task.Factory.StartNew(() => { var draws = MMW.FindGameComponents <DrawableGameComponent>(c => c.Enabled && !c.Destroyed && !(c is MeshRenderer)); //var meshList = new List<DrawableGameComponent>(); var beforeList = new List <DrawableGameComponent>(); var afterList = new List <DrawableGameComponent>(); var uiList = new List <DrawableGameComponent>(); //var uiMeshList = new List<DrawableGameComponent>(); foreach (var d in draws) { if (d.Layer < LayerAfterMeshRender) { beforeList.Add(d); } else if (d.Layer < LayerUI) { afterList.Add(d); } else { uiList.Add(d); } //if (d.Layer < LayerUI) meshList.Add(d); //else uiMeshList.Add(d); } beforeList.Sort((a, b) => a.Layer - b.Layer); afterList.Sort((a, b) => a.Layer - b.Layer); uiList.Sort((a, b) => a.Layer - b.Layer); //meshList.Sort((a, b) => a.Layer - b.Layer); //uiMeshList.Sort((a, b) => a.Layer - b.Layer); //var meshObjs = objects.ToArray(); //var beforeObjs = Array.FindAll(objects, (o) => o.Layer >= 0 && o.Layer < GameObject.LayerAfterRender); //var afterObjs = Array.FindAll(objects, (o) => o.Layer >= GameObject.LayerAfterRender); //var uiObjs = MMW.FindGameObjects((obj) => obj.Layer >= GameObject.LayerUI && layerMask.Get(obj.Layer)); //Array.Sort(meshObjs, (a, b) => a.Layer - b.Layer); //Array.Sort(beforeObjs, (a, b) => a.Layer - b.Layer); //Array.Sort(afterObjs, (a, b) => a.Layer - b.Layer); //Array.Sort(uiObjs, (a, b) => a.Layer - b.Layer); /* * foreach (var obj in meshObjs) * { * var coms = obj.GetComponents<DrawableGameComponent>((c) => c.Enabled && !(c is MeshRenderer)); * meshList.AddRange(coms); * } * foreach (var obj in beforeObjs) * { * var coms = obj.GetComponents<DrawableGameComponent>((c) => c.Enabled && !(c is MeshRenderer)); * beforeList.AddRange(coms); * } * foreach (var obj in afterObjs) * { * var coms = obj.GetComponents<DrawableGameComponent>((c) => c.Enabled && !(c is MeshRenderer)); * afterList.AddRange(coms); * } * foreach (var obj in uiObjs) * { * var coms = obj.GetComponents<DrawableGameComponent>((c) => c.Enabled && !(c is MeshRenderer)); * uiList.AddRange(coms); * } */ //meshComs = meshList.ToArray(); beforeComs = beforeList.ToArray(); afterComs = afterList.ToArray(); uiComs = uiList.ToArray(); //uiMeshComs = uiMeshList.ToArray(); }); // ライト情報を抽出 var lights = new List <BufferLight>(); var lightExtractTask = Task.Factory.StartNew(() => { foreach (var obj in objects) { var pls = obj.GetComponents <PointLight>(); foreach (var pl in pls) { var l = new BufferLight() { color = pl.Color.ToVector4(), pos = new Vector4(pl.Transform.WorldPosition), dir = -Vector4.UnitY, intensity = pl.Intensity, radius = pl.Radius, specCoeff = pl.SpecularCoeff, innerDot = -1.0f, outerDot = -1.0f, }; lights.Add(l); } var sls = obj.GetComponents <SpotLight>(); foreach (var sl in sls) { var l = new BufferLight() { color = sl.Color.ToVector4(), pos = new Vector4(sl.Transform.WorldPosition), dir = new Vector4(sl.WorldDirection, 0.0f), intensity = sl.Intensity, radius = sl.Radius, specCoeff = sl.SpecularCoeff, innerDot = sl.InnerDot, outerDot = sl.OuterDot, }; lights.Add(l); } } lights = lights.Take(2048).ToList(); }); var clipDic = new Dictionary <GameObject, bool>(); var clipTask = Task.Factory.StartNew(() => { distTask.Wait(); foreach (var obj in objects) { var mr = obj.GetComponent <MeshRenderer>(); if (mr == null || !mr.Enabled) { clipDic.Add(obj, true); continue; } if (mr.ForceRendering) { clipDic.Add(obj, false); continue; } if (distDic[obj] < ForceRenderDistance) { clipDic.Add(obj, false); continue; } var clip = true; var b = mr.Mesh.Bounds; var mvp = obj.Transform.WorldTransform * ViewProjection; var mint = new Vector4(b.Min, 1.0f) * mvp; var maxt = new Vector4(b.Max, 1.0f) * mvp; var min = mint.Xyz / mint.W; var max = maxt.Xyz / maxt.W; var xx = new float[] { min.X, max.X }; var yy = new float[] { min.Y, max.Y }; var zz = new float[] { min.Z, max.Z }; foreach (var x in xx) { foreach (var y in yy) { foreach (var z in zz) { if ( x > -1.5f && x < 1.5f && y > -1.5f && y < 1.5f && z > -1.0f && z < 1.0f) { clip = false; break; } } if (!clip) { break; } } if (!clip) { break; } } clipDic.Add(obj, clip); } }); var animTasks = new List <Task>(); var findAnimTask = Task.Factory.StartNew(() => { clipTask.Wait(); distTask.Wait(); foreach (var obj in objects) { if (!obj.Enabled) { continue; } if (clipDic[obj]) { continue; } var animator = obj.GetComponent <AAnimator>(); var morpher = obj.GetComponent <AMorpher>(); if (animator != null && animator.Enabled) { if (animator.EnableAsyncCalc) { animTasks.Add(Task.Run(() => animator.CalcTransform())); } animList.Add(animator); } if (morpher != null && morpher.Enabled && distDic[obj] < 10.0f) { if (morpher.EnableAsyncCalc) { animTasks.Add(Task.Run(() => morpher.CalcMorph())); } morphList.Add(morpher); } } }); List <MeshRenderer> renderers = new List <MeshRenderer>(); if (MeshDraw) { Matrix4 proj; if (Orthographic) { proj = Matrix4.CreateOrthographic(TargetTexture.Size.Width, TargetTexture.Size.Height, Near, Far); } proj = Matrix4.CreatePerspectiveFieldOfView(FoV, Aspect, Near, Far); sp.pointLights = null; sp.spotLights = null; sp.camera = this; sp.resolution = new Vector2(TargetTexture.Size.Width, TargetTexture.Size.Height); sp.deltaTime = deltaTime; sp.oldViewProj = sp.viewProj; sp.view = View; sp.proj = proj; sp.cameraPos = wp; sp.cameraDir = WorldDirection; sp.dirLight = MMW.DirectionalLight; var viewproj = sp.view * sp.proj; sp.viewProj = viewproj; sp.viewInverse = sp.view.Inverted(); sp.projInverse = sp.proj.Inverted(); sp.viewProjInverse = sp.viewProj.Inverted(); sp.environmentMap = EnvironmentMap; // 描画準備 clipTask.Wait(); var query = 0; foreach (var obj in objects) { if (!obj.Enabled) { continue; } if (clipDic[obj]) { continue; } var rds = obj.GetComponents <MeshRenderer>(); renderers.AddRange(rds); foreach (var r in rds) { r.query = queries[query++]; } } foreach (var obj in objects) { if (!obj.Enabled) { continue; } if (clipDic[obj]) { continue; } var rds = obj.GetComponents <MeshRenderer>(); var animator = obj.GetComponent <AAnimator>(); var morpher = obj.GetComponent <AMorpher>(); var world = obj.Transform.WorldTransform; var oldWorld = obj.Transform.OldWorldTransfom; foreach (var r in rds) { for (var i = 0; i < r.MaterialCount; i++) { var mat = r.GetMaterialAt(i); if (!drawMeshDic.ContainsKey(mat.Shader)) { drawMeshDic.Add(mat.Shader, new Dictionary <Material, List <SubMeshData> >()); } if (!drawMeshDic[mat.Shader].ContainsKey(mat)) { drawMeshDic[mat.Shader].Add(mat, new List <SubMeshData>()); } } foreach (var sm in r.Mesh.subMeshes) { var mat = r.GetMaterial(sm.materialIndex); var smd = new SubMeshData() { SubMesh = sm, WorldTransform = world, WorldTransformInv = world.Inverted(), OldWorldTransform = oldWorld, Visible = r.Visible, CastShadow = r.CastShadow, GameObject = obj, Morpher = morpher, Animator = animator, OcclusionQuery = r.query, MeshRenderer = r, }; drawMeshDic[mat.Shader][mat].Add(smd); } } } findAnimTask.Wait(); foreach (var task in animTasks) { task.Wait(); } foreach (var a in animList) { if (!a.EnableAsyncCalc) { a.CalcTransform(); } a.UpdateData(); } foreach (var m in morphList) { if (!m.EnableAsyncCalc) { m.CalcMorph(); } m.UpdateData(); } // 影の準備 if (ShadowMapping && MMW.Configuration.ShadowQuality != MMWConfiguration.ShadowQualityType.NoShadow) { Vector3 lightDir = MMW.DirectionalLight.WorldDirection; Vector3 center = wp; Matrix4 view = Matrix4.Identity; Matrix4 projo = Matrix4.Identity; // render to far shadow depth map /* * { * view = Matrix4.LookAt(Vector3.Zero, lightDir, Vector3.UnitY); * projo = Matrix4.CreateOrthographic(240, 240, -150, 150); * sp.viewProj = view * projo; * if (prevLightDir != lightDir) * { * RenderToDepthMap(shadowDepthRT1, sp, drawMeshDic); * } * sp.shadowDepthBias1 = sp.viewProj * shadowDepthBias; * sp.shadowDepthMap1 = shadowDepthRT1.ColorDst0; * }*/ // render to middle shadow depth map { view = Matrix4.LookAt(center, center + lightDir, Vector3.UnitY); projo = Matrix4.CreateOrthographic(40, 40, -150, 150); sp.viewProj = view * projo; RenderToDepthMap(shadowDepthRT2, sp, drawMeshDic); sp.shadowDepthBias2 = sp.viewProj * shadowDepthBias; sp.shadowDepthMap2 = shadowDepthRT2.ColorDst0; } // render to near shadow depth map { view = Matrix4.LookAt(center, center + lightDir, Vector3.UnitY); projo = Matrix4.CreateOrthographic(10, 10, -80, 80); sp.viewProj = view * projo; RenderToDepthMap(shadowDepthRT3, sp, drawMeshDic); sp.shadowDepthBias3 = sp.viewProj * shadowDepthBias; sp.shadowDepthMap3 = shadowDepthRT3.ColorDst0; } sp.viewProj = viewproj; prevLightDir = lightDir; prevCameraPos = center; } } // 遅延描画 deferredRT.Bind(new Color4(0, 0, 0, 0)); // スカイボックス if (ClearFlag == ClearFlag.SkyBox) { var dir = GameObject.Transform.WorldDirectionZ; if (ForceTarget) { dir = (Target - wp).Normalized(); } var mat = Matrix4.LookAt(Vector3.Zero, dir, Up) * Projection; var oldMat = Matrix4.LookAt(Vector3.Zero, prevCameraDir, Up) * Projection; GL.Disable(EnableCap.DepthTest); backShader.UseShader(); backShader.SetParameter(backShader.loc_mvp, ref mat, false); backShader.SetParameter(backShader.loc_oldmvp, ref oldMat, false); backShader.SetParameter(backShader.loc_albedo, SkyBoxColor); backShader.SetParameter(backShader.loc_fog, MMW.FogIntensity); backShader.SetParameter(backShader.loc_fogcolor, MMW.MainCamera.ClearColor); backShader.SetParameter(TextureUnit.Texture0, EnvironmentMap); Drawer.DrawSubMesh(cubeMesh.subMeshes[0]); backShader.UnuseShader(); GL.Enable(EnableCap.DepthTest); prevCameraDir = dir; } // その他スクリプトの描画(メッシュ描画前) if (ScriptDraw) { layerSortTask.Wait(); DrawScripts(beforeComs, (float)deltaTime); DrawMeshScripts(beforeComs, (float)deltaTime); } if (MeshDraw) { // オクルージョン描画 //DrawOcclusionBox(renderers); DrawDeferredMeshes(sp, drawMeshDic); //DrawMeshScripts(meshComs, (float)deltaTime); } // その他スクリプトの描画 if (ScriptDraw) { DrawScripts(afterComs, (float)deltaTime); DrawMeshScripts(afterComs, (float)deltaTime); } // ライトカリング lightExtractTask.Wait(); lightRT.Bind(new Color4(0, 0, 0, 0)); GL.BindBuffer(BufferTarget.ShaderStorageBuffer, ssbo_light); GL.BufferSubData(BufferTarget.ShaderStorageBuffer, (IntPtr)0, lights.Count * 20 * 4, lights.ToArray()); GL.BindBuffer(BufferTarget.ShaderStorageBuffer, ssbo_count); GL.BufferSubData(BufferTarget.ShaderStorageBuffer, (IntPtr)0, initCounts.Length * 4, initCounts); GL.BindBuffer(BufferTarget.ShaderStorageBuffer, 0); lightCullingShader.UseShader(); AAnimator.BindIdentity(1, 2); GL.CullFace(CullFaceMode.Back); GL.BindBufferBase(BufferRangeTarget.ShaderStorageBuffer, 3, ssbo_count); GL.BindBufferBase(BufferRangeTarget.ShaderStorageBuffer, 4, ssbo_index); lightCullingShader.SetParameter(lightCullingShader.loc_resolution, lightRT.Size.ToVector2()); var syncList = new List <IntPtr>(); for (var i = 0; i < lights.Count; i++) { lightCullingShader.SetParameter(lightCullingShader.loc_index, i); var mvp = MatrixHelper.CreateTransform(lights[i].pos.Xyz, Vector3.Zero, new Vector3(lights[i].radius * 1.2f)) * sp.viewProj; lightCullingShader.SetParameter(lightCullingShader.loc_mvp, ref mvp, false); syncList.Add(GL.FenceSync(SyncCondition.SyncGpuCommandsComplete, WaitSyncFlags.None)); Drawer.DrawSubMesh(plMesh.subMeshes[0]); } GL.CullFace(CullFaceMode.Front); lightCullingShader.UnuseShader(); foreach (var sync in syncList) { GL.DeleteSync(sync); } // レンダーターゲットをセット TargetTexture.Bind(); GL.ClearColor(ClearColor); if (ClearFlag == ClearFlag.SolidColor) { GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit | ClearBufferMask.StencilBufferBit); } else if (ClearFlag == ClearFlag.DepthOnly) { GL.Clear(ClearBufferMask.DepthBufferBit | ClearBufferMask.StencilBufferBit); } else if (ClearFlag == ClearFlag.SkyBox) { GL.ClearColor(Color4.White); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit | ClearBufferMask.StencilBufferBit); } // メッシュ描画 if (MeshDraw) { /* * var srcRect = new RectangleF(0, 0, 1.0f, 1.0f); * var dstRect1 = new RectangleF(0, 0, 0.25f, 0.5f); * var dstRect2 = new RectangleF(0, 0.5f, 0.25f, 0.5f); * var dstRect3 = new RectangleF(0.25f, 0, 0.25f, 0.5f); * var dstRect4 = new RectangleF(0.25f, 0.5f, 0.25f, 0.5f); * var dstRect5 = new RectangleF(0.5f, 0, 0.25f, 0.5f); * var dstRect6 = new RectangleF(0.5f, 0.5f, 0.25f, 0.5f); * var dstRect7 = new RectangleF(0.75f, 0, 0.25f, 0.5f); * var dstRect8 = new RectangleF(0.75f, 0.5f, 0.25f, 0.5f); * Drawer.DrawTexture(sp.shadowDepthMap2, srcRect, dstRect1); * Drawer.DrawTexture(sp.shadowDepthMap3, srcRect, dstRect2); * Drawer.DrawTexture(deferredRT.ColorDst2, srcRect, dstRect3); * Drawer.DrawTexture(deferredRT.ColorDst3, srcRect, dstRect4); * Drawer.DrawTexture(deferredRT.ColorDst4, srcRect, dstRect5); * Drawer.DrawTexture(deferredRT.ColorDst5, srcRect, dstRect6); * Drawer.DrawTexture(deferredRT.ColorDst6, srcRect, dstRect7); * Drawer.DrawTexture(deferredRT.ColorDst7, srcRect, dstRect8); */ //Drawer.DrawTexture(lightRT.ColorDst0); sp.ortho = orthoMat; sp.deferredAlbedoMap = deferredRT.ColorDst0; sp.deferredWorldPosMap = deferredRT.ColorDst1; sp.deferredWorldNormalMap = deferredRT.ColorDst2; sp.deferredPhysicalParamsMap = deferredRT.ColorDst3; sp.deferredF0Map = deferredRT.ColorDst4; sp.deferredDepthMap = deferredRT.ColorDst5; sp.deferredShadowMap = deferredRT.ColorDst6; sp.deferredVelocityMap = deferredRT.ColorDst7; deferredShader.UseShader(); deferredShader.SetUniqueParameter(sp, true); GL.BindBufferBase(BufferRangeTarget.ShaderStorageBuffer, 5, ssbo_light); Drawer.DrawTextureMesh(); deferredShader.UnuseShader(); GL.BindBufferBase(BufferRangeTarget.ShaderStorageBuffer, 3, 0); GL.BindBufferBase(BufferRangeTarget.ShaderStorageBuffer, 4, 0); GL.BindBufferBase(BufferRangeTarget.ShaderStorageBuffer, 5, 0); } // イメージエフェクトをかける var effects = GameObject.GetComponents <ImageEffect>(); if (effects != null) { for (var i = 0; i < effects.Length; i++) { if (!effects[i].Enabled) { continue; } if (effects[i].RequireMaps.Contains(RequireMap.Depth)) { effects[i].DepthMap = sp.deferredDepthMap; } if (effects[i].RequireMaps.Contains(RequireMap.Position)) { effects[i].PositionMap = sp.deferredWorldPosMap; } if (effects[i].RequireMaps.Contains(RequireMap.Normal)) { effects[i].NormalMap = sp.deferredWorldNormalMap; } if (effects[i].RequireMaps.Contains(RequireMap.Velocity)) { effects[i].VelocityMap = sp.deferredVelocityMap; } effects[i].Draw(deltaTime); } } GL.Clear(ClearBufferMask.DepthBufferBit); // UI層のゲームオブジェクトを描画 if (UIDraw && layerMask.Get(GameObject.LayerUI)) { DrawScripts(uiComs, (float)deltaTime); DrawMeshScripts(uiComs, (float)deltaTime); } }
public void AddSubmeshData(SubMesh subMesh) { SubMeshData smd = null; if (!subMesh.useSharedVertices) smd = new SubMeshData(subMesh.VertexData); else { if (sharedSubMeshData == null) sharedSubMeshData = new SubMeshData(subMesh.VertexData); smd = sharedSubMeshData; } smd.AddSubmesh(subMesh); subMeshDataMap[subMesh.Name] = smd; }
protected internal virtual void Draw(double deltaTime) { var objects = MMW.FindGameObjects(o => true); var drawMeshDic = new Dictionary <Shader, Dictionary <Material, List <SubMeshData> > >(); var animList = new List <AAnimator>(); var morphList = new List <AMorpher>(); var clipDic = new Dictionary <GameObject, bool>(); var clipTask = Task.Factory.StartNew(() => { foreach (var obj in objects) { var mr = obj.GetComponent <MeshRenderer>(); if (mr == null || !mr.Enabled) { clipDic.Add(obj, true); continue; } var clip = false; var b = mr.Mesh.Bounds; var mvp = obj.Transform.WorldTransform * ViewProjection; var min = new Vector4(b.Min, 1.0f) * mvp; var max = new Vector4(b.Max, 1.0f) * mvp; min /= min.W; max /= max.W; if (min.X < -1.2f && max.X < -1.2f) { clip = true; } if (min.X > 1.2f && max.X > 1.2f) { clip = true; } if (min.Y < -1.2f && max.Y < -1.2f) { clip = true; } if (min.Y > 1.2f && max.Y > 1.2f) { clip = true; } if (min.Z < -1.2f && max.Z < -1.2f) { clip = true; } if (min.Z > 1.2f && max.Z > 1.2f) { clip = true; } clipDic.Add(obj, clip); } }); var animTasks = new List <Task>(); var findAnimTask = Task.Factory.StartNew(() => { clipTask.Wait(); foreach (var obj in objects) { if (!obj.Enabled) { continue; } if (clipDic[obj]) { continue; } var animator = obj.GetComponent <AAnimator>(); var morpher = obj.GetComponent <AMorpher>(); if (animator != null && animator.Enabled) { animTasks.Add(Task.Run(() => animator.CalcTransform())); animList.Add(animator); } if (morpher != null && morpher.Enabled) { animTasks.Add(Task.Run(() => morpher.CalcMorph())); morphList.Add(morpher); } } }); if (MeshDraw) { Matrix4 proj; if (Orthographic) { proj = Matrix4.CreateOrthographic(TargetTexture.Size.Width, TargetTexture.Size.Height, Near, Far); } proj = Matrix4.CreatePerspectiveFieldOfView(FoV, Aspect, Near, Far); sp.pointLights = null; sp.spotLights = null; sp.camera = this; sp.resolution = new Vector2(TargetTexture.Size.Width, TargetTexture.Size.Height); sp.deltaTime = deltaTime; sp.oldViewProj = sp.viewProj; sp.view = View; sp.proj = proj; sp.cameraPos = GameObject.Transform.WorldPosition; sp.cameraDir = WorldDirection; sp.dirLight = MMW.DirectionalLight; var viewproj = sp.view * sp.proj; sp.viewProj = viewproj; sp.viewInverse = sp.view.Inverted(); sp.projInverse = sp.proj.Inverted(); sp.viewProjInverse = sp.viewProj.Inverted(); sp.environmentMap = EnvironmentMap; // 描画準備 clipTask.Wait(); foreach (var obj in objects) { if (!obj.Enabled) { continue; } if (clipDic[obj]) { continue; } var renderers = obj.GetComponents <MeshRenderer>(); var animator = obj.GetComponent <AAnimator>(); var morpher = obj.GetComponent <AMorpher>(); var world = obj.Transform.WorldTransform; var oldWorld = obj.Transform.OldWorldTransfom; foreach (var r in renderers) { if (!r.Enabled) { continue; } for (var i = 0; i < r.MaterialCount; i++) { var mat = r.GetMaterialAt(i); if (!drawMeshDic.ContainsKey(mat.Shader)) { drawMeshDic.Add(mat.Shader, new Dictionary <Material, List <SubMeshData> >()); } if (!drawMeshDic[mat.Shader].ContainsKey(mat)) { drawMeshDic[mat.Shader].Add(mat, new List <SubMeshData>()); } } foreach (var sm in r.Mesh.subMeshes) { var mat = r.GetMaterial(sm.materialIndex); var smd = new SubMeshData() { SubMesh = sm, WorldTransform = world, OldWorldTransform = oldWorld, Visible = r.Visible, CastShadow = r.CastShadow, GameObject = obj, Morpher = morpher, Animator = animator, }; drawMeshDic[mat.Shader][mat].Add(smd); } } } findAnimTask.Wait(); foreach (var task in animTasks) { task.Wait(); } foreach (var a in animList) { a.UpdateData(); } foreach (var m in morphList) { m.UpdateData(); } // DoF,SSAO,MotionBlurを使う場合は深度マップを書き込む var dof = GameObject.GetComponent <BokehDoF>(); var ssao = GameObject.GetComponent <SSAO>(); var motionBlur = GameObject.GetComponent <MotionBlur>(); if ((dof != null && dof.Enabled) || (ssao != null && ssao.Enabled) || (motionBlur != null && motionBlur.Enabled)) { RenderToDepthMap(depthRT, sp, drawMeshDic); if (dof != null && dof.Enabled) { dof.DepthMap = depthRT.ColorDst0; } if (ssao != null && ssao.Enabled) { ssao.DepthMap = depthRT.ColorDst0; } if (motionBlur != null && motionBlur.Enabled) { motionBlur.DepthMap = depthRT.ColorDst0; } } // エッジを描画する場合はカラーマップを書き込む var sobel = GameObject.GetComponent <SobelEdge>(); if (sobel != null && sobel.Enabled) { RenderToColorMap(colorRT, sp, drawMeshDic); sobel.ColorTexture = colorRT.ColorDst0; } // モーションブラーをする場合は速度マップを書き込む if ((motionBlur != null && motionBlur.Enabled)) { RenderToVelocityMap(velocityRT, sp, drawMeshDic); motionBlur.VelocityMap = velocityRT.ColorDst0; } // 影の準備 if (ShadowMapping && MMW.Configuration.ShadowQuality != MMWConfiguration.ShadowQualityType.NoShadow) { Vector3 lightDir = MMW.DirectionalLight.WorldDirection; Vector3 center = GameObject.Transform.WorldPosition; Matrix4 view = Matrix4.Identity; Matrix4 projo = Matrix4.Identity; // render to far shadow depth map { view = Matrix4.LookAt(Vector3.Zero, lightDir, Vector3.UnitY); projo = Matrix4.CreateOrthographic(240, 240, -150, 150); sp.viewProj = view * projo; if (prevLightDir != lightDir) { RenderToDepthMap(shadowDepthRT1, sp, drawMeshDic); } sp.shadowDepthBias1 = sp.viewProj * shadowDepthBias; sp.shadowDepthMap1 = shadowDepthRT1.ColorDst0; } // render to middle shadow depth map { view = Matrix4.LookAt(center, center + lightDir, Vector3.UnitY); projo = Matrix4.CreateOrthographic(40, 40, -150, 150); sp.viewProj = view * projo; RenderToDepthMap(shadowDepthRT2, sp, drawMeshDic); sp.shadowDepthBias2 = sp.viewProj * shadowDepthBias; sp.shadowDepthMap2 = shadowDepthRT2.ColorDst0; } // render to near shadow depth map { view = Matrix4.LookAt(center, center + lightDir, Vector3.UnitY); projo = Matrix4.CreateOrthographic(10, 10, -80, 80); sp.viewProj = view * projo; RenderToDepthMap(shadowDepthRT3, sp, drawMeshDic); sp.shadowDepthBias3 = sp.viewProj * shadowDepthBias; sp.shadowDepthMap3 = shadowDepthRT3.ColorDst0; } sp.viewProj = viewproj; prevLightDir = lightDir; prevCameraPos = center; } } // レンダーターゲットをセット TargetTexture.Bind(); GL.ClearColor(ClearColor); if (ClearFlag == ClearFlag.SolidColor) { GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit | ClearBufferMask.StencilBufferBit); } else if (ClearFlag == ClearFlag.DepthOnly) { GL.Clear(ClearBufferMask.DepthBufferBit | ClearBufferMask.StencilBufferBit); } else if (ClearFlag == ClearFlag.SkyBox) { GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit | ClearBufferMask.StencilBufferBit); Drawer.DrawTextureCube(ClearSkyBox, GameObject.Transform.WorldDirectionZ, FoV, Aspect, SkyBoxColor, SkyBoxContrast, SkyBoxSaturation, SkyBoxBrightness); } // その他スクリプトの描画(メッシュ描画前) if (ScriptDraw) { //DrawScripts(objects, (float)deltaTime, c => c.GameObject.Layer < 16); } // メッシュ描画 if (MeshDraw) { // ライト並び替えタスクが終わるまで待機 //MMW.lightSortTask.Wait(); DrawMeshes(sp, drawMeshDic); } // その他スクリプトの描画 if (ScriptDraw) { //DrawScripts(objects, (float)deltaTime, c => c.GameObject.Layer >= 16); } // イメージエフェクトをかける var effects = GameObject.GetComponents <ImageEffect>(); if (effects != null) { for (var i = 0; i < effects.Length; i++) { if (!effects[i].Enabled) { continue; } effects[i].Draw(deltaTime); } } // UI層のゲームオブジェクトを描画 if (UIDraw && layerMask.Get(GameObject.LayerUI)) { //var objs = MMW.FindGameObjects((obj) => obj.Layer == GameObject.LayerUI && layerMask.Get(obj.Layer)); //DrawScripts(objs, (float)deltaTime, c => true); } }