
Use this page when the scene is already in the native 3D render path and you need exact routing for draw submission, camera control, lights, shadows, or post-processing.
aura.draw3daura.camera3daura.lightaura.light and aura.draw3d sections in the canonical 3D contract.| Namespace | Exact Signatures | Additional Method Names | Native | Web |
|---|---|---|---|---|
aura.draw3d |
33 | 0 | supported |
unsupported |
aura.camera3d |
10 | 0 | supported |
unsupported |
aura.light |
14 | 0 | supported |
unsupported |
3D draw submission, fog, skybox, billboards, and postfx controls.
supportedunsupported330aura.draw3d.billboard( textureHandleOrSource: | number | { dataTextureHandle: number; }, options: { x: number; y: number; z: number; width: number; height: number; mode?: "face" | "axis"; color?: Color; frameX?: number; frameY?: number; frameW?: number; frameH?: number; atlasWidth?: number; atlasHeight?: number; } ): void
aura.draw3d.clear3d(color?: Color): void
aura.draw3d.clearFog(): void
aura.draw3d.createAtmosphereGraph(options?: { profile?: AtmosphereGraphProfileSource; atmosphereProfile?: AtmosphereGraphProfileSource; volumetricFog?: AtmosphereGraphVolumetricFog; enabled?: boolean; }): { ok: boolean; type: "atmosphereGraph"; handle: number; profileConfigured: boolean; volumetricFogConfigured: boolean; enabled: boolean; }
aura.draw3d.createCaptureGraph(options?: { captures?: CaptureGraphEntry[]; entries?: CaptureGraphEntry[]; enabled?: boolean; }): { ok: boolean; type: "captureGraph"; handle: number; captureCount: number; enabled: boolean; }
aura.draw3d.createMesh( vertices: Array<{ position: [number, number, number]; normal?: [number, number, number]; uv?: [number, number]; color?: [number, number, number, number]; jointIndices?: [number, number, number, number]; jointWeights?: [number, number, number, number]; }>, indices: number[] ): MeshHandle
aura.draw3d.createPostFXGraph(options: { enabled?: boolean; passes: Array<{ pass: string; enabled?: boolean; strength?: number; radius?: number; threshold?: number; customParams?: Record<string, number>; }>; targetChain?: { intermediateTargets?: string[]; pingPong?: boolean; composeMode?: "replace" | "additive" | "multiply"; }; }): { ok: boolean; type: "postFXGraph"; handle: number; passCount: number; enabledPassCount: number; customPassCount: number; enabled: boolean; }
aura.draw3d.createReflectionGraph(options?: { routes?: Array<{ materials: MaterialHandle[]; source?: ReflectionGraphSource | ReflectionGraphSource[]; sources?: ReflectionGraphSource[]; }>; environment?: ReflectionGraphEnvironmentSource | ReflectionGraphEnvironmentSource[]; environmentMap?: ReflectionGraphEnvironmentSource | ReflectionGraphEnvironmentSource[]; enabled?: boolean; }): { ok: boolean; type: "reflectionGraph"; handle: number; routeCount: number; materialCount: number; environmentSourceCount: number; enabled: boolean; }
aura.draw3d.createReflectionProbe(options?: { position?: Vec3; near?: number; far?: number; resolution?: number; facesPerFrame?: number; materials?: MaterialHandle[]; useAsEnvironmentMap?: boolean; }): { ok: boolean; type: "reflectionProbe"; handle: number; cubeCameraHandle: CubeCameraHandle; resolution: number; near: number; far: number; facesPerFrame: number; materialCount: number; useAsEnvironmentMap: boolean; }
aura.draw3d.destroyAtmosphereGraph( graph: number | { type: "atmosphereGraph"; handle: number } ): void
aura.draw3d.destroyCaptureGraph( graph: number | { type: "captureGraph"; handle: number } ): void
aura.draw3d.destroyPostFXGraph( graph: number | { type: "postFXGraph"; handle: number } ): void
aura.draw3d.destroyReflectionGraph( graph: number | { type: "reflectionGraph"; handle: number } ): void
aura.draw3d.destroyReflectionProbe( probe: number | { handle: number } ): void
aura.draw3d.drawMesh(mesh: MeshHandle, material: MaterialHandle, transform?: { position?: Vec3; rotation?: Vec3; scale?: Vec3; }): void
aura.draw3d.drawMeshInstanced( mesh: MeshHandle, material: MaterialHandle, transforms: Array<{ position?: Vec3; rotation?: Vec3; scale?: Vec3; }> ): void
aura.draw3d.drawSkybox(path: string): void
aura.draw3d.getAtmosphereGraphState(): { graphCount: number; enabledGraphCount: number; routeOrder: number[]; enabledRouteOrder: number[]; resolutionMode: "lastEnabledWins"; profileFallback: "clear"; volumetricFogFallback: "clear"; activeGraphHandle: number | null; activeProfileOwnerHandle: number | null; activeVolumetricFogOwnerHandle: number | null; } aura.draw3d.getAtmosphereGraphState( graph: number | { type: "atmosphereGraph"; handle: number } ): { ok: boolean; type: "atmosphereGraph"; handle: number; enabled: boolean; routeIndex: number; enabledRouteIndex: number | null; active: boolean; profileConfigured: boolean; volumetricFogConfigured: boolean; ownsProfile: boolean; ownsVolumetricFog: boolean; resolutionMode: "lastEnabledWins"; profileFallback: "clear"; volumetricFogFallback: "clear"; } | null
aura.draw3d.getPostFXGraphState(): { graphCount: number; enabledGraphCount: number; routeOrder: number[]; enabledRouteOrder: number[]; resolutionMode: "lastEnabledWins"; fallbackMode: "clear"; activeGraphHandle: number | null; } aura.draw3d.getPostFXGraphState( graph: number | { type: "postFXGraph"; handle: number } ): { ok: boolean; type: "postFXGraph"; handle: number; enabled: boolean; routeIndex: number; enabledRouteIndex: number | null; active: boolean; passCount: number; enabledPassCount: number; customPassCount: number; targetChain: { intermediateTargets: string[]; intermediateTargetCount: number; pingPong: boolean; composeMode: "replace" | "additive" | "multiply"; }; orderFingerprint: number; targetChainFingerprint: number; } | null
aura.draw3d.getPostFXState(): { passes: Array<{ pass: string; enabled: boolean; strength: number; radius: number; threshold: number; customParams: Record<string, number>; index: number; isCustom: boolean; }>; resolvedSteps: Array<{ pass: string; targetSlot: string | null; pingPongPhase: boolean; usesShaderPipeline: boolean; inputMatchesOriginalScene: boolean; index: number; }>; targetChain: { intermediateTargets: string[]; intermediateTargetCount: number; pingPong: boolean; composeMode: "replace" | "additive" | "multiply"; }; customShaderBindings: Array<{ binding: number; name: string; type: string; semantic: string; }>; customShaderContract: { deterministicOrder: boolean; supportsDepthTexture: boolean; supportsOriginalSceneTexture: boolean; supportsCameraInfoInUniform: boolean; supportsNormalBuffer: boolean; supportsIntermediateBufferReads: boolean; customParamSlots: number; inputTextureSemantic: string; originalSceneSemantic: string; orderingSemantic: string; }; totalPasses: number; enabledPasses: number; mutationCount: number; orderFingerprint: number; targetChainFingerprint: number; customPassCount: number; customParamFingerprint: number; lastOperation: string; lastReasonCode: string; lastOk: boolean; }
aura.draw3d.registerPostFXShader( name: string, wgslSource: string ): { ok: boolean; name: string; error?: string; }
aura.draw3d.removePostFXPass(pass: string): { ok: boolean; operation: "removePostFXPass"; reasonCode: string; pass: string | null; }
aura.draw3d.setAtmosphereProfile( profileOrNull: "neon-night" | "storm-haze" | null, overrides?: { skyGradient?: { zenith?: Color | ColorRgb; horizon?: Color | ColorRgb; ground?: Color | ColorRgb; skyExponent?: number; groundExponent?: number; }; mode?: "linear" | "exp" | "exp2"; color?: Color | ColorRgb; near?: number; far?: number; density?: number; atmosphere?: { enabled?: boolean; baseY?: number; falloff?: number; rayStrength?: number; rayDecay?: number; rayExposure?: number; shaftSource?: { screenUv: { x: number; y: number; }; } | null; excludeStencilRef?: number | null; localZone?: { enabled?: boolean; x?: number; y?: number; z?: number; radius?: number; height?: number; strength?: number; softness?: number; }; localZones?: Array<{ enabled?: boolean; x?: number; y?: number; z?: number; radius?: number; height?: number; strength?: number; softness?: number; }>; localVolumes?: Array<{ enabled?: boolean; x?: number; y?: number; z?: number; radius?: number; height?: number; strength?: number; softness?: number; }>; }; } ): void
aura.draw3d.setFog(options: { mode: "linear" | "exp" | "exp2"; color?: Color | ColorRgb; near?: number; far?: number; density?: number; atmosphere?: { enabled?: boolean; baseY?: number; falloff?: number; rayStrength?: number; rayDecay?: number; rayExposure?: number; shaftSource?: { screenUv: { x: number; y: number; }; } | null; excludeStencilRef?: number | null; localZone?: { enabled?: boolean; x?: number; y?: number; z?: number; radius?: number; height?: number; strength?: number; softness?: number; }; localZones?: Array<{ enabled?: boolean; x?: number; y?: number; z?: number; radius?: number; height?: number; strength?: number; softness?: number; }>; localVolumes?: Array<{ enabled?: boolean; x?: number; y?: number; z?: number; radius?: number; height?: number; strength?: number; softness?: number; }>; }; }): void
aura.draw3d.setPostFXEnabled( pass: string, enabled: boolean ): { ok: boolean; operation: "setPostFXEnabled"; reasonCode: string; pass: string | null; }
aura.draw3d.setPostFXPass( pass: string, options?: { enabled?: boolean; strength?: number; radius?: number; threshold?: number; customParams?: Record<string, number>; targetChain?: { intermediateTargets?: string[]; pingPong?: boolean; composeMode?: "replace" | "additive" | "multiply"; }; } ): { ok: boolean; operation: "setPostFXPass"; reasonCode: string; pass: string | null; }
aura.draw3d.setPostFXPass("custom:name", ...)
aura.draw3d.setPostFXPass("custom:name", options?)
aura.draw3d.updateAtmosphereGraph( graph: number | { type: "atmosphereGraph"; handle: number }, patch?: { profile?: AtmosphereGraphProfileSource; atmosphereProfile?: AtmosphereGraphProfileSource; volumetricFog?: AtmosphereGraphVolumetricFog; enabled?: boolean; } ): void
aura.draw3d.updateCaptureGraph( graph: number | { type: "captureGraph"; handle: number }, patch?: { captures?: CaptureGraphEntry[]; entries?: CaptureGraphEntry[]; enabled?: boolean; } ): void
aura.draw3d.updatePostFXGraph( graph: number | { type: "postFXGraph"; handle: number }, patch?: { enabled?: boolean; passes?: Array<{ pass: string; enabled?: boolean; strength?: number; radius?: number; threshold?: number; customParams?: Record<string, number>; }>; targetChain?: { intermediateTargets?: string[]; pingPong?: boolean; composeMode?: "replace" | "additive" | "multiply"; } | null; } ): void
aura.draw3d.updateReflectionGraph( graph: number | { type: "reflectionGraph"; handle: number }, patch?: { routes?: Array<{ materials: MaterialHandle[]; source?: ReflectionGraphSource | ReflectionGraphSource[]; sources?: ReflectionGraphSource[]; }>; environment?: ReflectionGraphEnvironmentSource | ReflectionGraphEnvironmentSource[]; environmentMap?: ReflectionGraphEnvironmentSource | ReflectionGraphEnvironmentSource[]; enabled?: boolean; } ): void
aura.draw3d.updateReflectionProbe( probe: number | { handle: number }, patch?: { position?: Vec3; materials?: MaterialHandle[]; useAsEnvironmentMap?: boolean; } ): void
3D camera projection, transforms, and control helpers.
supportedunsupported100aura.camera3d.getControlState(): { profile: "none" | "orbit"; active: boolean; orbit: { yaw: number; pitch: number; distance: number; target: Vec3; rotateSpeed: number; panSpeed: number; zoomSpeed: number; damping: number; minDistance: number; maxDistance: number; minPitchDeg: number; maxPitchDeg: number; }; }
aura.camera3d.getProjectionMatrix(): Mat4
aura.camera3d.getViewMatrix(): Mat4
aura.camera3d.lookAt(x: number, y: number, z: number): void
aura.camera3d.perspective(fovDeg: number, near: number, far: number): void
aura.camera3d.setControlProfile( profile: "none" | "orbit", options?: { rotateSpeed?: number; panSpeed?: number; zoomSpeed?: number; damping?: number; // clamped to [0, 1] minDistance?: number; // > 0, clamped to deterministic safe range maxDistance?: number; // > 0, clamped to deterministic safe range minPitchDeg?: number; // clamped to [-89, 89] maxPitchDeg?: number; // clamped to [-89, 89] } ): void
aura.camera3d.setFOV(fovDeg: number): void
aura.camera3d.setPosition(x: number, y: number, z: number): void
aura.camera3d.setTarget(x: number, y: number, z: number): void
aura.camera3d.updateControls( dtSeconds: number, input?: { rotateX?: number; rotateY?: number; panX?: number; panY?: number; zoom?: number; } ): void
3D light lifecycle and shadow-control surface.
supportedunsupported140aura.light.ambient(color: Color, intensity: number): LightHandle
aura.light.configureDirectionalShadows(options: { enabled?: boolean; quality?: "low" | "medium" | "high"; bias?: number; normalBias?: number; filterMode?: "hard" | "pcf"; filterRadius?: number; cascadeCount?: number; tileResolution?: number; lambda?: number; blendWidth?: number; shadowFar?: number; stabilizeCascades?: boolean; }): void
aura.light.configureShadow(lightId: LightHandle, options: { enabled?: boolean; quality?: "low" | "medium" | "high"; bias?: number; normalBias?: number; filterMode?: "hard" | "pcf"; filterRadius?: number; }): void
aura.light.directional(direction: Vec3, color: Color, intensity: number): LightHandle
aura.light.getShadowState(lightId?: LightHandle): { shadowBudget: number; shadowCastingCount: number; budgetSaturated: boolean; shadowedPointLightCount: number; shadowedSpotLightCount: number; rendererActive: boolean; effectiveShadowCastingCount: number; effectivePointLightCount: number; effectiveSpotLightCount: number; directionalPassCount: number; multiLightSlotCount: number; multiLightPassCount: number; shadowDrawCount: number; directional: { enabled: boolean; quality: "low" | "medium" | "high"; bias: number; normalBias: number; filterMode: "hard" | "pcf"; filterRadius: number; cascadeCount: number; tileResolution: number; lambda: number; blendWidth: number; shadowFar: number; stabilizeCascades: boolean; }; } | { lightId: LightHandle; type: "directional" | "point" | "spot"; enabled: boolean; quality: "low" | "medium" | "high"; bias: number; normalBias: number; filterMode: "hard" | "pcf"; filterRadius: number; rendererActive: boolean; effectiveEnabled: boolean; effectiveQuality: "low" | "medium" | "high"; effectiveBias: number; effectiveSlotCount: number; } | null
aura.light.getShadowStats(): { shadowCastingCount: number; shadowBudget: number; budgetSaturated: boolean; directionalShadowEnabled: boolean; directionalQuality: "low" | "medium" | "high"; directionalBias: number; directionalNormalBias: number; directionalFilterMode: "hard" | "pcf"; directionalFilterRadius: number; directionalCascadeCount: number; directionalTileResolution: number; directionalLambda: number; directionalBlendWidth: number; directionalShadowFar: number; directionalStabilizeCascades: boolean; directionalTexelSnapErrorMax: number; shadowedPointLightCount: number; shadowedSpotLightCount: number; rendererActive: boolean; effectiveShadowCastingCount: number; effectivePointLightCount: number; effectiveSpotLightCount: number; directionalPassCount: number; multiLightSlotCount: number; multiLightPassCount: number; shadowDrawCount: number; }
aura.light.hemisphere( skyColor: Color, groundColor: Color, intensity: number, upDirection?: Vec3 ): LightHandle
aura.light.point(position: Vec3, color: Color, intensity: number, range: number): LightHandle
aura.light.remove(handle: LightHandle): void
aura.light.setShadowBudget(maxLights: number): void
aura.light.setShadowCasting(lightId: LightHandle, enabled: boolean): void
aura.light.setShadowQuality( lightId: LightHandle, quality: "low" | "medium" | "high" ): void
aura.light.spot( position: Vec3, direction: Vec3, color: Color, intensity: number, range: number, angleRadians: number ): LightHandle
aura.light.update(handle: LightHandle, props: { position?: Vec3; direction?: Vec3; color?: Color; intensity?: number; range?: number; angle?: number; angleRadians?: number; skyColor?: Color; groundColor?: Color; hemisphereIntensity?: number; skyIntensity?: number; upDirection?: Vec3; }): void
aura.light and aura.draw3d sections in the canonical 3D contract.