3.9 KiB
ADDED Requirements
Requirement: Viewport renders USD stage geometry into an FBO-backed ImGui panel
The system SHALL render USD stage geometry into an OpenGL Framebuffer Object (FBO) and display the attached color texture via ImGui::Image() within the "Viewport" dockable panel.
Scenario: Viewport displays scene geometry when a stage is loaded
- WHEN a USD stage is opened and the Viewport panel is visible
- THEN the system traverses the stage's prim tree, extracts
UsdGeomMeshdata, and renders mesh geometry into the FBO - AND the FBO color texture is displayed as an ImGui image in the Viewport panel
Scenario: Viewport shows empty background when no stage is loaded
- WHEN no USD stage is open
- THEN the Viewport panel displays a dark background with no geometry
Requirement: FBO resizes to match viewport panel dimensions
The system SHALL resize the FBO color and depth attachments whenever the Viewport panel's content region dimensions change.
Scenario: FBO resized on dock layout change
- WHEN the user docks, undocks, or resizes the Viewport panel
- THEN the FBO is recreated with the new width and height from
ImGui::GetContentRegionAvail() - AND the previous FBO textures are deleted
Scenario: No unnecessary FBO reallocation
- WHEN the Viewport panel dimensions remain unchanged between frames
- THEN the FBO is not recreated
Requirement: USD mesh geometry is extracted and uploaded to GPU buffers
The system SHALL traverse the UsdStage, extract UsdGeomMesh points, face vertex counts, face vertex indices, and normals, and upload them to OpenGL VBOs/VAOs.
Scenario: Mesh data loaded from UsdGeomMesh prims
- WHEN the stage is loaded or refreshed
- THEN for each
UsdGeomMeshprim, the system readspoints,faceVertexCounts,faceVertexIndices, andnormalsattributes - AND uploads the data to OpenGL vertex buffer objects
Scenario: Missing normals handled gracefully
- WHEN a
UsdGeomMeshprim has no authored normals - THEN the system computes flat face normals from the triangle winding
- AND renders the mesh with the computed normals
Requirement: Meshes are rendered with diffuse color from UsdShade or primvar
The system SHALL apply a diffuse color to each mesh obtained from UsdShadeMaterial binding or a displayColor primvar, falling back to a default color.
Scenario: Mesh with UsdShade material
- WHEN a mesh prim has a bound
UsdShadeMaterialwith a diffuse color output - THEN the mesh is rendered with that diffuse color
Scenario: Mesh with displayColor primvar
- WHEN a mesh prim has a
primvars:displayColorattribute and no bound material - THEN the mesh is rendered with the displayColor value
Scenario: Mesh with no color information
- WHEN a mesh prim has neither a bound material nor a displayColor primvar
- THEN the mesh is rendered with a default gray color (0.7, 0.7, 0.7)
Requirement: OpenGL shaders are GLSL #version 130 compatible
All viewport shaders SHALL be written in GLSL #version 130 and use the compatibility profile built-in variables (gl_Vertex, attribute bindings, etc.) to match the existing OpenGL context.
Scenario: Shaders compile on legacy OpenGL context
- WHEN the application initializes the viewport renderer
- THEN the vertex and fragment shaders compile successfully on the existing WGL OpenGL context initialized with
#version 130
Requirement: Scene rendering is refreshed when the stage changes
The system SHALL rebuild GPU geometry buffers when the USD stage is opened, closed, or when the stage content is modified.
Scenario: Stage opened triggers rebuild
- WHEN a new USD stage is opened
- THEN the renderer clears existing GPU buffers and re-traverses the new stage
Scenario: Stage closed clears geometry
- WHEN the current stage is closed
- THEN the renderer clears all GPU buffers and the viewport shows an empty scene