Carry one complete cell payload with each streaming completion and publish visibility, physics, and render state on the render thread. Remove the obsolete post-readiness login reload that triggered a duplicate dungeon build. Co-Authored-By: Codex <noreply@openai.com>
129 lines
4.7 KiB
C#
129 lines
4.7 KiB
C#
// Ported from references/WorldBuilder/Chorizite.OpenGLSDLBackend/Lib/SceneryInstance.cs
|
|
// Phase A8 extraction (2026-05-28). Verbatim port; adaptations:
|
|
// - SceneryInstance -> EnvCellSceneryInstance (scope-narrow to env-cell rendering)
|
|
// - ObjectLandblock -> EnvCellLandblock
|
|
// - Namespace: AcDream.App.Rendering.Wb
|
|
// - BoundingBox -> WbBoundingBox (defined in WbFrustum.cs)
|
|
// - DisqualificationReason + SceneryDisqualificationReason dropped (editor-only)
|
|
// - IsQueuedForUpload, IsTransformOnlyUpdate, ParticleEmitters, InstanceBufferOffset,
|
|
// InstanceCount, MdiCommands dropped (editor-only / shared-MDI)
|
|
|
|
using System.Collections.Generic;
|
|
using System.Numerics;
|
|
|
|
namespace AcDream.App.Rendering.Wb;
|
|
|
|
/// <summary>
|
|
/// Lightweight data for a single placed env-cell scenery object.
|
|
/// Source: references/WorldBuilder/Chorizite.OpenGLSDLBackend/Lib/SceneryInstance.cs (lines 11-56)
|
|
/// </summary>
|
|
public struct EnvCellSceneryInstance
|
|
{
|
|
/// <summary>GfxObj or Setup ID from DAT.</summary>
|
|
public ulong ObjectId;
|
|
|
|
/// <summary>Unique instance index within the landblock (WB used a 128-bit editor ID; we use uint).</summary>
|
|
public uint InstanceId;
|
|
|
|
/// <summary>True for multi-part Setup objects, false for simple GfxObj.</summary>
|
|
public bool IsSetup;
|
|
|
|
/// <summary>True if this instance is a building.</summary>
|
|
public bool IsBuilding;
|
|
|
|
/// <summary>True if this is an interior cell connected directly to the landblock.</summary>
|
|
public bool IsEntryCell;
|
|
|
|
/// <summary>World-space position.</summary>
|
|
public Vector3 WorldPosition;
|
|
|
|
/// <summary>Local-space position (relative to landblock origin).</summary>
|
|
public Vector3 LocalPosition;
|
|
|
|
/// <summary>Rotation quaternion.</summary>
|
|
public Quaternion Rotation;
|
|
|
|
/// <summary>The current cell ID this instance is in (used for previewing moves between cells).</summary>
|
|
public uint CurrentPreviewCellId;
|
|
|
|
/// <summary>Scale (typically uniform).</summary>
|
|
public Vector3 Scale;
|
|
|
|
/// <summary>Pre-computed world transform matrix.</summary>
|
|
public Matrix4x4 Transform;
|
|
|
|
/// <summary>Local-space bounding box.</summary>
|
|
public WbBoundingBox LocalBoundingBox;
|
|
|
|
/// <summary>World-space bounding box.</summary>
|
|
public WbBoundingBox BoundingBox;
|
|
|
|
/// <summary>Rendering flags for this instance.</summary>
|
|
public uint Flags;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Holds all EnvCell instances for a single landblock, ready for rendering.
|
|
/// Shared by both scenery and static object render managers.
|
|
/// Source: references/WorldBuilder/Chorizite.OpenGLSDLBackend/Lib/SceneryInstance.cs (lines 62-160)
|
|
/// </summary>
|
|
public class EnvCellLandblock
|
|
{
|
|
/// <summary>Grid X coordinate of this landblock.</summary>
|
|
public int GridX { get; set; }
|
|
|
|
/// <summary>Grid Y coordinate of this landblock.</summary>
|
|
public int GridY { get; set; }
|
|
|
|
public object Lock { get; } = new();
|
|
|
|
public List<EnvCellSceneryInstance> Instances { get; set; } = new();
|
|
|
|
/// <summary>
|
|
/// Grouped bounding boxes for each EnvCell in this landblock.
|
|
/// Key: CellID, Value: Composite bounding box of the cell and all its static objects.
|
|
/// </summary>
|
|
public Dictionary<uint, WbBoundingBox> EnvCellBounds { get; set; } = new();
|
|
|
|
/// <summary>
|
|
/// Set of EnvCell IDs in this landblock that have the SeenOutside flag.
|
|
/// </summary>
|
|
public HashSet<uint> SeenOutsideCells { get; set; } = new();
|
|
|
|
/// <summary>
|
|
/// Grouped transforms for each GfxObj part for static objects, for efficient instanced rendering.
|
|
/// Key: GfxObjId, Value: List of transforms
|
|
/// </summary>
|
|
public Dictionary<ulong, List<InstanceData>> StaticPartGroups { get; set; } = new();
|
|
|
|
/// <summary>
|
|
/// Grouped transforms for each GfxObj part for buildings, for efficient instanced rendering.
|
|
/// Key: GfxObjId, Value: List of transforms
|
|
/// </summary>
|
|
public Dictionary<ulong, List<InstanceData>> BuildingPartGroups { get; set; } = new();
|
|
|
|
/// <summary>
|
|
/// World-space bounding box of this landblock.
|
|
/// </summary>
|
|
public WbBoundingBox BoundingBox { get; set; }
|
|
|
|
/// <summary>
|
|
/// Total bounding box covering all EnvCells in this landblock.
|
|
/// </summary>
|
|
public WbBoundingBox TotalEnvCellBounds { get; set; }
|
|
|
|
/// <summary>
|
|
/// Whether instances (positions/bounding boxes) have been generated.
|
|
/// </summary>
|
|
public bool InstancesReady { get; set; }
|
|
|
|
/// <summary>
|
|
/// Whether mesh data for all instances has been prepared (CPU-side).
|
|
/// </summary>
|
|
public bool MeshDataReady { get; set; }
|
|
|
|
/// <summary>
|
|
/// Whether GPU resources have been uploaded.
|
|
/// </summary>
|
|
public bool GpuReady { get; set; }
|
|
}
|