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(); } }
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(); } } }