Beispiel #1
0
        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();
            }
        }
Beispiel #2
0
        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;
                }
            }
        }
Beispiel #5
0
        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);
            }
        }