Code: Select all
EnableExplicit
! var THREE;
DeclareModule ThreeJS
EnableExplicit
Global IsInitialized
Declare Init(Callback)
Declare Gadget(Gadget, x, y, Width, Height, Flags = 0)
Declare NewScene()
Declare NewWebGlRenderer()
Declare RendererSetSize(Renderer, Width, Height)
Declare NewPerspectiveCamera(Fov.d, Aspect.d, Near.d, Far.d)
Declare NewBoxGeometry(width, height, depth, widthSegments = #Null, heightSegments = #Null, depthSegments = #Null)
Declare NewMeshBasicMaterial(Params)
Declare NewMesh(Geometry = #PB_Ignore, Material = #PB_Ignore)
Declare SceneAdd(Scene, Object)
Declare AddRenderer(Gadget, Renderer)
EndDeclareModule
Module ThreeJS
EnableExplicit
Macro GetSelector
! var selector = $(spider_GadgetID(v_gadget).div).find('.dijitContentPane');
EndMacro
Procedure Init(Callback)
! require(["https://cdnjs.cloudflare.com/ajax/libs/three.js/84/three.min.js"],
! function(t) {
! THREE = t;
IsInitialized = #True
! v_callback();
! }
! );
EndProcedure
Procedure Gadget(Gadget, x, y, Width, Height, Flags = 0)
If Gadget = #PB_Any
Gadget = ContainerGadget(Gadget, x, y, Width, Height, Flags)
Else
ContainerGadget(Gadget, x, y, Width, Height, Flags)
EndIf
CloseGadgetList()
ProcedureReturn Gadget
EndProcedure
Procedure NewScene()
! return new THREE.Scene();
EndProcedure
Procedure NewWebGlRenderer()
! return new THREE.WebGLRenderer();
EndProcedure
Procedure RendererSetSize(Renderer, Width, Height)
! v_renderer.setSize( v_width, v_height );
EndProcedure
Procedure NewPerspectiveCamera(Fov.d, Aspect.d, Near.d, Far.d)
; https://threejs.org/docs/index.html?q=camera#Reference/Cameras/PerspectiveCamera
; fov — Camera frustum vertical field of view.
; aspect — Camera frustum aspect ratio.
; near — Camera frustum near plane.
; far — Camera frustum far plane.
! return new THREE.PerspectiveCamera(v_fov, v_aspect, v_near, v_far);
EndProcedure
Procedure NewBoxGeometry(width, height, depth, widthSegments = #Null, heightSegments = #Null, depthSegments = #Null)
; https://threejs.org/docs/index.html?q=BoxGeometry#Reference/Geometries/BoxGeometry
; width — Width of the sides on the X axis.
; height — Height of the sides on the Y axis.
; depth — Depth of the sides on the Z axis.
; widthSegments — Optional. Number of segmented faces along the width of the sides. Default is 1.
; heightSegments — Optional. Number of segmented faces along the height of the sides. Default is 1.
; depthSegments — Optional. Number of segmented faces along the depth of the sides. Default is 1.
! return new THREE.BoxGeometry( v_width, v_height, v_depth );
EndProcedure
Procedure NewMeshBasicMaterial(Params)
; https://threejs.org/docs/index.html?q=MeshBasicMaterial#Reference/Materials/MeshBasicMaterial
! return new THREE.MeshBasicMaterial( v_params );
EndProcedure
Procedure NewMesh(Geometry = #PB_Ignore, Material = #PB_Ignore)
If Geometry = #PB_Ignore
! v_geometry = undefined;
EndIf
If Material = #PB_Ignore
! v_material = undefined;
EndIf
; https://threejs.org/docs/index.html?q=Mesh#Reference/Objects/Mesh
; geometry — (optional) an instance of Geometry or BufferGeometry. Default is a new BufferGeometry.
; material — (optional) a Material. Default is a new MeshBasicMaterial with a random color.
! return new THREE.Mesh( v_geometry, v_material );
EndProcedure
Procedure SceneAdd(Scene, Object)
! v_scene.add( v_object );
EndProcedure
Procedure AddRenderer(Gadget, Renderer)
GetSelector
! selector.append( v_renderer.domElement );
EndProcedure
EndModule
; Demo
Enumeration
#myWindow
#myGadget
EndEnumeration
Global Cube
Global Renderer
Global Scene
Global Camera
Procedure Render()
! requestAnimationFrame( f_render );
! v_cube.rotation.x += 0.05;
! v_cube.rotation.y += 0.05;
! v_renderer.render(v_scene, v_camera);
EndProcedure
Procedure Main()
OpenWindow(#myWindow, #PB_Ignore, #PB_Ignore, 800, 600, "ThreeJS", #PB_Window_ScreenCentered)
ThreeJS::Gadget(#myGadget, 0, 0, WindowWidth(#myWindow), WindowHeight(#myWindow))
Protected Geometry
Protected MeshBasicMaterialParams
Protected Material
Scene = ThreeJS::NewScene()
Camera = ThreeJS::NewPerspectiveCamera(75, GadgetWidth(#myGadget) / GadgetHeight(#myGadget), 0.1, 1000)
Renderer = ThreeJS::NewWebGlRenderer()
ThreeJS::AddRenderer(#myGadget, Renderer)
ThreeJS::RendererSetSize(Renderer, GadgetWidth(#myGadget), GadgetHeight(#myGadget))
Geometry = ThreeJS::NewBoxGeometry(1, 1, 1)
! v_meshbasicmaterialparams = { color: 0x00ff00, wireframe: true };
Material = ThreeJS::NewMeshBasicMaterial(MeshBasicMaterialParams)
Cube = ThreeJS::NewMesh(Geometry, Material)
ThreeJS::SceneAdd(Scene, Cube)
! v_camera.position.z = 5;
Render()
EndProcedure
ThreeJS::Init(@Main())
Greetings ... Peter