| """Data models for the shader environment.""" | |
| from openenv.core.env_server.types import Action, Observation | |
| from pydantic import Field | |
| class ShaderAction(Action): | |
| """Agent submits Shadertoy-dialect GLSL fragment shader source.""" | |
| code: str = Field(..., description="Shadertoy-dialect GLSL fragment shader source") | |
| class ShaderObservation(Observation): | |
| """Observation returned after reset or step.""" | |
| # Task context | |
| task: str = Field(default="") | |
| remaining: int = Field(default=0) | |
| # Reference (non-empty on reset only) | |
| reference_png: str = Field( | |
| default="", | |
| description="Base64-encoded PNG of the reference render. Non-empty on reset only.", | |
| ) | |
| # Render result | |
| compiled: bool = Field(default=False) | |
| rendered: bool = Field(default=False) | |
| errors: list[str] = Field(default_factory=list) | |
| agent_png: str = Field( | |
| default="", | |
| description="Base64-encoded PNG of the agent's render. Empty if compile failed.", | |
| ) | |
| # Reward signal | |
| ssim: float = Field(default=0.0, description="SSIM vs reference in [0, 1]") | |