public override void Read(AssetReader reader) { base.Read(reader); ClearFlags = reader.ReadUInt32(); BackGroundColor.Read(reader); if (IsReadProjectionMatrixMode(reader.Version)) { ProjectionMatrixMode = (ProjectionMatrixMode)reader.ReadInt32(); SensorSize.Read(reader); LensShift.Read(reader); FocalLength = reader.ReadSingle(); } NormalizedViewPortRect.Read(reader); NearClipPlane = reader.ReadSingle(); FarClipPlane = reader.ReadSingle(); FieldOfView = reader.ReadSingle(); Orthographic = reader.ReadBoolean(); reader.AlignStream(AlignType.Align4); OrthographicSize = reader.ReadSingle(); Depth = reader.ReadSingle(); CullingMask.Read(reader); if (IsReadRenderingPath(reader.Version)) { RenderingPath = (RenderingPath)reader.ReadInt32(); } TargetTexture.Read(reader); if (IsReadTargetDisplay(reader.Version)) { TargetDisplay = reader.ReadInt32(); } if (IsReadTargetEye(reader.Version)) { TargetEye = (StereoTargetEyeMask)reader.ReadInt32(); } if (IsReadHDR(reader.Version)) { HDR = reader.ReadBoolean(); } if (IsReadAllowMSAA(reader.Version)) { AllowMSAA = reader.ReadBoolean(); } if (IsReadAllowDynamicResolution(reader.Version)) { AllowDynamicResolution = reader.ReadBoolean(); } if (IsReadForceIntoRT(reader.Version)) { ForceIntoRT = reader.ReadBoolean(); } if (IsReadOcclusionCulling(reader.Version)) { OcclusionCulling = reader.ReadBoolean(); } if (IsAlign(reader.Version)) { reader.AlignStream(AlignType.Align4); } if (IsReadStereoConvergence(reader.Version)) { StereoConvergence = reader.ReadSingle(); StereoSeparation = reader.ReadSingle(); } if (IsReadStereoMirrorMode(reader.Version)) { StereoMirrorMode = reader.ReadBoolean(); } }
public override void Read(AssetStream stream) { base.Read(stream); ClearFlags = stream.ReadUInt32(); BackGroundColor.Read(stream); NormalizedViewPortRect.Read(stream); NearClipPlane = stream.ReadSingle(); FarClipPlane = stream.ReadSingle(); FieldOfView = stream.ReadSingle(); Orthographic = stream.ReadBoolean(); stream.AlignStream(AlignType.Align4); OrthographicSize = stream.ReadSingle(); Depth = stream.ReadSingle(); CullingMask.Read(stream); if (IsReadRenderingPath(stream.Version)) { RenderingPath = (RenderingPath)stream.ReadInt32(); } TargetTexture.Read(stream); if (IsReadTargetDisplay(stream.Version)) { TargetDisplay = stream.ReadInt32(); } if (IsReadTargetEye(stream.Version)) { TargetEye = (StereoTargetEyeMask)stream.ReadInt32(); } if (IsReadHDR(stream.Version)) { HDR = stream.ReadBoolean(); } if (IsReadAllowMSAA(stream.Version)) { AllowMSAA = stream.ReadBoolean(); } if (IsReadAllowDynamicResolution(stream.Version)) { AllowDynamicResolution = stream.ReadBoolean(); } if (IsReadForceIntoRT(stream.Version)) { ForceIntoRT = stream.ReadBoolean(); } if (IsReadOcclusionCulling(stream.Version)) { OcclusionCulling = stream.ReadBoolean(); } if (IsAlign(stream.Version)) { stream.AlignStream(AlignType.Align4); } if (IsReadStereoConvergence(stream.Version)) { StereoConvergence = stream.ReadSingle(); StereoSeparation = stream.ReadSingle(); } if (IsReadStereoMirrorMode(stream.Version)) { StereoMirrorMode = stream.ReadBoolean(); } }
private void WriteTex(BinaryWriter writer, string propName, TargetMaterial tm, TargetTexture trgtTex) { Write(writer, "tex"); Write(writer, propName); var sub = "tex2d"; if (trgtTex == null || trgtTex.tex == null) { sub = "null"; } Write(writer, sub); switch (sub) { case "tex2d": // カラー変更時にはファイル生成するため、ファイル名も変更が必要 if (trgtTex.fileChanged || trgtTex.colorChanged) { Write(writer, trgtTex.EditFileNameNoExt()); // 拡張子不要 //Write(writer, trgtTex.EditFileName()); Write(writer, trgtTex.EditTxtPath()); Write(writer, tm.editedMat.material.GetTextureOffset(propName)); Write(writer, tm.editedMat.material.GetTextureScale(propName)); } break; case "null": break; case "texRT": // texRTはない writer.Write(string.Empty); writer.Write(string.Empty); break; } }
// Token: 0x0600025E RID: 606 RVA: 0x000155E8 File Offset: 0x000137E8 private void WriteTex(BinaryWriter writer, string propName, TargetMaterial tm, TargetTexture trgtTex) { this.Write(writer, new string[] { "tex" }); this.Write(writer, new string[] { propName }); string text = "tex2d"; if (trgtTex == null || trgtTex.tex == null) { text = "null"; } this.Write(writer, new string[] { text }); string a; if ((a = text) != null) { if (!(a == "tex2d")) { if (!(a == "null")) { if (!(a == "texRT")) { return; } writer.Write(string.Empty); writer.Write(string.Empty); } } else if (trgtTex.fileChanged || trgtTex.colorChanged) { this.Write(writer, new string[] { trgtTex.EditFileNameNoExt() }); this.Write(writer, new string[] { trgtTex.EditTxtPath() }); this.Write(writer, tm.editedMat.material.GetTextureOffset(propName)); this.Write(writer, tm.editedMat.material.GetTextureScale(propName)); return; } } }
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); } }