示例#1
0
            private void DrawMesh(MeshRenderData data, BoxedValueStore <string> metadata)
            {
                var mesh = data.Mesh;

                device.SetVertexBuffer(mesh.VertexBuffer);
                device.Indices = mesh.IndexBuffer;

                var world               = metadata.Get <Matrix>("world");
                var view                = metadata.Get <Matrix>("view");
                var projection          = metadata.Get <Matrix>("projection");
                var worldView           = metadata.Get <Matrix>("worldview");
                var worldViewProjection = metadata.Get <Matrix>("worldviewprojection");

                for (int i = 0; i < visibleInstances.Count; i++)
                {
                    var instance = visibleInstances[i];

                    world.Value = instance.Instance.Transform;
                    Matrix.Multiply(ref world.Value, ref view.Value, out worldView.Value);
                    Matrix.Multiply(ref worldView.Value, ref projection.Value, out worldViewProjection.Value);

                    foreach (var pass in data.Material.Begin(metadata))
                    {
                        pass.Apply();

                        device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, mesh.VertexCount, 0, mesh.TriangleCount);

#if PROFILE
                        polysDrawnStat.Value += mesh.TriangleCount;
                        drawsStat.Value++;
#endif
                    }
                }
            }
示例#2
0
 public void Apply(BoxedValueStore <string> data)
 {
     if (setter != null)
     {
         setter.Apply(data);
     }
 }
示例#3
0
        public override void OnShown()
        {
            material = content.Load <Material>("Red");
            quad     = new Quad(device);
            metadata = new BoxedValueStore <string>();

            base.OnShown();
        }
示例#4
0
文件: Quad.cs 项目: sachgits/Myre
 public void Draw(Material material, BoxedValueStore <string> parameters)
 {
     foreach (var pass in material.Begin(parameters))
     {
         pass.Apply();
         Draw();
     }
 }
示例#5
0
文件: Material.cs 项目: sachgits/Myre
        public IEnumerable <EffectPass> Begin(BoxedValueStore <string> parameterValues)
        {
            for (int i = 0; i < parameters.Length; i++)
            {
                parameters[i].Apply(parameterValues);
            }

            return(effect.CurrentTechnique.Passes);
        }
示例#6
0
        public override void OnShown()
        {
            material = new Material(content.Load <Effect>("Basic"), null);
            quad     = new Quad(device);
            metadata = new BoxedValueStore <string>();

            metadata.Set("colour", Color.White.ToVector4());

            base.OnShown();
        }
示例#7
0
        public override void Apply(BoxedValueStore <string> globals)
        {
            if (value == null || previousGlobals != globals)
            {
                globals.TryGet(Semantic, out value);
                previousGlobals = globals;
            }

            if (value != null)
            {
                Parameter.SetValue(value.Value);
            }
        }
示例#8
0
            public void Draw(string phase, BoxedValueStore <string> metadata)
            {
                List <MeshRenderData> meshes;

                if (!phases.TryGetValue(phase, out meshes))
                {
                    return;
                }

                var viewFrustum = metadata.Get <BoundingFrustum>("viewfrustum").Value;

                bounds.Clear();
                bounds.Add(viewFrustum);
                QueryVisible(bounds, buffer);

                foreach (var item in buffer)
                {
                    item.IsVisible = true;
                }

                foreach (var mesh in meshes)
                {
                    foreach (var instance in mesh.Instances)
                    {
                        if (instance.IsVisible)
                        {
                            visibleInstances.Add(instance);
                        }
                    }

                    if (visibleInstances.Count > 0)
                    {
                        DrawMesh(mesh, metadata);
                        visibleInstances.Clear();
                    }
                }

                foreach (var item in buffer)
                {
                    item.IsVisible = false;
                }
                buffer.Clear();
            }
示例#9
0
        public void SetMetadata(BoxedValueStore <string> metadata)
        {
            metadata.Set("camera", this);
            metadata.Set("view", View);
            metadata.Set("projection", Projection);
            metadata.Set("viewprojection", ViewProjection);
            metadata.Set("inverseview", inverseView);
            metadata.Set("inverseprojection", inverseProjection);
            metadata.Set("inverseviewprojection", inverseViewProjection);
            metadata.Set("viewfrustum", Bounds);
            metadata.Set("nearclip", NearClip);
            metadata.Set("farclip", FarClip);
            metadata.Set("cameraposition", -view.Translation);

            bounds.GetCorners(frustumCorners);
            for (int i = 0; i < 4; i++)
            {
                farFrustumCorners[i] = frustumCorners[i + 4];
            }
            Vector3.Transform(farFrustumCorners, ref view, farFrustumCorners);
            metadata.Set("farfrustumcorners", farFrustumCorners);
        }
示例#10
0
        public override void Apply(BoxedValueStore<string> globals)
        {
            if (_value == null || _previousGlobals != globals)
            {
                globals.TryGet(Semantic, out _value);
                _previousGlobals = globals;
            }

            if (_value != null)
                Parameter.SetValue(_value.Value);
        }
示例#11
0
 //Why does this take a BoxedValueStore<string> and not a NamedValueCollection?
 //Because I don't *want* named values, I want boxed values!
 public abstract void Apply(BoxedValueStore<string> globals);
示例#12
0
 public void Apply(BoxedValueStore<string> data)
 {
     if (setter != null)
         setter.Apply(data);
 }
示例#13
0
        public override void Apply(BoxedValueStore<string> globals)
        {
            if (_value == null || _previousGlobals != globals)
            {
                globals.TryGet(Semantic, out _value);
                _previousGlobals = globals;
            }

            if (_value != null)
            {
                //Create an array to convert into (or reuse existing one)
                if (_conversion == null || _conversion.Length != _value.Value.Length)
                    _conversion = new Microsoft.Xna.Framework.Matrix[_value.Value.Length];

                //Convert to XNA types
                for (int i = 0; i < _value.Value.Length; i++)
                    _conversion[i] = _value.Value[i].ToXNA();

                Parameter.SetValue(_conversion);
            }
        }
示例#14
0
文件: Camera.cs 项目: TomGillen/Myre
        public void SetMetadata(BoxedValueStore<string> metadata)
        {
            metadata.Set("camera", this);
            metadata.Set("view", View);
            metadata.Set("projection", Projection);
            metadata.Set("viewprojection", ViewProjection);
            metadata.Set("inverseview", inverseView);
            metadata.Set("inverseprojection", inverseProjection);
            metadata.Set("inverseviewprojection", inverseViewProjection);
            metadata.Set("viewfrustum", Bounds);
            metadata.Set("nearclip", NearClip);
            metadata.Set("farclip", FarClip);
            metadata.Set("cameraposition", -view.Translation);

            bounds.GetCorners(frustumCorners);
            for (int i = 0; i < 4; i++)
                farFrustumCorners[i] = frustumCorners[i + 4];
            Vector3.Transform(farFrustumCorners, ref view, farFrustumCorners);
            metadata.Set("farfrustumcorners", farFrustumCorners);
        }
示例#15
0
 public abstract void Apply(BoxedValueStore <string> globals);
示例#16
0
 public void Draw(Material material, BoxedValueStore<string> parameters)
 {
     foreach (var pass in material.Begin(parameters))
     {
         pass.Apply();
         Draw();
     }
 }