bg2e-js 2.1.2 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bg2e-js.js +7031 -6989
- package/dist/bg2e-js.js.map +1 -1
- package/package.json +20 -2
- package/src/app/AppController.ts +39 -0
- package/src/app/Bg2KeyboardEvent.ts +54 -0
- package/src/app/Bg2MouseEvent.ts +82 -0
- package/src/app/Bg2TouchEvent.ts +18 -0
- package/src/app/Canvas.ts +108 -0
- package/src/app/EventBase.ts +10 -0
- package/src/app/MainLoop.ts +273 -0
- package/src/app/index.ts +25 -0
- package/src/base/Color.ts +134 -0
- package/src/base/Environment.ts +183 -0
- package/src/base/Light.ts +192 -0
- package/src/base/Material.ts +619 -0
- package/src/base/PolyList.ts +365 -0
- package/src/base/Texture.ts +620 -0
- package/src/base/index.ts +81 -0
- package/src/db/Bg2LoaderPlugin.ts +129 -0
- package/src/db/DBPluginApi.ts +48 -0
- package/src/db/Loader.ts +116 -0
- package/src/db/LoaderPlugin.ts +34 -0
- package/src/db/MtlParser.ts +7 -0
- package/src/db/ObjLoaderPlugin.ts +55 -0
- package/src/db/ObjParser.ts +252 -0
- package/src/db/ObjWriterPlugin.ts +19 -0
- package/src/db/VitscnjLoaderPlugin.ts +100 -0
- package/src/db/Writer.ts +52 -0
- package/src/db/WriterPlugin.ts +22 -0
- package/src/db/index.ts +44 -0
- package/src/debug/DebugRenderer.ts +173 -0
- package/src/debug/WebGLTextureViewer.ts +75 -0
- package/src/debug/index.ts +7 -0
- package/src/index.html +11 -0
- package/src/index.ts +33 -0
- package/src/manipulation/SelectionBuffer.ts +82 -0
- package/src/manipulation/SelectionHighlight.ts +85 -0
- package/src/manipulation/SelectionIdAssignVisitor.ts +97 -0
- package/src/manipulation/SelectionManager.ts +166 -0
- package/src/manipulation/SelectionMode.ts +6 -0
- package/src/math/Mat3.ts +259 -0
- package/src/math/Mat4.ts +706 -0
- package/src/math/MatrixStrategy.ts +25 -0
- package/src/math/Quat.ts +65 -0
- package/src/math/Vec.ts +753 -0
- package/src/math/constants.ts +47 -0
- package/src/math/functions.ts +103 -0
- package/src/math/index.ts +74 -0
- package/src/phsics/joint.ts +137 -0
- package/src/primitives/arrow.ts +58 -0
- package/src/primitives/cone.ts +138 -0
- package/src/primitives/cube.ts +60 -0
- package/src/primitives/cylinder.ts +216 -0
- package/src/primitives/index.ts +13 -0
- package/src/primitives/plane.ts +31 -0
- package/src/primitives/sphere.ts +809 -0
- package/src/render/BRDFIntegrationMap.ts +4 -0
- package/src/render/Environment.ts +136 -0
- package/src/render/FrameBuffer.ts +35 -0
- package/src/render/MaterialRenderer.ts +34 -0
- package/src/render/Pipeline.ts +109 -0
- package/src/render/PolyListRenderer.ts +47 -0
- package/src/render/RenderBuffer.ts +197 -0
- package/src/render/RenderQueue.ts +199 -0
- package/src/render/RenderState.ts +116 -0
- package/src/render/Renderer.ts +248 -0
- package/src/render/SceneAppController.ts +238 -0
- package/src/render/SceneRenderer.ts +373 -0
- package/src/render/Shader.ts +32 -0
- package/src/render/ShadowRenderer.ts +176 -0
- package/src/render/SkyCube.ts +106 -0
- package/src/render/SkySphere.ts +118 -0
- package/src/render/TextureMergerRenderer.ts +70 -0
- package/src/render/TextureRenderer.ts +34 -0
- package/src/render/index.ts +67 -0
- package/src/render/webgl/FrameBuffer.ts +10 -0
- package/src/render/webgl/MaterialRenderer.ts +113 -0
- package/src/render/webgl/Pipeline.ts +89 -0
- package/src/render/webgl/PolyListRenderer.ts +260 -0
- package/src/render/webgl/RenderBuffer.ts +227 -0
- package/src/render/webgl/Renderer.ts +262 -0
- package/src/render/webgl/SceneRenderer.ts +68 -0
- package/src/render/webgl/ShaderProgram.ts +424 -0
- package/src/render/webgl/ShadowRenderer.ts +6 -0
- package/src/render/webgl/SkyCube.ts +16 -0
- package/src/render/webgl/SkySphere.ts +16 -0
- package/src/render/webgl/State.ts +152 -0
- package/src/render/webgl/TextureRenderer.ts +167 -0
- package/src/render/webgl/VertexBuffer.ts +137 -0
- package/src/render/webgl/index.ts +35 -0
- package/src/scene/Camera.ts +458 -0
- package/src/scene/Chain.ts +44 -0
- package/src/scene/ChainJoint.ts +58 -0
- package/src/scene/Component.ts +173 -0
- package/src/scene/ComponentMap.ts +107 -0
- package/src/scene/Drawable.ts +154 -0
- package/src/scene/EnvironmentComponent.ts +142 -0
- package/src/scene/FindNodeVisitor.ts +60 -0
- package/src/scene/LightComponent.ts +155 -0
- package/src/scene/MatrixState.ts +46 -0
- package/src/scene/Node.ts +314 -0
- package/src/scene/NodeVisitor.ts +15 -0
- package/src/scene/OrbitCameraController.ts +450 -0
- package/src/scene/SmoothOrbitCameraController.ts +99 -0
- package/src/scene/Transform.ts +73 -0
- package/src/scene/index.ts +57 -0
- package/src/shaders/BasicDiffuseColorShader.ts +111 -0
- package/src/shaders/BasicPBRLightShader.ts +277 -0
- package/src/shaders/DebugRenderShader.ts +98 -0
- package/src/shaders/DepthRenderShader.ts +91 -0
- package/src/shaders/IrradianceMapCubeShader.ts +116 -0
- package/src/shaders/PBRLightIBLShader.ts +487 -0
- package/src/shaders/PickSelectionShader.ts +101 -0
- package/src/shaders/PresentDebugFramebufferShader.ts +118 -0
- package/src/shaders/PresentTextureShader.ts +99 -0
- package/src/shaders/SelectionHighlightShader.ts +127 -0
- package/src/shaders/ShaderFunction.ts +318 -0
- package/src/shaders/SkyCubeShader.ts +94 -0
- package/src/shaders/SkySphereShader.ts +102 -0
- package/src/shaders/SpecularMapCubeShader.ts +165 -0
- package/src/shaders/TextureMergerShader.ts +171 -0
- package/src/shaders/index.ts +37 -0
- package/src/shaders/webgl/color_correction.glsl +47 -0
- package/src/shaders/webgl/constants.glsl +6 -0
- package/src/shaders/webgl/index.ts +70 -0
- package/src/shaders/webgl/normal_map.glsl +9 -0
- package/src/shaders/webgl/pbr.glsl +173 -0
- package/src/shaders/webgl/uniforms.glsl +91 -0
- package/src/shaders/webgl_shader_lib.ts +213 -0
- package/src/tools/BinaryResourceProvider.ts +14 -0
- package/src/tools/ImageResourceProvider.ts +66 -0
- package/src/tools/MaterialModifier.ts +276 -0
- package/src/tools/Resource.ts +203 -0
- package/src/tools/ResourceProvider.ts +69 -0
- package/src/tools/TextResourceProvider.ts +24 -0
- package/src/tools/TextureCache.ts +52 -0
- package/src/tools/TextureResourceDatabase.ts +100 -0
- package/src/tools/UserAgent.ts +362 -0
- package/src/tools/VideoResourceProvider.ts +50 -0
- package/src/tools/WriteStrategy.ts +22 -0
- package/src/tools/base64.ts +11 -0
- package/src/tools/crypto.ts +19 -0
- package/src/tools/endiantess.ts +13 -0
- package/src/tools/image.ts +18 -0
- package/src/tools/index.ts +41 -0
- package/src/tools/processType.ts +38 -0
- package/src/vite-env.d.ts +12 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import Resource, { removeFileName, ResourceType } from "../tools/Resource";
|
|
2
|
+
import LoaderPlugin from "./LoaderPlugin";
|
|
3
|
+
import Node from "../scene/Node";
|
|
4
|
+
import { deserializeComponent } from "../scene/Component";
|
|
5
|
+
import Bg2LoaderPlugin from "./Bg2LoaderPlugin";
|
|
6
|
+
import Loader from "./Loader";
|
|
7
|
+
|
|
8
|
+
interface NodeData {
|
|
9
|
+
name: string;
|
|
10
|
+
enabled?: boolean;
|
|
11
|
+
steady?: boolean;
|
|
12
|
+
children?: NodeData[];
|
|
13
|
+
components?: any[];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const deserializeNode = async (nodeData: NodeData, loader: Loader): Promise<Node> => {
|
|
17
|
+
nodeData.children = nodeData.children || [];
|
|
18
|
+
nodeData.components = nodeData.components || [];
|
|
19
|
+
|
|
20
|
+
const node = new Node(nodeData.name);
|
|
21
|
+
node.enabled = nodeData.enabled !== undefined ? nodeData.enabled : true;
|
|
22
|
+
node.steady = nodeData.steady !== undefined ? nodeData.steady : false;
|
|
23
|
+
|
|
24
|
+
for (const componentData of nodeData.components) {
|
|
25
|
+
try {
|
|
26
|
+
const component = await deserializeComponent(componentData, loader);
|
|
27
|
+
if (component) {
|
|
28
|
+
node.addComponent(component);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (err: any) {
|
|
32
|
+
console.warn(`Deserialization of node with name "${node.name}": ${err.message}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
for (const childData of nodeData.children) {
|
|
37
|
+
const child = await deserializeNode(childData, loader);
|
|
38
|
+
node.addChild(child);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return node;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export const DrawableFormat = {
|
|
45
|
+
LEGACY: 'vwglb',
|
|
46
|
+
BG2: 'bg2'
|
|
47
|
+
} as const;
|
|
48
|
+
|
|
49
|
+
export type DrawableFormatValue = typeof DrawableFormat[keyof typeof DrawableFormat];
|
|
50
|
+
|
|
51
|
+
let g_prefDrawableFormat: DrawableFormatValue = DrawableFormat.BG2;
|
|
52
|
+
export default class VitscnjLoaderPlugin extends LoaderPlugin {
|
|
53
|
+
private _bg2ioPath: string | null;
|
|
54
|
+
|
|
55
|
+
static PreferredDrawableFormat(): DrawableFormatValue {
|
|
56
|
+
return g_prefDrawableFormat;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
constructor({ bg2ioPath, preferedDrawableFormat = DrawableFormat.BG2 }: { bg2ioPath: string | null; preferedDrawableFormat?: DrawableFormatValue } = { bg2ioPath: null }) {
|
|
60
|
+
super();
|
|
61
|
+
|
|
62
|
+
this._bg2ioPath = bg2ioPath;
|
|
63
|
+
g_prefDrawableFormat = preferedDrawableFormat;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
get supportedExtensions(): string[] { return ["vitscnj"]; }
|
|
67
|
+
|
|
68
|
+
get resourceTypes(): ResourceType[] {
|
|
69
|
+
return [
|
|
70
|
+
ResourceType.Node
|
|
71
|
+
];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async load(path: string, resourceType: ResourceType, loader: Loader): Promise<Node> {
|
|
75
|
+
if (resourceType !== ResourceType.Node) {
|
|
76
|
+
throw new Error(`VitscnjLoaderPlugin.load() unexpected resource type received: ${resourceType}`);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const prevPath = loader.currentPath;
|
|
80
|
+
loader.currentPath = removeFileName(path);
|
|
81
|
+
|
|
82
|
+
const resource = new Resource();
|
|
83
|
+
|
|
84
|
+
const root = new Node("Scene Root");
|
|
85
|
+
|
|
86
|
+
const { scene } = await resource.load(path);
|
|
87
|
+
for (const nodeData of scene) {
|
|
88
|
+
const node = await deserializeNode(nodeData, loader);
|
|
89
|
+
root.addChild(node);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
loader.currentPath = prevPath;
|
|
93
|
+
|
|
94
|
+
return root;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
get dependencies(): LoaderPlugin[] {
|
|
98
|
+
return [new Bg2LoaderPlugin({ bg2ioPath: this._bg2ioPath })];
|
|
99
|
+
}
|
|
100
|
+
}
|
package/src/db/Writer.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ResourceType } from '../tools/Resource';
|
|
2
|
+
import {
|
|
3
|
+
PluginOperationType,
|
|
4
|
+
createPluginDatabase,
|
|
5
|
+
registerPluginInDatabase,
|
|
6
|
+
getPluginFromDatabase
|
|
7
|
+
} from './DBPluginApi';
|
|
8
|
+
import LoaderPlugin from './LoaderPlugin';
|
|
9
|
+
import PolyList from '../base/PolyList';
|
|
10
|
+
import Texture from '../base/Texture';
|
|
11
|
+
|
|
12
|
+
const g_writePluginDatabase = createPluginDatabase(PluginOperationType.Write);
|
|
13
|
+
|
|
14
|
+
export const registerWriterPlugin = (pluginInstance: LoaderPlugin): void => {
|
|
15
|
+
registerPluginInDatabase(pluginInstance, g_writePluginDatabase);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const getWriterPlugin = (path: string, type: ResourceType): LoaderPlugin => {
|
|
19
|
+
return getPluginFromDatabase(path, type, g_writePluginDatabase);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export default class Writer {
|
|
23
|
+
constructor() {
|
|
24
|
+
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async writeResource(path: string, data: any, type: ResourceType): Promise<any> {
|
|
28
|
+
const plugin = getWriterPlugin(path, type);
|
|
29
|
+
const result = await plugin.write(path, data, type, this);
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async writePolyList(path: string, data: PolyList | PolyList[]): Promise<any> {
|
|
34
|
+
return await this.writeResource(path, data, ResourceType.PolyList);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async writeDrawable(path: string, data: any): Promise<any> {
|
|
38
|
+
return await this.writeResource(path, data, ResourceType.Drawable);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async writeNode(path: string, data: any): Promise<any> {
|
|
42
|
+
return await this.writeResource(path, data, ResourceType.Node);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async writeTexture(path: string, data: Texture): Promise<any> {
|
|
46
|
+
return await this.writeResource(path, data, ResourceType.Texture);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async writeMaterial(path: string, data: any): Promise<any> {
|
|
50
|
+
return await this.writeResource(path, data, ResourceType.Material);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ResourceType } from "../tools/Resource.js";
|
|
2
|
+
import Writer from "./Writer";
|
|
3
|
+
|
|
4
|
+
export default class WriterPlugin {
|
|
5
|
+
// Returns an array of valid file extensions for this plugin
|
|
6
|
+
// example: ['obj','dae']
|
|
7
|
+
get supportedExtensions(): string[] {
|
|
8
|
+
throw new Error("WriterPlugin.supportedExtensions: attribute not implemented");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// Returns the resource types that the loader plugin can handle
|
|
12
|
+
// example: [ResourceType.PolyList, ResourceType.Drawable]
|
|
13
|
+
get resourceTypes(): ResourceType[] {
|
|
14
|
+
throw new Error("WriterPlugin.resourceTypes: attribute not implemented");
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Performs the write action to the specified path, using the specified data
|
|
18
|
+
// and for the specified type.
|
|
19
|
+
async write(path: string, data: any, type: ResourceType, writer: Writer): Promise<any> {
|
|
20
|
+
throw new Error("WriterPlugin.write(): method not implemented");
|
|
21
|
+
}
|
|
22
|
+
}
|
package/src/db/index.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
|
|
2
|
+
import Bg2LoaderPlugin from "./Bg2LoaderPlugin";
|
|
3
|
+
import {
|
|
4
|
+
PluginOperationType,
|
|
5
|
+
createPluginDatabase,
|
|
6
|
+
registerPluginInDatabase,
|
|
7
|
+
getPluginFromDatabase
|
|
8
|
+
} from "./DBPluginApi";
|
|
9
|
+
import Loader, {
|
|
10
|
+
registerLoaderPlugin,
|
|
11
|
+
getLoaderPlugin
|
|
12
|
+
} from "./Loader"
|
|
13
|
+
import LoaderPlugin from "./LoaderPlugin";
|
|
14
|
+
import MtlParser from "./MtlParser";
|
|
15
|
+
import ObjLoaderPlugin from "./ObjLoaderPlugin";
|
|
16
|
+
import ObjParser from "./ObjParser";
|
|
17
|
+
import ObjWriterPlugin from "./ObjWriterPlugin";
|
|
18
|
+
import VitscnjLoaderPlugin from "./VitscnjLoaderPlugin";
|
|
19
|
+
import Writer, {
|
|
20
|
+
registerWriterPlugin,
|
|
21
|
+
getWriterPlugin
|
|
22
|
+
} from "./Writer"
|
|
23
|
+
import WriterPlugin from "./WriterPlugin";
|
|
24
|
+
|
|
25
|
+
export default {
|
|
26
|
+
Bg2LoaderPlugin,
|
|
27
|
+
PluginOperationType,
|
|
28
|
+
createPluginDatabase,
|
|
29
|
+
registerPluginInDatabase,
|
|
30
|
+
getPluginFromDatabase,
|
|
31
|
+
Loader,
|
|
32
|
+
registerLoaderPlugin,
|
|
33
|
+
getLoaderPlugin,
|
|
34
|
+
LoaderPlugin,
|
|
35
|
+
MtlParser,
|
|
36
|
+
ObjLoaderPlugin,
|
|
37
|
+
ObjParser,
|
|
38
|
+
ObjWriterPlugin,
|
|
39
|
+
VitscnjLoaderPlugin,
|
|
40
|
+
Writer,
|
|
41
|
+
registerWriterPlugin,
|
|
42
|
+
getWriterPlugin,
|
|
43
|
+
WriterPlugin
|
|
44
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import Color from "../base/Color";
|
|
2
|
+
import Material from "../base/Material";
|
|
3
|
+
import Mat4 from "../math/Mat4";
|
|
4
|
+
import Vec from "../math/Vec";
|
|
5
|
+
import { createArrow, createSphere } from "../primitives";
|
|
6
|
+
import BasicDiffuseColorShader from "../shaders/BasicDiffuseColorShader";
|
|
7
|
+
import Transform from "../scene/Transform";
|
|
8
|
+
import Texture, {
|
|
9
|
+
TextureRenderTargetAttachment,
|
|
10
|
+
TextureComponentFormat,
|
|
11
|
+
TextureWrap
|
|
12
|
+
} from "../base/Texture";
|
|
13
|
+
import DebugRenderShader from "../shaders/DebugRenderShader";
|
|
14
|
+
import PresentDebugFramebufferShader from "../shaders/PresentDebugFramebufferShader";
|
|
15
|
+
import type Renderer from "../render/Renderer";
|
|
16
|
+
import type PolyListRenderer from "../render/PolyListRenderer";
|
|
17
|
+
import type MaterialRenderer from "../render/MaterialRenderer";
|
|
18
|
+
import type RenderBuffer from "../render/RenderBuffer";
|
|
19
|
+
import type Camera from "../scene/Camera";
|
|
20
|
+
import type PolyList from "../base/PolyList";
|
|
21
|
+
|
|
22
|
+
interface DebugObject {
|
|
23
|
+
renderer: PolyListRenderer;
|
|
24
|
+
scale: number;
|
|
25
|
+
color: Color;
|
|
26
|
+
transformMatrix: Mat4;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const g_renderers: Record<string, DebugRenderer> = {};
|
|
30
|
+
|
|
31
|
+
const getMatrix = (transformMatrix: Mat4 | null, position: Vec | null): Mat4 => {
|
|
32
|
+
if (!transformMatrix && position) {
|
|
33
|
+
transformMatrix = Mat4.MakeTranslation(position);
|
|
34
|
+
}
|
|
35
|
+
else if (!transformMatrix) {
|
|
36
|
+
transformMatrix = Mat4.MakeIdentity();
|
|
37
|
+
}
|
|
38
|
+
return transformMatrix;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export default class DebugRenderer {
|
|
42
|
+
private _renderer: Renderer;
|
|
43
|
+
private _objects: DebugObject[];
|
|
44
|
+
private _sphere: PolyList;
|
|
45
|
+
private _sphereRenderer: PolyListRenderer;
|
|
46
|
+
private _arrow: PolyList;
|
|
47
|
+
private _arrowRenderer: PolyListRenderer;
|
|
48
|
+
private _baseMaterial: Material;
|
|
49
|
+
private _materialRenderer: MaterialRenderer;
|
|
50
|
+
private _shader!: DebugRenderShader;
|
|
51
|
+
private _presentShader!: PresentDebugFramebufferShader;
|
|
52
|
+
private _targetTexture!: Texture;
|
|
53
|
+
private _renderBuffer!: RenderBuffer;
|
|
54
|
+
|
|
55
|
+
static Get(renderer: Renderer): DebugRenderer {
|
|
56
|
+
if (!g_renderers[renderer.uniqueId]) {
|
|
57
|
+
g_renderers[renderer.uniqueId] = new DebugRenderer(renderer);
|
|
58
|
+
}
|
|
59
|
+
return g_renderers[renderer.uniqueId];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
constructor(renderer: Renderer) {
|
|
63
|
+
this._renderer = renderer;
|
|
64
|
+
|
|
65
|
+
this._objects = [];
|
|
66
|
+
|
|
67
|
+
this._sphere = createSphere(1);
|
|
68
|
+
this._sphereRenderer = this.renderer.factory.polyList(this._sphere);
|
|
69
|
+
|
|
70
|
+
this._arrow = createArrow(1, 0.3);
|
|
71
|
+
this._arrow.lineWidth = 3;
|
|
72
|
+
this._arrowRenderer = this.renderer.factory.polyList(this._arrow);
|
|
73
|
+
|
|
74
|
+
this._baseMaterial = new Material();
|
|
75
|
+
this._materialRenderer = this.renderer.factory.material(this._baseMaterial);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
get renderer(): Renderer { return this._renderer; }
|
|
79
|
+
|
|
80
|
+
async init(): Promise<void> {
|
|
81
|
+
const renderer = this._renderer;
|
|
82
|
+
|
|
83
|
+
this._shader = new DebugRenderShader(renderer);
|
|
84
|
+
await this._shader.load();
|
|
85
|
+
|
|
86
|
+
this._presentShader = new PresentDebugFramebufferShader(renderer);
|
|
87
|
+
await this._presentShader.load();
|
|
88
|
+
|
|
89
|
+
this._targetTexture = new Texture();
|
|
90
|
+
this._targetTexture.name = `DebugRendererTargetTexture`;
|
|
91
|
+
this._targetTexture.renderTargetAttachment = TextureRenderTargetAttachment.COLOR_ATTACHMENT_0;
|
|
92
|
+
this._targetTexture.componentFormat = TextureComponentFormat.UNSIGNED_BYTE;
|
|
93
|
+
this._targetTexture.wrapModeXY = TextureWrap.CLAMP;
|
|
94
|
+
|
|
95
|
+
this._renderBuffer = renderer.factory.renderBuffer();
|
|
96
|
+
await this._renderBuffer.attachTexture(this._targetTexture);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
beginFrame(): void {
|
|
100
|
+
this._objects = [];
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
drawSphere({ radius = 1, color = Color.White(), transformMatrix = null, position = null }: {
|
|
104
|
+
radius?: number;
|
|
105
|
+
color?: Color;
|
|
106
|
+
transformMatrix?: Mat4 | null;
|
|
107
|
+
position?: Vec | null;
|
|
108
|
+
} = {}): void {
|
|
109
|
+
transformMatrix = getMatrix(transformMatrix, position);
|
|
110
|
+
|
|
111
|
+
this._objects.push({
|
|
112
|
+
renderer: this._sphereRenderer,
|
|
113
|
+
scale: radius,
|
|
114
|
+
color,
|
|
115
|
+
transformMatrix
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
drawArrow({ length = 1, color = Color.White(), transformMatrix = null, position = null }: {
|
|
120
|
+
length?: number;
|
|
121
|
+
color?: Color;
|
|
122
|
+
transformMatrix?: Mat4 | null;
|
|
123
|
+
position?: Vec | null;
|
|
124
|
+
} = {}): void {
|
|
125
|
+
transformMatrix = getMatrix(transformMatrix, position);
|
|
126
|
+
|
|
127
|
+
this._objects.push({
|
|
128
|
+
renderer: this._arrowRenderer,
|
|
129
|
+
scale: length,
|
|
130
|
+
color,
|
|
131
|
+
transformMatrix
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
setViewportSize(width: number, height: number): void {
|
|
136
|
+
this._renderBuffer.size = new Vec(width, height);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
draw(camera: Camera): void {
|
|
140
|
+
const cameraView = Mat4.GetInverted(Transform.GetWorldMatrix(camera.node));
|
|
141
|
+
const viewMatrix = cameraView;
|
|
142
|
+
const projectionMatrix = camera.projectionMatrix;
|
|
143
|
+
this._renderBuffer.update(() => {
|
|
144
|
+
this._renderBuffer.frameBuffer.clear();
|
|
145
|
+
|
|
146
|
+
this._objects.forEach((object: DebugObject) => {
|
|
147
|
+
const scale = Mat4.MakeScale(object.scale, object.scale, object.scale);
|
|
148
|
+
const matrix = scale.mult(object.transformMatrix);
|
|
149
|
+
this._materialRenderer.material.albedo = object.color;
|
|
150
|
+
|
|
151
|
+
object.renderer.bindBuffers();
|
|
152
|
+
this._shader.setup(
|
|
153
|
+
object.renderer,
|
|
154
|
+
this._materialRenderer,
|
|
155
|
+
matrix,
|
|
156
|
+
viewMatrix,
|
|
157
|
+
projectionMatrix
|
|
158
|
+
);
|
|
159
|
+
object.renderer.draw();
|
|
160
|
+
})
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
const shader = this._presentShader;
|
|
164
|
+
this._renderer.presentTexture(this._targetTexture, { clearBuffers: false, shader });
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
destroy(): void {
|
|
168
|
+
this._renderBuffer.destroy();
|
|
169
|
+
this._targetTexture.destroy();
|
|
170
|
+
this._renderBuffer = null as any;
|
|
171
|
+
this._targetTexture = null as any;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
|
|
2
|
+
import WebGLRenderer from '../render/webgl/Renderer';
|
|
3
|
+
import type Texture from '../base/Texture';
|
|
4
|
+
|
|
5
|
+
export default class WebGLTextureViewer {
|
|
6
|
+
private _renderer: WebGLRenderer;
|
|
7
|
+
private _size: [number, number];
|
|
8
|
+
private _canvas: HTMLCanvasElement;
|
|
9
|
+
private _context: CanvasRenderingContext2D | null;
|
|
10
|
+
|
|
11
|
+
constructor(renderer: WebGLRenderer) {
|
|
12
|
+
if (!(renderer instanceof WebGLRenderer)) {
|
|
13
|
+
throw new Error("WebGLTextureViewer works only with WebGL Renderer");
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
this._renderer = renderer;
|
|
17
|
+
|
|
18
|
+
this._size = [512,512];
|
|
19
|
+
|
|
20
|
+
this._canvas = document.createElement('canvas');
|
|
21
|
+
this._canvas.width = this._size[0];
|
|
22
|
+
this._canvas.height = this._size[1];
|
|
23
|
+
this._context = this._canvas.getContext('2d');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
get canvas(): HTMLCanvasElement { return this._canvas; }
|
|
27
|
+
get context(): CanvasRenderingContext2D | null { return this._context; }
|
|
28
|
+
|
|
29
|
+
attachToElement(element: HTMLElement): void {
|
|
30
|
+
element.appendChild(this._canvas);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
drawTexture(texture: Texture): void {
|
|
34
|
+
const { gl } = this._renderer;
|
|
35
|
+
const textureWithApi = texture as any;
|
|
36
|
+
|
|
37
|
+
if (!textureWithApi._apiObject) {
|
|
38
|
+
throw new Error("Error drawing WebGL texture: WebGL texture not initialized");
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
this._canvas.width = texture.size.width;
|
|
42
|
+
this._canvas.height = texture.size.height;
|
|
43
|
+
|
|
44
|
+
// Save current state
|
|
45
|
+
const currentTexture = gl.getParameter(gl.TEXTURE_BINDING_2D);
|
|
46
|
+
const currentFramebuffer = gl.getParameter(gl.FRAMEBUFFER_BINDING);
|
|
47
|
+
|
|
48
|
+
// Draw texture to canvas
|
|
49
|
+
gl.bindTexture(gl.TEXTURE_2D, textureWithApi._apiObject);
|
|
50
|
+
|
|
51
|
+
// Create a framebuffer to read the texture data
|
|
52
|
+
const framebuffer = gl.createFramebuffer();
|
|
53
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
|
|
54
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureWithApi._apiObject, 0);
|
|
55
|
+
|
|
56
|
+
// Read texture data
|
|
57
|
+
let data = new Uint8Array(texture.size.width * texture.size.height * 4);
|
|
58
|
+
gl.readPixels(0, 0, texture.size[0], texture.size[1], gl.RGBA, gl.UNSIGNED_BYTE, data);
|
|
59
|
+
|
|
60
|
+
// Draw texture data to canvas
|
|
61
|
+
const imageData = new ImageData(new Uint8ClampedArray(data), texture.size.width, texture.size.height);
|
|
62
|
+
const w = imageData.width, h = imageData.height;
|
|
63
|
+
const flipped = imageData.data;
|
|
64
|
+
Array.from({length: h}, (val, i) => data.slice(i * w * 4, (i + 1) * w * 4))
|
|
65
|
+
.forEach((val, i) => flipped.set(val, (h - i - 1) * w * 4));
|
|
66
|
+
const ctx = this._context;
|
|
67
|
+
if (ctx) {
|
|
68
|
+
ctx.putImageData(imageData, 0, 0);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Restore previous state
|
|
72
|
+
gl.bindTexture(gl.TEXTURE_2D, currentTexture);
|
|
73
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, currentFramebuffer);
|
|
74
|
+
}
|
|
75
|
+
}
|
package/src/index.html
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>bg2e compilation page</title>
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<script type="module" src="/src/index.js"></script>
|
|
10
|
+
</body>
|
|
11
|
+
</html>
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import bg2math from './math/index';
|
|
2
|
+
import Mat3 from './math/Mat3';
|
|
3
|
+
import Mat4 from './math/Mat4';
|
|
4
|
+
import Vec from './math/Vec';
|
|
5
|
+
import Quat from './math/Quat';
|
|
6
|
+
import MatrixStrategy from './math/MatrixStrategy';
|
|
7
|
+
import bg2tools from './tools/index';
|
|
8
|
+
import bgdb from './db/index';
|
|
9
|
+
import bgbase from './base/index';
|
|
10
|
+
import bgscene from './scene/index';
|
|
11
|
+
import bgapp from './app/index';
|
|
12
|
+
import bgrender from './render/index';
|
|
13
|
+
import * as bgprimitives from './primitives/index';
|
|
14
|
+
import bgshaders from './shaders/index';
|
|
15
|
+
import bgdebug from './debug/index';
|
|
16
|
+
|
|
17
|
+
export const app = bgapp;
|
|
18
|
+
export const base = bgbase;
|
|
19
|
+
export const db = bgdb;
|
|
20
|
+
export const debug = bgdebug;
|
|
21
|
+
export const math = {
|
|
22
|
+
...bg2math,
|
|
23
|
+
Mat3,
|
|
24
|
+
Mat4,
|
|
25
|
+
Vec,
|
|
26
|
+
Quat,
|
|
27
|
+
MatrixStrategy
|
|
28
|
+
};
|
|
29
|
+
export const render = bgrender;
|
|
30
|
+
export const scene = bgscene;
|
|
31
|
+
export const tools = bg2tools;
|
|
32
|
+
export const primitives = bgprimitives;
|
|
33
|
+
export const shaders = bgshaders;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { RenderLayer } from "../base/PolyList";
|
|
2
|
+
import Texture, { TextureComponentFormat, TextureRenderTargetAttachment, TextureWrap } from "../base/Texture";
|
|
3
|
+
import PickSelectionShader from "../shaders/PickSelectionShader";
|
|
4
|
+
import { FrameVisitor } from "../render/SceneRenderer";
|
|
5
|
+
import RenderQueue from "../render/RenderQueue";
|
|
6
|
+
import Vec from "../math/Vec";
|
|
7
|
+
import Mat4 from "../math/Mat4";
|
|
8
|
+
import Transform from "../scene/Transform";
|
|
9
|
+
import Renderer from "../render/Renderer";
|
|
10
|
+
import RenderBuffer from "../render/RenderBuffer";
|
|
11
|
+
import Camera from "../scene/Camera";
|
|
12
|
+
import Node from "../scene/Node";
|
|
13
|
+
|
|
14
|
+
export default class SelectionBuffer {
|
|
15
|
+
protected _renderer: Renderer;
|
|
16
|
+
protected _targetTexture: Texture | null = null;
|
|
17
|
+
protected _renderBuffer: RenderBuffer | null = null;
|
|
18
|
+
protected _shader: PickSelectionShader | null = null
|
|
19
|
+
protected _renderQueue: RenderQueue | null = null;
|
|
20
|
+
protected _frameVisitor: FrameVisitor | null = null;
|
|
21
|
+
|
|
22
|
+
constructor(renderer: Renderer) {
|
|
23
|
+
this._renderer = renderer;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async init() {
|
|
27
|
+
const renderer = this._renderer;
|
|
28
|
+
this._targetTexture = new Texture();
|
|
29
|
+
this._targetTexture.renderTargetAttachment = TextureRenderTargetAttachment.COLOR_ATTACHMENT_0;
|
|
30
|
+
this._targetTexture.componentFormat = TextureComponentFormat.UNSIGNED_BYTE;
|
|
31
|
+
this._targetTexture.wrapModeXY = TextureWrap.CLAMP;
|
|
32
|
+
|
|
33
|
+
this._renderBuffer = renderer.factory.renderBuffer();
|
|
34
|
+
|
|
35
|
+
await this._renderBuffer.attachTexture(this._targetTexture);
|
|
36
|
+
|
|
37
|
+
this._shader = new PickSelectionShader(renderer);
|
|
38
|
+
await this._shader.load();
|
|
39
|
+
|
|
40
|
+
this._renderQueue = new RenderQueue(renderer);
|
|
41
|
+
this._renderQueue.enableQueue(RenderLayer.SELECTION_DEFAULT, this._shader);
|
|
42
|
+
|
|
43
|
+
this._frameVisitor = new FrameVisitor(this._renderQueue);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
reshape(width: number, height: number) {
|
|
47
|
+
if (!this._renderBuffer) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
this._renderBuffer.size = new Vec(width,height);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
draw(scene: Node, camera: Camera, x: number, y: number, width = 1, height = 1) {
|
|
54
|
+
if (!this._renderQueue || !this._frameVisitor || !this._renderBuffer) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const cameraView = Mat4.GetInverted(Transform.GetWorldMatrix(camera.node));
|
|
58
|
+
this._renderQueue.viewMatrix = cameraView;
|
|
59
|
+
this._renderQueue.projectionMatrix = camera.projectionMatrix;
|
|
60
|
+
this._renderQueue.newFrame();
|
|
61
|
+
this._frameVisitor.delta = 0;
|
|
62
|
+
this._frameVisitor.modelMatrix.identity();
|
|
63
|
+
scene.accept(this._frameVisitor);
|
|
64
|
+
|
|
65
|
+
let result = null;
|
|
66
|
+
this._renderBuffer.update(() => {
|
|
67
|
+
this._renderBuffer?.frameBuffer.clear();
|
|
68
|
+
this._renderQueue?.draw(RenderLayer.SELECTION_DEFAULT);
|
|
69
|
+
result = this._renderBuffer?.readPixels(x, y, width, height);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
destroy() {
|
|
76
|
+
this._renderBuffer?.destroy();
|
|
77
|
+
this._targetTexture?.destroy();
|
|
78
|
+
this._renderBuffer = null;
|
|
79
|
+
this._targetTexture = null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
|
|
2
|
+
import { RenderLayer } from "../base/PolyList";
|
|
3
|
+
import Texture, { TextureRenderTargetAttachment, TextureComponentFormat, TextureWrap } from "../base/Texture";
|
|
4
|
+
import Mat4 from "../math/Mat4";
|
|
5
|
+
import Vec from "../math/Vec";
|
|
6
|
+
import RenderQueue from "../render/RenderQueue";
|
|
7
|
+
import { FrameVisitor } from "../render/SceneRenderer";
|
|
8
|
+
import Transform from "../scene/Transform";
|
|
9
|
+
import PickSelectionShader from "../shaders/PickSelectionShader";
|
|
10
|
+
import SelectionHighlightShader from "../shaders/SelectionHighlightShader";
|
|
11
|
+
import Renderer from "../render/Renderer";
|
|
12
|
+
import RenderBuffer from "../render/RenderBuffer";
|
|
13
|
+
import Node from "../scene/Node";
|
|
14
|
+
import Camera from "../scene/Camera";
|
|
15
|
+
|
|
16
|
+
export default class SelectionHighlight {
|
|
17
|
+
protected _renderer: Renderer;
|
|
18
|
+
protected _targetTexture: Texture | null = null
|
|
19
|
+
protected _renderBuffer: RenderBuffer | null = null;
|
|
20
|
+
protected _shader: PickSelectionShader | null = null;
|
|
21
|
+
protected _renderQueue: RenderQueue | null = null
|
|
22
|
+
protected _frameVisitor: FrameVisitor | null = null;
|
|
23
|
+
protected _selectionDrawShader: SelectionHighlightShader | null = null;
|
|
24
|
+
|
|
25
|
+
constructor(renderer: Renderer) {
|
|
26
|
+
this._renderer = renderer;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async init() {
|
|
30
|
+
const renderer = this._renderer;
|
|
31
|
+
this._targetTexture = new Texture();
|
|
32
|
+
this._targetTexture.renderTargetAttachment = TextureRenderTargetAttachment.COLOR_ATTACHMENT_0;
|
|
33
|
+
this._targetTexture.componentFormat = TextureComponentFormat.UNSIGNED_BYTE;
|
|
34
|
+
this._targetTexture.wrapModeXY = TextureWrap.CLAMP;
|
|
35
|
+
|
|
36
|
+
this._renderBuffer = renderer.factory.renderBuffer();
|
|
37
|
+
await this._renderBuffer.attachTexture(this._targetTexture);
|
|
38
|
+
|
|
39
|
+
this._shader = new PickSelectionShader(renderer);
|
|
40
|
+
await this._shader.load();
|
|
41
|
+
this._shader.forceDraw = false;
|
|
42
|
+
|
|
43
|
+
this._renderQueue = new RenderQueue(renderer);
|
|
44
|
+
this._renderQueue.enableQueue(RenderLayer.SELECTION_DEFAULT, this._shader);
|
|
45
|
+
|
|
46
|
+
this._frameVisitor = new FrameVisitor(this._renderQueue);
|
|
47
|
+
|
|
48
|
+
this._selectionDrawShader = new SelectionHighlightShader(renderer);
|
|
49
|
+
await this._selectionDrawShader.load();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
setViewportSize(width: number, height: number) {
|
|
53
|
+
this._renderBuffer!.size = new Vec(width,height);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
draw(scene: Node, camera: Camera) {
|
|
57
|
+
if (!this._renderQueue || !this._frameVisitor || !this._renderBuffer || !this._targetTexture) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const cameraView = Mat4.GetInverted(Transform.GetWorldMatrix(camera.node));
|
|
62
|
+
this._renderQueue.viewMatrix = cameraView;
|
|
63
|
+
this._renderQueue.projectionMatrix = camera.projectionMatrix;
|
|
64
|
+
this._renderQueue.newFrame();
|
|
65
|
+
this._frameVisitor.delta = 0;
|
|
66
|
+
this._frameVisitor.modelMatrix.identity();
|
|
67
|
+
scene.accept(this._frameVisitor);
|
|
68
|
+
|
|
69
|
+
this._renderBuffer.update(() => {
|
|
70
|
+
this._renderBuffer?.frameBuffer.clear();
|
|
71
|
+
this._renderQueue?.draw(RenderLayer.SELECTION_DEFAULT);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// TODO: Draw target texture using a border detection shader
|
|
75
|
+
const shader = this._selectionDrawShader;
|
|
76
|
+
this._renderer.presentTexture(this._targetTexture, { clearBuffers: false, shader });
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
destroy() {
|
|
80
|
+
this._renderBuffer?.destroy();
|
|
81
|
+
this._targetTexture?.destroy();
|
|
82
|
+
this._renderBuffer = null;
|
|
83
|
+
this._targetTexture = null;
|
|
84
|
+
}
|
|
85
|
+
}
|