Validates platform abstraction compliance - ensures rendering code uses IRendererAPI interfaces, no direct OpenGL in engine core, proper namespace isolation. Reviews graphics features and guides alternative backend implementation.
All platform-specific code must live in Engine/Platform/{PlatformName}/
✅ Engine code should:
IRendererAPI, IShader, ITexture2D interfacesSilk.NET.* namespaces✅ Platform code should:
Engine/Platform/SilkNet/SilkNetContext.GL for OpenGLGLDebug.CheckError() after GL calls❌ Never:
Silk.NET.OpenGL in Engine namespaceSilkNetShader in engine codeEngine Core (Platform-Agnostic)
↓ Uses interfaces only
Abstraction Layer (IRendererAPI, IShader, ITexture2D, etc.)
↓ Implemented by
Platform Implementation (Engine/Platform/SilkNet/)
Current: OpenGL via Silk.NET Future: Vulkan, DirectX, Metal, WebGL
Invoke this skill when:
Run these commands to detect violations automatically:
grep -r "using Silk\.NET\." Engine/ --exclude-dir=Platform
Expected: No matches outside Engine/Platform/
grep -rE "SilkNet[A-Z]" Engine/ --exclude-dir=Platform | grep -E "(private|public|protected)"
Expected: No SilkNetShader, SilkNetTexture2D, etc. in engine code
Check Engine/Renderer/Graphics2D.cs and Engine/Renderer/Graphics3D.cs:
IRendererAPI, IShader, ITexture2D, etc.)For any new rendering features, verify:
Engine/Renderer/ or Engine/Core/?Engine/Platform/SilkNet/?Program.cs DI container?| Violation Type | ❌ Wrong | ✅ Correct |
|----------------|----------|------------|
| Direct OpenGL | using Silk.NET.OpenGL;<br>GL.DrawElements(...) | private readonly IRendererAPI _api;<br>_api.DrawIndexed(...) |
| Concrete Types | private SilkNetShader _shader;<br>_shader = new SilkNetShader(path); | private readonly IShader _shader;<br>_shader = factory.Create(path); |
| Wrong Namespace | Engine/Renderer/OpenGLBuffer.cs<br>namespace Engine.Renderer; | Engine/Platform/SilkNet/Buffers/<br>namespace Engine.Platform.SilkNet.Buffers; |
When adding graphics features (compute shaders, geometry shaders, etc.), always create interface first:
// 1. Interface in Engine/Renderer/
public interface IComputeShader : IDisposable {
void Dispatch(uint x, uint y, uint z);
}
// 2. Implementation in Engine/Platform/SilkNet/
public class SilkNetComputeShader : IComputeShader { ... }
// 3. Factory for creation
public interface IComputeShaderFactory {
IComputeShader Create(string path);
}
// 4. Engine uses interface
public ParticleSystem(IComputeShaderFactory factory) {
_compute = factory.Create("particles.comp");
}
Core Interfaces (must use in engine code):
IRendererAPI - Draw commands, clear, viewportIShader - Shader programsITexture2D - Texture resourcesIVertexArray - Vertex array objectsIFrameBuffer - Render targetsIVertexBuffer, IIndexBuffer - Vertex/index dataPlatform Implementations (only in Platform/SilkNet):
Engine/Platform/SilkNet/SilkNetContext.GL for OpenGL accessGLDebug.CheckError() after GL callsEngine/Platform/SilkNet/
├── SilkNetRendererApi.cs # IRendererAPI
├── SilkNetShader.cs # IShader
├── SilkNetTexture2D.cs # ITexture2D
├── SilkNetVertexArray.cs # IVertexArray
├── Buffers/
│ ├── SilkNetFrameBuffer.cs
│ ├── SilkNetVertexBuffer.cs
│ └── SilkNetIndexBuffer.cs
├── Audio/
│ └── SilkNetAudioEngine.cs # OpenAL
└── Input/
└── SilkNetInputSystem.cs
1. Create namespace: Engine/Platform/Vulkan/
2. Implement interfaces:
public class VulkanRendererApi : IRendererAPI { ... }
public class VulkanShader : IShader { ... }
// etc.
3. Update DI registration:
// Program.cs
switch (backend) {
case "OpenGL":
container.Register<IRendererAPI, SilkNetRendererApi>();
break;
case "Vulkan":
container.Register<IRendererAPI, VulkanRendererApi>();
break;
}
4. No engine code changes needed - already uses interfaces!
After fixing violations or adding new features, validate compliance:
dotnet build
Expected: Build succeeds without errors
Run grep commands from Review Checklist Expected: No Silk.NET imports or concrete types in engine code
cd Editor && dotnet run
Expected: Editor launches, rendering works correctly
Ask: "Could I swap SilkNetRendererApi for VulkanRendererApi without changing engine code?"
Expected: Yes - all engine code uses IRendererAPI interfaces
Issue: [Violation description] Location: [File:Line] Type: [Direct OpenGL / Concrete Type / Wrong Namespace / Missing Interface] Fix:
// Current (wrong)
[bad code]
// Should be (correct)
[fixed code]
Priority: [Critical/High/Medium/Low]
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer