diff --git a/src/generatedCode.ts b/src/generatedCode.ts index 4e5da880..e481cb73 100644 --- a/src/generatedCode.ts +++ b/src/generatedCode.ts @@ -4085,23 +4085,24 @@ export class FiberTorusKnot implements HasPropsHandlers { * * This code has been generated */ -export class FiberLineSystem implements HasPropsHandlers { - private propsHandlers: PropsHandler[]; +export class FiberLineSystem implements HasPropsHandlers { + private propsHandlers: PropsHandler[]; constructor() { this.propsHandlers = [ - new FiberMeshPropsHandler() + new FiberLinesMeshPropsHandler() + , new FiberMeshPropsHandler() , new FiberAbstractMeshPropsHandler() , new FiberTransformNodePropsHandler() , new FiberNodePropsHandler() ]; } - getPropsHandlers(): PropsHandler[] { + getPropsHandlers(): PropsHandler[] { return this.propsHandlers; } - addPropsHandler(propHandler: PropsHandler): void { + addPropsHandler(propHandler: PropsHandler): void { this.propsHandlers.push(propHandler); } @@ -4175,23 +4176,24 @@ export class FiberLineSystem implements HasPropsHandlers { * * This code has been generated */ -export class FiberLines implements HasPropsHandlers { - private propsHandlers: PropsHandler[]; +export class FiberLines implements HasPropsHandlers { + private propsHandlers: PropsHandler[]; constructor() { this.propsHandlers = [ - new FiberMeshPropsHandler() + new FiberLinesMeshPropsHandler() + , new FiberMeshPropsHandler() , new FiberAbstractMeshPropsHandler() , new FiberTransformNodePropsHandler() , new FiberNodePropsHandler() ]; } - getPropsHandlers(): PropsHandler[] { + getPropsHandlers(): PropsHandler[] { return this.propsHandlers; } - addPropsHandler(propHandler: PropsHandler): void { + addPropsHandler(propHandler: PropsHandler): void { this.propsHandlers.push(propHandler); } @@ -4266,23 +4268,24 @@ export class FiberLines implements HasPropsHandlers { * * This code has been generated */ -export class FiberDashedLines implements HasPropsHandlers { - private propsHandlers: PropsHandler[]; +export class FiberDashedLines implements HasPropsHandlers { + private propsHandlers: PropsHandler[]; constructor() { this.propsHandlers = [ - new FiberMeshPropsHandler() + new FiberLinesMeshPropsHandler() + , new FiberMeshPropsHandler() , new FiberAbstractMeshPropsHandler() , new FiberTransformNodePropsHandler() , new FiberNodePropsHandler() ]; } - getPropsHandlers(): PropsHandler[] { + getPropsHandlers(): PropsHandler[] { return this.propsHandlers; } - addPropsHandler(propHandler: PropsHandler): void { + addPropsHandler(propHandler: PropsHandler): void { this.propsHandlers.push(propHandler); } @@ -5168,23 +5171,24 @@ export class FiberTiledGround implements HasPropsHandlers { * * This code has been generated */ -export class FiberGroundFromHeightMap implements HasPropsHandlers { - private propsHandlers: PropsHandler[]; +export class FiberGroundFromHeightMap implements HasPropsHandlers { + private propsHandlers: PropsHandler[]; constructor() { this.propsHandlers = [ - new FiberMeshPropsHandler() + new FiberGroundMeshPropsHandler() + , new FiberMeshPropsHandler() , new FiberAbstractMeshPropsHandler() , new FiberTransformNodePropsHandler() , new FiberNodePropsHandler() ]; } - getPropsHandlers(): PropsHandler[] { + getPropsHandlers(): PropsHandler[] { return this.propsHandlers; } - addPropsHandler(propHandler: PropsHandler): void { + addPropsHandler(propHandler: PropsHandler): void { this.propsHandlers.push(propHandler); } diff --git a/src/generatedProps.ts b/src/generatedProps.ts index d06873b7..d437552c 100644 --- a/src/generatedProps.ts +++ b/src/generatedProps.ts @@ -319,9 +319,9 @@ declare global { cylinder: FiberMeshProps & FiberCylinderPropsCtor & BabylonNode; torus: FiberMeshProps & FiberTorusPropsCtor & BabylonNode; torusKnot: FiberMeshProps & FiberTorusKnotPropsCtor & BabylonNode; - lineSystem: FiberMeshProps & FiberLineSystemPropsCtor & BabylonNode; - lines: FiberMeshProps & FiberLinesPropsCtor & BabylonNode; - dashedLines: FiberMeshProps & FiberDashedLinesPropsCtor & BabylonNode; + lineSystem: FiberLinesMeshProps & FiberLineSystemPropsCtor & BabylonNode; + lines: FiberLinesMeshProps & FiberLinesPropsCtor & BabylonNode; + dashedLines: FiberLinesMeshProps & FiberDashedLinesPropsCtor & BabylonNode; extrudeShape: FiberMeshProps & FiberExtrudeShapePropsCtor & BabylonNode; extrudeShapeCustom: FiberMeshProps & FiberExtrudeShapeCustomPropsCtor & BabylonNode; lathe: FiberMeshProps & FiberLathePropsCtor & BabylonNode; @@ -329,7 +329,7 @@ declare global { plane: FiberMeshProps & FiberPlanePropsCtor & BabylonNode; ground: FiberMeshProps & FiberGroundPropsCtor & BabylonNode; tiledGround: FiberMeshProps & FiberTiledGroundPropsCtor & BabylonNode; - groundFromHeightMap: FiberMeshProps & FiberGroundFromHeightMapPropsCtor & BabylonNode; + groundFromHeightMap: FiberGroundMeshProps & FiberGroundFromHeightMapPropsCtor & BabylonNode; 'babylon-polygon': FiberMeshProps & FiberPolygonPropsCtor & BabylonNode; extrudePolygon: FiberMeshProps & FiberExtrudePolygonPropsCtor & BabylonNode; tube: FiberMeshProps & FiberTubePropsCtor & BabylonNode; diff --git a/stories/babylonjs/Hooks/hooks.stories.js b/stories/babylonjs/Hooks/hooks.stories.js index 6f9d98da..c26813e7 100644 --- a/stories/babylonjs/Hooks/hooks.stories.js +++ b/stories/babylonjs/Hooks/hooks.stories.js @@ -15,32 +15,85 @@ const ContextLogger = (props, context) => { return null; } -const RotatingBoxScene = (props) => { - const boxRef = useRef(null); +const size = 2; +const shade = 0; +const rpm = 10; +const RotatingBox = ({position}) => { + const centerTransform = useRef(); useBeforeRender((scene) => { - if (boxRef.current) { - var deltaTimeInMillis = scene.getEngine().getDeltaTime(); - - const rpm = props.rpm || 10; - boxRef.current.rotation.y += ((rpm / 60) * Math.PI * 2 * (deltaTimeInMillis / 1000)); + if (centerTransform.current !== null) { + const deltaTimeInMillis = scene.getEngine().getDeltaTime(); + centerTransform.current.rotation.y += ((rpm / 60) * Math.PI * 2 * (deltaTimeInMillis / 1000)); } }) - return ( - <> - - - - - - - - ) + return ( + + + + + ) } -const RenderHooks = (props, context) => { - return ( +const RotatingBoxScene = (props) => ( + <> + + + + + + +) + +export const RenderHooksStory = () => ( +
@@ -48,12 +101,6 @@ const RenderHooks = (props, context) => { - ) -} - -export const RenderHooksStory = () => ( -
-
) diff --git a/stories/babylonjs/PostProcess/pipeline.stories.js b/stories/babylonjs/PostProcess/pipeline.stories.js index bd12fabe..4c18852e 100644 --- a/stories/babylonjs/PostProcess/pipeline.stories.js +++ b/stories/babylonjs/PostProcess/pipeline.stories.js @@ -9,12 +9,12 @@ export const Pipeline = () => (
- + - + diff --git a/stories/babylonjs/Textures/dynamic-configuration.stories.js b/stories/babylonjs/Textures/pbr-configuration.stories.js similarity index 70% rename from stories/babylonjs/Textures/dynamic-configuration.stories.js rename to stories/babylonjs/Textures/pbr-configuration.stories.js index a4d27ac0..0b4b35c2 100644 --- a/stories/babylonjs/Textures/dynamic-configuration.stories.js +++ b/stories/babylonjs/Textures/pbr-configuration.stories.js @@ -1,77 +1,11 @@ import React, { useCallback, useState } from 'react'; import { Vector3, Color3, Texture } from '@babylonjs/core'; -import { Engine, Scene, HostRegistrationStore, useScene, checkPrimitiveDiff } from 'react-babylonjs'; +import { Engine, Scene, useScene } from 'react-babylonjs'; import '../../style.css'; export default { title: 'Textures' }; - -class PrimitivesPropsHandler { - IGNORED_PROPS = 'assignFrom'; // TODO: add other built-in like 'key', etc. - - getPropertyUpdates(oldProps, newProps) { - var combined = Object.keys(oldProps).reduce((prev, cur) => { - if (this.IGNORED_PROPS.indexOf(cur) === -1) { - prev[cur] = { - old: oldProps[cur] - } - } - return prev; - }, {}); - - var combined = Object.keys(newProps).reduce((prev, cur) => { - if (this.IGNORED_PROPS.indexOf(cur) === -1) { - if (prev[cur] !== undefined) { - prev[cur].new = newProps[cur]; - } else { - prev[cur] = { - new: newProps[cur] - } - } - } - return prev; - }, combined); - - const changedProps = []; - for (var propName in combined) { - checkPrimitiveDiff(combined[propName].old, combined[propName].new, propName, changedProps); - }; - return changedProps.length === 0 ? null : changedProps; - } -} - -class FiberPBRClearCoatConfiguration { - constructor() { - this.propsHandlers = [ - new PrimitivesPropsHandler() - ]; - } - - getPropsHandlers() { - return this.propsHandlers; - } - - addPropsHandler(propHandler) { - this.propsHandlers.push(propHandler); - } -} - -HostRegistrationStore.Register({ - hostElementName: "pbrClearCoatConfiguration", - hostFactory: (scene) => { console.error('registered host factory method not applicable for demo') }, - propHandlerInstance: new FiberPBRClearCoatConfiguration(), - createInfo: { - "creationType": "...", - "libraryLocation": "...", - "namespace": "@babylonjs/materials/clearCoat", - "parameters": [] - }, - metadata: { - "className": "FiberPBRClearCoatConfiguration" - } -}) - var cubeTexture = null; var cubeTextureClone = null; const onSceneMounted = (createdArgs) => { @@ -84,14 +18,11 @@ const onSceneMounted = (createdArgs) => { */ const WithDynamicConfig = ({ roughness }) => { let environmentUrl = 'assets/textures/environment.dds' - const scene = useScene(); const [texturesLoaded, setTexturesLoaded] = useState(false); const cubeTextureRef = useCallback(node => { if (node && texturesLoaded === false) { - scene.debugLayer.show(); setTexturesLoaded(true); // trigger render and props assignment - console.log('cubeTexture', node) cubeTexture = node; cubeTextureClone = cubeTexture.clone(); @@ -183,9 +114,9 @@ export const DynamicConfig = () => { } DynamicConfig.story = { - name: 'PBR ClearCoat (experiment)', + name: 'PBR set roughness', parameters: { - notes: 'Just an experiment - not fixed API.' + notes: 'Experimental API.' } } diff --git a/tools/generate-code.ts b/tools/generate-code.ts index 20b81533..f71bcdac 100644 --- a/tools/generate-code.ts +++ b/tools/generate-code.ts @@ -1,3 +1,4 @@ +import { exit } from 'process'; /** * To debug code generation use the launch config in VS Code - "Generate Code (debug)" */ @@ -50,6 +51,8 @@ type ClassNameSpaceTuple = { moduleDeclaration: ModuleDeclaration } +const addedClassDeclarationsMap = new Map(); + // to set onXXX properties. via onXXX.add(() => void). TODO: use TypeGuards.isTypeReferenceNode(...) and check type const OBSERVABLE_PATTERN: RegExp = /^BabylonjsCoreObservable<.*>$/; @@ -417,22 +420,14 @@ const addMetadata = (classDeclaration: ClassDeclaration, originalClassDeclaratio const createdFactoryClasses: string[] = []; /** - * Create Element from static factory function - * @param factoryClassName - * @param hostClassName - * @param prefix - * @param keepOriginName - * @param metadata - * @param generatedCodeSourceFile - * @param generatedPropsSourceFile + * Create host element from class declaration static (creation) methods */ -const createFactoryClass = (factoryClassName: string, hostClassName: string, prefix: string, metadata: InstanceMetadataParameter, generatedCodeSourceFile: SourceFile, generatedPropsSourceFile: SourceFile) => { +const createFactoryClass = (factoryClassName: string, prefix: string, metadata: InstanceMetadataParameter, generatedCodeSourceFile: SourceFile, generatedPropsSourceFile: SourceFile) => { let factoryBuilderTuple: ClassNameSpaceTuple = classesOfInterest.get(factoryClassName)!; - let hostTuple: ClassNameSpaceTuple = classesOfInterest.get(hostClassName)!; let factoryMethods: MethodDeclaration[] = factoryBuilderTuple.classDeclaration.getStaticMethods(); - factoryMethods.forEach((method: MethodDeclaration) => { + for (const method of factoryMethods) { const methodName: string = method.getName(); if (methodName && methodName.startsWith('Create') || methodName.startsWith('Extrude')) { let factoryType: string = methodName.startsWith('Create') @@ -441,13 +436,17 @@ const createFactoryClass = (factoryClassName: string, hostClassName: string, pre factoryType = prefix + factoryType; createdFactoryClasses.push(factoryType); - addHostElement(factoryType, hostTuple.classDeclaration); - let newClassDeclaration: ClassDeclaration = addClassDeclarationFromFactoryMethod(generatedCodeSourceFile, factoryType, classesOfInterest.get(hostClassName)!.classDeclaration, method); + // [0] is always the ClassDeclaration (at least for MeshBuilder and AdvancedDynamicTexture factory methods) + const hostClassName = (method.getReturnType().getSymbol()!.getDeclarations()[0] as ClassDeclaration).getName()!; + const classDeclarationType = addedClassDeclarationsMap.get(hostClassName) ?? classesOfInterest.get(hostClassName)!.classDeclaration!; + + addHostElement(factoryType, classDeclarationType); + let newClassDeclaration: ClassDeclaration = addClassDeclarationFromFactoryMethod(generatedCodeSourceFile, factoryType, classDeclarationType, method); addCreateInfoFromFactoryMethod(method, camelCase(factoryBuilderTuple.classDeclaration.getName()!), methodName, newClassDeclaration, "@babylonjs/core", generatedCodeSourceFile, generatedPropsSourceFile) addMetadata(newClassDeclaration, undefined /* no original class */, metadata) } - }); + }; console.log(`${factoryClassName} Factory - ${createdFactoryClasses.sort((a, b) => a.localeCompare(b)).map(c => classToIntrinsic(c).replace(/['\u2019]/g, '')).join(', ')}`); }; @@ -1366,6 +1365,7 @@ const createClassesInheritedFrom = (generatedCodeSourceFile: SourceFile, generat addMetadata(newClassDeclaration, derivedClassDeclaration, metadata); onAfterClassCreate && onAfterClassCreate(derivedClassDeclaration); + addedClassDeclarationsMap.set(derivedClassDeclaration.getName()!, derivedClassDeclaration); }); console.log(`Building ${derivedClassesOrdered.size} ${baseClassName}s: ${(Array.from(derivedClassesOrdered.values())).map(c => c.getName()!).sort((a, b) => a.localeCompare(b)).map(c => classToIntrinsic(c)).join(', ')}`) @@ -1549,7 +1549,6 @@ const generateCode = async () => { if (classesOfInterest.get("MeshBuilder") !== undefined) { createFactoryClass( "MeshBuilder", - "Mesh", "", { acceptsMaterials: true, @@ -1613,7 +1612,6 @@ const generateCode = async () => { const onTexturesCreate = (classDeclaration: ClassDeclaration) => { if (classDeclaration.getName() === `${ClassNamesPrefix}AdvancedDynamicTexture`) { createFactoryClass( - 'AdvancedDynamicTexture', 'AdvancedDynamicTexture', 'ADT', { @@ -1776,10 +1774,14 @@ const generateCode = async () => { await generatedPropsSourceFile.save(); } +console.time('total-duration'); const result = generateCode(); result.then(() => { console.log('completed without errors'); }).catch(reason => { console.error('failed:', reason); +}).finally(() => { + console.timeEnd('total-duration'); + exit(); }) \ No newline at end of file