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 void DrawAvatarTool(RendererBase <ToyWorld> renderer, IAvatar avatar, Vector2 size, Vector2 position, ToolBackgroundType type = ToolBackgroundType.BrownBorder) { GameObjectPainter goPainter = Owner.GameObjectPainter; GL.Enable(EnableCap.Blend); Owner.SetDefaultBlending(); // Bind stuff to GL (used in overrides) renderer.TextureManager.Bind(goPainter.TilesetTexture); renderer.EffectManager.Use(goPainter.Effect); goPainter.Effect.TextureUniform(0); if (Owner.FlipYAxis) { size.Y = -size.Y; position.Y = -position.Y; } Matrix transform = Matrix.CreateScale(size); transform *= Matrix.CreateTranslation(position.X, position.Y, 0.01f); // Draw the inventory background renderer.TextureManager.Bind(m_overlayTexture, Owner.GetTextureUnit(RenderRequestBase.TextureBindPosition.Ui)); renderer.EffectManager.Use(m_overlayEffect); m_overlayEffect.TextureUniform((int)RenderRequestBase.TextureBindPosition.Ui); m_overlayEffect.TileTypesTextureUniform((int)RenderRequestBase.TextureBindPosition.TileTypes); m_overlayEffect.TileTypesIdxOffsetUniform(0); m_overlayEffect.ModelViewProjectionUniform(ref transform); goPainter.LocalTileTypesBuffer[0] = (ushort)type; if (avatar.Tool != null) { goPainter.LocalTileTypesBuffer[1] = (ushort)avatar.Tool.TilesetId; } GL.BindBuffer(BufferTarget.PixelUnpackBuffer, 0); goPainter.TileTypesTexure.Update1D(2, dataType: PixelType.UnsignedShort, data: goPainter.LocalTileTypesBuffer); QuadOffset.Draw(); // Draw the inventory Tool if (avatar.Tool != null) { renderer.TextureManager.Bind(goPainter.TilesetTexture); renderer.EffectManager.Use(goPainter.Effect); goPainter.Effect.DiffuseUniform(new Vector4(1, 1, 1, 1)); goPainter.Effect.TileTypesIdxOffsetUniform(1); Matrix toolTransform = Matrix.CreateScale(0.7f) * transform; goPainter.Effect.ModelViewProjectionUniform(ref toolTransform); QuadOffset.Draw(); } }