Пример #1
0
        protected virtual void DrawTileLayers(RendererBase <ToyWorld> renderer, ToyWorld world)
        {
            var gridView  = GridView;
            int tileCount = gridView.Size.Size();

            // Draw tile layers
            int i = 0;

            foreach (var tileLayer in GetTileLayersToRender())
            {
                // Set up transformation to screen space for tiles
                // Model transform -- scale from (-1,1) to viewSize/2, center on origin
                Matrix transform = Matrix.CreateScale(new Vector3(gridView.Size, tileLayer.Thickness) * 0.5f);
                // World transform -- move center to view center
                if (Settings.Use3D)
                {
                    transform *= Matrix.CreateTranslation(new Vector3(gridView.Center, tileLayer.SpanIntervalFrom));
                }
                else
                {
                    transform *= Matrix.CreateTranslation(new Vector3(gridView.Center, tileLayer.SpanIntervalFrom + tileLayer.Thickness / 2));
                }
                // View and projection transforms
                transform *= Owner.ViewProjectionMatrix;
                Effect.ModelViewProjectionUniform(ref transform);
                Effect.TileTypesIdxOffsetUniform(i++ *tileCount);

                // Using the tileTypes texture should block until the data is fully copied from the pbos (onPreDraw)
                Grid.Draw();
            }
        }
Пример #2
0
        protected virtual void DrawObjectLayers(RendererBase <ToyWorld> renderer, ToyWorld world)
        {
            var gridView = GridView;

            Effect.TileTypesIdxOffsetUniform(0);
            GL.BindBuffer(BufferTarget.PixelUnpackBuffer, 0);

            // Draw objects
            foreach (var objectLayer in world.Atlas.ObjectLayers)
            {
                foreach (var gameObject in objectLayer.GetGameObjects(new RectangleF(gridView)))
                {
                    if (IgnoredGameObjects.Contains(gameObject) || gameObject.Invisible)
                    {
                        continue;
                    }

                    // Set up transformation to screen space for the gameObject
                    Matrix transform = Matrix.Identity;
                    // Model transform
                    IRotatable rotatableObject = gameObject as IRotatable;
                    if (rotatableObject != null)
                    {
                        transform *= Matrix.CreateRotationZ(rotatableObject.Rotation);
                    }
                    transform *= Matrix.CreateScale(new Vector3(gameObject.Size, objectLayer.Thickness) * 0.5f); // from (-1,1) to (-size,size)/2
                    // World transform
                    transform *= Matrix.CreateTranslation(new Vector3(gameObject.Position, objectLayer.SpanIntervalFrom + objectLayer.Thickness / 2));
                    // View and projection transforms
                    transform *= Owner.ViewProjectionMatrix;
                    Effect.ModelViewProjectionUniform(ref transform);

                    // Setup dynamic data
                    LocalTileTypesBuffer[0] = (ushort)gameObject.TilesetId;
                    TileTypesTexure.Update1D(1, dataType: PixelType.UnsignedShort, data: LocalTileTypesBuffer);
                    Cube.Draw();
                }
            }
        }