UNPKG

wordpress-plugin

Version:

Boilerplate WordPress Plugin structure to support development of JavaScript frameworks: React, Vue, Vanilla, TypeScript, supporting Vite, NextJS, Nuxt, Gatsby, and JSX/TSX Components (like MUI), CSS (like Tailwind + Unity), data APIs (like REST and GraphQ

1,639 lines (1,404 loc) 98.6 kB
/** * ThreeDGarden - Custom Admin JavaScript * *************************************************************************************** */ const app = Vue.createApp({ //data: function() { data() { return { plugin: 'ThreeD Garden' } } }) console.log("app", app) const App = app.mount('#webgl') //const App = app.mount('#app') console.log("App", App) // check for WebGL if ( ! Detector.webgl ) Detector.addGetWebGLMessage() /** PARAMETERS FROM PHP */ const pluginName = postdata.plugin_name const pluginVersion = postdata.plugin_version const pluginURL = postdata.plugin_url const themeURI = postdata.theme_uri const restURL = postdata.rest_url const worldID = postdata.world_id console.log("-----------------------") console.log("pluginName-------------") console.log(pluginName, pluginVersion) console.log("-----------------------") /** INSTANTIATE COMMON VARIABLES */ let scene let plane let camera let controls let gui gui = new dat.GUI({ autoPlace: true, closeOnTop: true }) gui.close() gui.domElement.id = "gui" let guiFolderRotation = gui.addFolder("Rotation + Animation") //let guiFolderAnimation = guiFolderRotation.addFolder("Animation") let guiFolderCameras = gui.addFolder("Camera Position") let guiFolderLights = gui.addFolder("Directional Light") let guiFolderAllotments = gui.addFolder("Allotments") let guiFolderBeds = gui.addFolder("Beds") let guiFolderPlants = gui.addFolder("Plants") //let guiFolderInfospots = gui.addFolder("Infospots") let guiFolderAnnotations = gui.addFolder("Annotations") let guiFolderPlayer = gui.addFolder("Character") let renderer let container let canvas let player = {} player.action = "Idle" player.actionTime = Date.now() let animations = {} let anims = ["Breathing Idle", "Driving", "Idle", "Left Turn", "Pointing", "Pointing Gesture"] anims = [...anims, "Right Turn", "Running", "Talking", "Turn", "Walking", "Walking Backwards"] let anims2 = ["ascend-stairs", "gather-objects", "look-around", "push-button", "run"] let tweens = [] let stats let cellSize = 16 let interactive = false let levelIndex = 0 let _hints = 0 let score = 0 let debug = false let debugPhysics = false let cameraFade = 0.05 let mute = false let collect = [] let messages = { text: [ "Welcome to your ThreeD Garden", "GO GROW!" ], index: 0 } let params = { /** SET MODES */ modes: Object.freeze({ NONE: Symbol("none"), PRELOAD: Symbol("preload"), INITIALISING: Symbol("initialising"), CREATING_LEVEL: Symbol("creating_level"), ACTIVE: Symbol("active"), GAMEOVER: Symbol("gameover") }), /** turn on/off animation */ ANIMATE: false, /** where multimedia files located */ assetsPath: `${pluginURL}assets/`, /** all the data from rest api calls to be stored here */ data: { world: [{id: worldID}], scene: [], allotment: [], bed: [], plant: [], planting_plan: [] }, /** POINTER HOVERS + CLICKS */ intersectedObject1: null, intersectedObject2: null, /** PLAYER COLLISION INTO OBJECTS */ colliders: [], // params.colliders.push(object3D) // town.fbx environment: {}, // custom fbx farmhouse: {}, } params.mode = params.modes.NONE guiFolderRotation.add(params, "ANIMATE").name("Run Animation") //if (localStorage && ! debug){ //const levelIndex = Number(localStorage.getItem('levelIndex')) //if (levelIndex!=undefined) this.levelIndex = levelIndex //} const sfxExt = SFX.supportsAudioType('mp3') ? 'mp3' : 'ogg' const options = { assets:[ `${params.assetsPath}sfx/gliss.${sfxExt}`, `${params.assetsPath}sfx/factory.${sfxExt}`, `${params.assetsPath}sfx/button.${sfxExt}`, `${params.assetsPath}sfx/door.${sfxExt}`, `${params.assetsPath}sfx/fan.${sfxExt}`, `${params.assetsPath}fbx/environment.fbx`, `${params.assetsPath}fbx/girl-walk.fbx`, `${params.assetsPath}fbx/usb.fbx`, ], oncomplete: function(){ init() //animate() } } anims.forEach( function(anim){ options.assets.push(`${params.assetsPath}fbx/anims2/${anim}.fbx`)}) params.mode = params.modes.PRELOAD //this.init() //this.animate() const preloader = new Preloader(options) /** * init main constructor */ window.onload = function(e){ //init() } window.garden = this window.onError = function(error){ console.error(JSON.stringify(error)) } document.getElementById("camera-btn").onclick = function(){ switchCamera() } document.getElementById("briefcase-btn").onclick = function(){ toggleBriefcase() } document.getElementById("action-btn").onclick = function(){ contextAction() } document.getElementById("sfx-btn").onclick = function(){ toggleSound() } let actionBtn = document.getElementById("action-btn") const loaderFBX = new THREE.FBXLoader() const loaderGLTF = new THREE.GLTFLoader() const loaderOBJ = new THREE.OBJLoader() const loaderTexture = new THREE.TextureLoader() const clock = new THREE.Clock() /** POINTER HOVERS + CLICKS */ const raycaster = new THREE.Raycaster() const pointer = new THREE.Vector2() /** REST API URLS */ const API_URL_SCENES = `${restURL}scene/?_embed&per_page=100` const API_URL_ALLOTMENTS = `${restURL}allotment/?_embed&per_page=100` const API_URL_BEDS = `${restURL}bed/?_embed&per_page=100` const API_URL_PLANTING_PLANS = `${restURL}planting_plan/?_embed&per_page=100` const API_URL_PLANTS = `${restURL}plant/?_embed&per_page=100` let api_urls = [ API_URL_SCENES, API_URL_ALLOTMENTS, API_URL_BEDS, API_URL_PLANTING_PLANS, API_URL_PLANTS ] /** * BEGIN MAIN * *************************************************************************************** */ function init() { Promise.allSettled( api_urls.map( url => fetch(url) .then(results => results.json()) .then(data => { let type = data[0].type switch (type) { case "scene" : params.data.scene = [...data] break case "allotment" : params.data.allotment = [...data] break case "bed" : params.data.bed = [...data] break case "plant" : params.data.plant = [...data] break case "planting_plan" : params.data.planting_plan = [...data] break default : break } // console.log("-----------------") // console.log(data) // console.log("-----------------") }) ) ) .then(results => { // (*) //console.log(results) results.forEach((result, num) => { if (result.status == "fulfilled") { //alert(`${urls[num]}: ${result.value.status}`) //console.log(result) } if (result.status == "rejected") { //alert(`${urls[num]}: ${result.reason}`) console.log(result) } }) console.log("-----------------") console.log("params.data------") console.log(params.data) console.log("-----------------") /** * init scene constructor */ buildScene() } ) //throwError() } /** * BUILD SCENE * *************************************************************************************** */ function buildScene() { // console.log("-----------------------") // console.log("params.data.scene------") // console.log(params.data.scene) // console.log(params.data.scene.length) // console.log("-----------------------") let wpScene = params.data.scene[0] sceneID = wpScene.id // console.log("-----------------------") // console.log("wpScene----------------") // console.log(wpScene) // console.log("-----------------------") /** THREE JS SCENE ******************************************************************* */ scene = new THREE.Scene() scene.name = "ThreeD Garden" // load the 3D cube map? if ( wpScene.acf.scene_background_image_px ) { let cubeMapURLs = [ wpScene.acf.scene_background_image_px, wpScene.acf.scene_background_image_nx, wpScene.acf.scene_background_image_py, wpScene.acf.scene_background_image_ny, wpScene.acf.scene_background_image_pz, wpScene.acf.scene_background_image_nz ] let reflectionCube = new THREE.CubeTextureLoader().load(cubeMapURLs) reflectionCube.format = THREE.RGBFormat scene.background = reflectionCube } // load the 2D background image? else if ( wpScene.acf.scene_background_image ) { // let bgTexture = loaderTexture.load(wpScene.acf.scene_background_image) // scene.background = bgTexture let bgTexture = loaderTexture.load( wpScene.acf.scene_background_image, () => { const rt = new THREE.WebGLCubeRenderTarget(bgTexture.image.height) rt.fromEquirectangularTexture(renderer, bgTexture) scene.background = rt } ) } // load the background color? else if ( wpScene.acf.scene_background_color ) { scene.background = new THREE.Color(wpScene.acf.scene_background_color) //scene.fog = new THREE.Fog(0xFFFFFF, 0, 500) } /** GEOMETRIES *********************************************************************** */ let plane = getPlane( wpScene.acf.scene_plane_width_x, wpScene.acf.scene_plane_length_y, wpScene.acf.scene_plane_background_color ) plane.name = "plane-jane" plane.rotation.x = -Math.PI / 2 // -90 degrees in radians //plane.position.z = 10 //plane.rotation.z += 0.002 guiFolderRotation.add(plane.rotation, "x", -Math.PI, Math.PI).listen() guiFolderRotation.add(plane.rotation, "y", -Math.PI, Math.PI).listen() guiFolderRotation.add(plane.rotation, "z", -Math.PI, Math.PI).listen() /** TEXTURES ************************************************************************* */ if ( wpScene.acf.scene_plane_texture_image ) { plane.material.roughness = 0.0 //plane.material.map = loaderTexture.load("/wp-content/plugins/threed-garden/admin/media/textures/grasslight-big.jpg") plane.material.map = loaderTexture.load(wpScene.acf.scene_plane_texture_image) // plane.material.bumpMap = loaderTexture.load("/wp-content/plugins/threed-garden/admin/media/textures/grasslight-big-nm.jpg") // plane.material.bumpMap = loaderTexture.load(wpScene.acf.scene_plane_texture_image) // plane.material.bumpScale = 0.01 let planeTextureMap = plane.material.map planeTextureMap.wrapS = THREE.RepeatWrapping planeTextureMap.wrapT = THREE.RepeatWrapping planeTextureMap.repeat.set(4, 4) } /** LIGHTS *************************************************************************** */ // let pointLight = getPointLight(0xFFFFFF, 4.0) // pointLight.position.set( -20, -60, 20 ) // //pointLight.intensity = 3.0 // let spotLight = getSpotLight(0xFFFFFF, 4.0) // spotLight.position.set( -20, -60, 20 ) // //spotLight.intensity = 3.0 let directionalLight = getDirectionalLight(0xFFFFFF, 2.1) directionalLight.position.set( -90, -120, 120 ) //directionalLight.intensity = 2.4 let helperDirectionalLight = new THREE.CameraHelper(directionalLight.shadow.camera) helperDirectionalLight.visible = false // let directionalLight2 = getDirectionalLight(0xFFFFFF, 1.0) // directionalLight2.castShadow = false // directionalLight2.position.set( 90, 120, 120 ) // //directionalLight2.intensity = 1.4 // let helperDirectionalLight2 = new THREE.CameraHelper(directionalLight2.shadow.camera) // helperDirectionalLight2.visible = true //let ambientLight = getAmbientLight(0xFFFFFF, 0.1) //ambientLight.position.set( -100, -100, 25 ) guiFolderLights.add(helperDirectionalLight, "visible", 0, 20).name("Show Light Helper") guiFolderLights.add(directionalLight, "intensity", 0, 20) guiFolderLights.add(directionalLight.position, "x", -500, 500) guiFolderLights.add(directionalLight.position, "y", -500, 500) guiFolderLights.add(directionalLight.position, "z", -500, 500) // guiFolderLights.add(helperDirectionalLight2, "visible", 0, 20).name("Show Light 2 Helper") // guiFolderLights.add(directionalLight2, "intensity", 0, 20) // guiFolderLights.add(directionalLight2.position, "x", -500, 500) // guiFolderLights.add(directionalLight2.position, "y", -500, 500) // guiFolderLights.add(directionalLight2.position, "z", -500, 500) /** SCENE ***************************************************************************** */ // add objects to scene //plane.add(structure) //plane.add(pointLight) //plane.add(spotLight) plane.add(directionalLight) //plane.add(directionalLight2) //plane.add(ambientLight) scene.add(helperDirectionalLight) //scene.add(helperDirectionalLight2) scene.add(plane) /** CAMERA **************************************************************************** */ camera = new THREE.PerspectiveCamera( 55, window.innerWidth/window.innerHeight, 0.1, 1000 ) camera.name = "gardencam1" camera.position.set(86, 64, 182) //camera.lookAt(new THREE.Vector3(0, 0, 0)) // overridden by OrbitControls.target let helperCamera = new THREE.CameraHelper(camera) helperCamera.visible = false scene.add(helperCamera) guiFolderCameras.add(helperCamera, "visible", 0, 20).name("Show Camera Helper") guiFolderCameras.add(camera.position, "x", -500, 500).listen() guiFolderCameras.add(camera.position, "y", -500, 500).listen() guiFolderCameras.add(camera.position, "z", -500, 500).listen() /** RENDERER ************************************************************************** */ renderer = new THREE.WebGLRenderer( { alpha: true, antialias: true } ) renderer.shadowMap.enabled = true renderer.setSize(window.innerWidth - 240, window.innerHeight - 100) // utilize javascript prototyping.. add variables to the dom element :) renderer.domElement.camera = camera renderer.domElement.targetList = plane.children renderer.domElement.addEventListener("pointermove", onPointerMove, false) renderer.domElement.addEventListener("pointerdown", onPointerDown, false) /** CONTROLS *************************************************************************** */ controls = new THREE.OrbitControls(camera, renderer.domElement) controls.enableDamping = true controls.dampingFactor = 0.25 controls.enableZoom = true controls.rotateSpeed = 0.5 controls.autoRotate = false controls.autoRotateSpeed = 0.03 controls.minDistance = 0.01 controls.maxDistance = 340 controls.maxPolarAngle = Math.PI/2 - .04 controls.target = new THREE.Vector3(0, 0, 0) // where the camera actually points //controls.target.set(0, 5, 0) // alternate way of setting target of camera renderer.domElement.controls = controls /** WEBGL CANVAS *********************************************************************** */ container = document.querySelector("#webgl") container.append(gui.domElement) container.append(renderer.domElement) canvas = renderer.domElement /** BUILD ALLOTMENTS ******************************************************************* */ buildAllotments( params.data.allotment, plane, sceneID // the post-to-post relationship <3 ) /** FBX ******************************************************************************** */ //loaderFBX.load( `${params.assetsPath}characters/SimplePeople.fbx`, function (object) { //loaderFBX.load( `${params.assetsPath}fbx/people/FireFighter.fbx`, function (object) { //loaderFBX.load( `${params.assetsPath}fbx/people/Trucker.fbx`, function (object) { loaderFBX.load( `${params.assetsPath}characters/SK_Chr_Farmer_Male_01.fbx`, function (object) { object.mixer = new THREE.AnimationMixer( object ) player.mixer = object.mixer player.root = object.mixer.getRoot() object.name = "Gardener" object.traverse( function ( child ) { if ( child.isMesh ) { child.castShadow = true child.receiveShadow = false } } ) //loaderTexture.load(`${params.assetsPath}images/SimpleFarmer_Farmer_Brown.png`, function(texture) { loaderTexture.load(`${params.assetsPath}textures/PolygonFarm_Texture_01_B.png`, function(texture) { object.traverse( function ( child ) { if ( child.isMesh ){ child.material.map = texture } } ) }) // console.log("-----------------------") // console.log("object----------------") // console.log(object) // console.log("-----------------------") player.object = new THREE.Object3D() player.object.add(object) //player.object.scale.set(0.022, 0.022, 0.022) player.object.scale.set(0.033, 0.033, 0.033) player.object.rotation.x = Math.PI/2 // 90 degrees in radians //player.mixer.clipAction(object.animations[0]).play() //animations.Idle = object.animations[0] //setAction("Idle") plane.add(player.object) guiFolderPlayer.add(player.object, "visible").name("Show Character").listen() // console.log("-----------------------") // console.log("player.object----------------") // console.log(player.object) // console.log("-----------------------") loadNextAnim(loaderFBX) } ) loadFarmHouse(plane) loadChickenCoop(plane) //loadHen(plane) loadChicken(plane) //loadHenGLTF(plane) //loadRooster(plane) //loadChickenGLTF(plane) //loadChickGLTF(plane) //loadKitchenSink(plane) //loadChickenFree(plane) loadRoad(plane) //createCameras() let joystick = new JoyStick({ onMove: playerControl, game: container }) /** ANIMATE + RENDER (continuous rendering) ******************************************** */ let animate = function () { const dt = clock.getDelta() watchPointer(camera, plane.children) controls.update() TWEEN.update() requestAnimationFrame(animate) if ( params.ANIMATE ) { // plane.rotation.x += 0.002 // plane.rotation.y += 0.002 plane.rotation.z -= 0.0007 } /** PLAYER CHARACTER */ if ( player.mixer !== undefined ) { player.mixer.update(dt) } if ( player.action == "Walking" ) { const elapsedTime = Date.now() - player.actionTime if ( elapsedTime > 2000 && player.move.forward > 0.7 ){ setAction("Running") } } if ( player.move !== undefined ) { movePlayer(dt) } if ( player.cameras != undefined && player.cameras.active != undefined ) { camera.position.lerp( player.cameras.active.getWorldPosition(new THREE.Vector3()), 0.05 ) const pos = player.object.position.clone() pos.y += 200 camera.lookAt(pos) } if (directionalLight != undefined){ // directionalLight.position.x = player.object.position.x // directionalLight.position.y = player.object.position.y + 200 // directionalLight.position.z = player.object.position.z + 100 // directionalLight.target = player.object } renderer.render(scene, camera) } animate() let loadNextAnim = function (loader) { let anim = anims.pop() // console.log("-----------------------") // console.log("anim-------------------") // console.log(anim) // console.log("-----------------------") loader.load( `${params.assetsPath}fbx/anims2/${anim}.fbx`, function(object) { // console.log("-----------------------") // console.log("object-----------------") // console.log(object) // console.log("-----------------------") animations[anim] = object.animations[0] if (anims.length > 0){ // console.log("-----------------------") // console.log("anims.length-----------") // console.log(anims.length) // console.log("-----------------------") // console.log("-----------------------") // console.log("getAction()-----------") // console.log(getAction()) // console.log("-----------------------") // console.log("player.action----------") // console.log(player.action) // console.log("-----------------------") loadNextAnim(loader) } else { // console.log("-----------------------") // console.log("anims.length = 0-------") // console.log(anims.length) // console.log("-----------------------") anims = [] setAction("Idle") animate() } }) } //return scene } function setAction(name) { const action = player.mixer.clipAction( animations[name] ) action.time = 0 console.log("-----------------------") console.log("animations-----------------") console.log(animations) console.log("-----------------------") player.mixer.stopAllAction() player.action = name player.actionTime = Date.now() // console.log("-----------------------") // console.log("player-----------------") // console.log(player) // console.log("-----------------------") action.fadeIn(0.5) action.play() } function getAction() { if (player === undefined || player.action === undefined) { return "doesn't exist yet" } return player.action } function toggleAnimation() { if ( player.action == "Idle" ) { setAction("Pointing Gesture") } else { setAction("Idle") } } function movePlayer1(dt) { // console.log("-------------------------") // console.log("player.move.forward------") // console.log(player.move.forward) // console.log("-------------------------") if ( player.move.forward > 0 ) { const speed = ( player.action == "Running" ) ? 24 : 8 player.object.translateZ( dt * speed ) } else if ( player.move.forward < 0 ) { player.object.translateZ( -dt * 2) } player.object.rotateY( player.move.turn * dt ) } function movePlayer(dt){ const pos = player.object.position.clone() pos.y += 60 let dir = new THREE.Vector3() player.object.getWorldDirection(dir) if (player.move.forward<0) dir.negate() let raycaster = new THREE.Raycaster(pos, dir) let blocked = false const colliders = params.colliders // if (colliders!==undefined){ // const intersect = raycaster.intersectObjects(colliders) // if (intersect.length>0){ // if (intersect[0].distance<50) blocked = true // } // } if (!blocked){ if (player.move.forward>0){ const speed = (player.action=="Running") ? 24 : 8 player.object.translateZ(dt*speed) } else if ( player.move.forward < 0 ) { player.object.translateZ(-dt*2) } } /* if (colliders!==undefined){ //cast left dir.set(-1,0,0) dir.applyMatrix4(player.object.matrix) dir.normalize() raycaster = new THREE.Raycaster(pos, dir) let intersect = raycaster.intersectObjects(colliders) if (intersect.length>0){ if (intersect[0].distance<50) player.object.translateX(100-intersect[0].distance) } //cast right dir.set(1,0,0) dir.applyMatrix4(player.object.matrix) dir.normalize() raycaster = new THREE.Raycaster(pos, dir) intersect = raycaster.intersectObjects(colliders) if (intersect.length>0){ if (intersect[0].distance<50) player.object.translateX(intersect[0].distance-100) } //cast down dir.set(0,-1,0) pos.y += 200 raycaster = new THREE.Raycaster(pos, dir) const gravity = 30 intersect = raycaster.intersectObjects(colliders) if (intersect.length>0){ const targetY = pos.y - intersect[0].distance if (targetY > player.object.position.y){ //Going up player.object.position.y = 0.8 * player.object.position.y + 0.2 * targetY player.velocityY = 0 }else if (targetY < player.object.position.y){ //Falling if (player.velocityY==undefined) player.velocityY = 0 player.velocityY += dt * gravity player.object.position.y -= player.velocityY if (player.object.position.y < targetY){ player.velocityY = 0 player.object.position.y = targetY } } }else if (player.object.position.y>0){ if (player.velocityY==undefined) player.velocityY = 0 player.velocityY += dt * gravity player.object.position.y -= player.velocityY if (player.object.position.y < 0){ player.velocityY = 0 player.object.position.y = 0 } } } */ player.object.rotateY(player.move.turn*dt) } function playerControl(forward, turn) { turn = -turn if ( forward > 0.2 ) { if ( player.action != "Walking" && player.action != "Running" ) { setAction("Walking") } } else if ( forward < -0.2 ) { if ( player.action != "Walking Backwards" ) { setAction("Walking Backwards") } } else { forward = 0 if ( Math.abs(turn) > 0.05 ) { if ( player.action != "Left Turn" ) { setAction("Left Turn") } } else if ( player.action != "Idle" ) { setAction("Idle") } // else { // setAction("Idle") // } } // if ( forward == 0 && turn == 0 ) { // player.move = {} // } // else { player.move = { forward, turn } // } } function createCameras() { const offset = new THREE.Vector3(0, 80, 0) const front = new THREE.Object3D() front.position.set(112, 100, 600) front.parent = player.object const back = new THREE.Object3D() back.position.set(0, 300, -600) back.parent = player.object const wide = new THREE.Object3D() wide.position.set(178, 139, 1665) wide.parent = player.object const overhead = new THREE.Object3D() overhead.position.set(0, 400, 0) overhead.parent = player.object const collect = new THREE.Object3D() collect.position.set(40, 82, 94) collect.parent = player.object player.cameras = { front, back, wide, overhead, collect } setActiveCamera(player.cameras.back) } function setActiveCamera(object) { player.cameras.active = object } function loadEnvironment(loader) { loader.load(`${params.assetsPath}fbx/town.fbx`, function(object){ params.environment = object params.colliders = [] object.scale.set(0.025, 0.025, 0.025) scene.add(object) object.traverse( function ( child ) { if ( child.isMesh ) { if (child.name.startsWith("proxy")){ params.colliders.push(child) child.material.visible = false }else{ child.castShadow = true child.receiveShadow = true } } } ) loadNextAnim(loader) }) } function loadFarmHouse(plane) { //loaderFBX.load(`${params.assetsPath}fbx/SM_Bld_Farmhouse_01.fbx`, function(object){ loaderFBX.load(`${params.assetsPath}fbx/Building_Farm_House_02.fbx`, function(object){ //loaderFBX.load(`${params.assetsPath}fbx/Building_Barn_Big_03.fbx`, function(object){ params.farmhouse = object params.colliders = [] object.rotation.y = 270 * (Math.PI/180) // 90 degrees in radians object.position.set(0, 0, 100) //object.scale.set(0.025, 0.025, 0.025) object.scale.set(2.2, 2.2, 2.2) scene.add(object) object.traverse( function ( child ) { if ( child.isMesh ) { if (child.name.startsWith("proxy")){ params.colliders.push(child) child.material.visible = false }else{ child.castShadow = true child.receiveShadow = true } } } ) //loaderTexture.load(`${params.assetsPath}textures/PolygonFarm_Texture_01_A.png`, function(texture) { loaderTexture.load(`${params.assetsPath}textures/SimpleFarm.png`, function(texture) { object.traverse( function ( child ) { if ( child.isMesh ){ child.material.map = texture } } ) }) //loadNextAnim(loader) }) } function loadFarmHouseGLTF(plane) { // loaderFBX.load( `${params.assetsPath}fbx/Building_Farm_House_02.fbx`, function (object) { loaderGLTF.load( `${params.assetsPath}gltf/Residential House.glb`, function (object) { let model = object.scene model.name = "Farm House" model.position.set(0, 0, 100) model.scale.set(20, 20, 20) model.traverse( function ( child ) { if ( child.isMesh ) child.castShadow = true } ) scene.add(model) helper = new THREE.SkeletonHelper(model) helper.material.linewidth = 5 helper.visible = true scene.add(helper) console.log("-----------------------") console.log("loadFarmHouse object----------------") console.log(object) console.log("-----------------------") console.log("-----------------------") console.log("loadFarmHouse model----------------") console.log(model) console.log("-----------------------") guiFolderPlayer.add(model, "visible").name("Show House").listen() } ) } function loadChickenCoop(plane) { loaderFBX.load(`${params.assetsPath}fbx/Prop_Chicken_Coop_02.fbx`, function(object){ params.farmhouse = object params.colliders = [] object.rotation.y = 90 * (Math.PI/180) // 90 degrees in radians object.position.set(80, 0, -10) object.scale.set(2.2, 2.2, 2.2) scene.add(object) object.traverse( function ( child ) { if ( child.isMesh ) { if (child.name.startsWith("proxy")){ params.colliders.push(child) child.material.visible = false }else{ child.castShadow = true child.receiveShadow = true } } } ) loaderTexture.load(`${params.assetsPath}textures/SimpleFarm.png`, function(texture) { object.traverse( function ( child ) { if ( child.isMesh ){ child.material.map = texture } } ) }) //loadNextAnim(loader) }) } function loadChicken(plane) { loaderGLTF.load( `${params.assetsPath}gltf/Chicken.glb`, function (object) { let model = object.scene model.name = "Chicken GLB" model.position.set(-3, 0, 0) //model.rotation.y = 90 * (Math.PI/180) // 90 degrees in radians model.scale.set(4, 4, 4) model.traverse( function ( child ) { if ( child.isMesh ) child.castShadow = true } ) scene.add(model) // helper = new THREE.SkeletonHelper(model) // helper.material.linewidth = 5 // helper.visible = true // scene.add(helper) console.log("-----------------------") console.log("loadChicken object----------------") console.log(object) console.log("-----------------------") console.log("-----------------------") console.log("loadChicken model----------------") console.log(model) console.log("-----------------------") //guiFolderPlayer.add(model, "visible").name("Show Chicken").listen() } ) } function loadChicken0(plane) { loaderFBX.load(`${params.assetsPath}fbx/Chicken.fbx`, function(object){ console.log("-----------------------") console.log("BIRD----------------") console.log(object) console.log("-----------------------") //params.farmhouse = object //params.colliders = [] //object.rotation.y = 90 * (Math.PI/180) // 90 degrees in radians object.position.set(0, 0, 0) //object.scale.set(2.2, 2.2, 2.2) scene.add(object) object.traverse( function ( child ) { if ( child.isMesh ) { // if (child.name.startsWith("proxy")){ // params.colliders.push(child) // child.material.visible = false // }else{ child.castShadow = true child.receiveShadow = true //} } } ) // loaderTexture.load(`${params.assetsPath}textures/SimpleAnimalsFarm.png`, function(texture) { // object.traverse( function ( child ) { // if ( child.isMesh ){ // child.material.map = texture // } // } ) // }) //loadNextAnim(loader) }) } function loadChicken1(plane) { loaderFBX.load(`${params.assetsPath}fbx/SA_Animal_Birds.fbx`, function(object){ console.log("-----------------------") console.log("BIRD----------------") console.log(object) console.log("-----------------------") //params.farmhouse = object //params.colliders = [] //object.rotation.y = 90 * (Math.PI/180) // 90 degrees in radians object.position.set(0, 0, 0) //object.scale.set(2.2, 2.2, 2.2) scene.add(object) object.traverse( function ( child ) { if ( child.isMesh ) { // if (child.name.startsWith("proxy")){ // params.colliders.push(child) // child.material.visible = false // }else{ child.castShadow = true child.receiveShadow = true //} } } ) loaderTexture.load(`${params.assetsPath}textures/SimpleAnimalsFarm.png`, function(texture) { object.traverse( function ( child ) { if ( child.isMesh ){ child.material.map = texture } } ) }) //loadNextAnim(loader) }) } function loadChicken2(plane) { loaderFBX.load(`${params.assetsPath}fbx/SA_Animal_Pig.fbx`, function(object) { //loaderFBX.load( `${params.assetsPath}fbx/people/Trucker.fbx`, function (object) { //loaderFBX.load( `${params.assetsPath}characters/SK_Chr_Farmer_Male_01.fbx`, function (object) { console.log("-----------------------") console.log("object----------------") console.log(object) console.log("-----------------------") // object.mixer = new THREE.AnimationMixer( object ) // mixers.push( object.mixer ) // var action = object.mixer.clipAction( object.animations[ 0 ] ) // action.play() // scene.add( object ) /* object.mixer = new THREE.AnimationMixer( object ) mixers.push( object.mixer ) var action = object.mixer.clipAction( object.animations[ 0 ] ) action.play() object.name = "Chicken" object.traverse( function ( child ) { if ( child.isMesh ) { child.castShadow = true child.receiveShadow = false } } ) loaderTexture.load(`${params.assetsPath}textures/SimpleAnimalsFarm.png`, function(texture) { //loaderTexture.load(`${params.assetsPath}images/SimpleScarecrow.png`, function(texture) { //loaderTexture.load(`${params.assetsPath}images/SimpleFarmer_Farmer_Brown.png`, function(texture) { //loaderTexture.load(`${params.assetsPath}textures/PolygonFarm_Texture_01_A.png`, function(texture) { object.traverse( function ( child ) { if ( child.isMesh ){ child.material.map = texture } } ) }) plane.add( object ) console.log("-----------------------") console.log("object----------------") console.log(object) console.log("-----------------------") */ /* player.mixer = object.mixer player.root = object.mixer.getRoot() object.name = "Chicken" object.traverse( function ( child ) { if ( child.isMesh ) { child.castShadow = true child.receiveShadow = false } } ) loaderTexture.load(`${params.assetsPath}textures/SimpleAnimalsFarm.png`, function(texture) { //loaderTexture.load(`${params.assetsPath}images/SimpleScarecrow.png`, function(texture) { //loaderTexture.load(`${params.assetsPath}images/SimpleFarmer_Farmer_Brown.png`, function(texture) { //loaderTexture.load(`${params.assetsPath}textures/PolygonFarm_Texture_01_A.png`, function(texture) { object.traverse( function ( child ) { if ( child.isMesh ){ child.material.map = texture } } ) }) console.log("-----------------------") console.log("object----------------") console.log(object) console.log("-----------------------") player.object = new THREE.Object3D() player.object.add(object) player.object.scale.set(0.022, 0.022, 0.022) player.object.rotation.x = Math.PI/2 // 90 degrees in radians player.mixer.clipAction(object.animations[0]).play() animations.Idle = object.animations[0] //setAction("Idle") scene.add(player.object) guiFolderPlayer.add(player.object, "visible").name("Show Chicken").listen() console.log("-----------------------") console.log("player.object----------------") console.log(player.object) console.log("-----------------------") //animate() // OR loadNextAnim(loaderFBX) // OR //loadEnvironment(loaderFBX) */ } ) } function loadChickenGLTF(plane) { loaderGLTF.load( `${params.assetsPath}gltf/Animals.glb`, function (object) { console.log("-----------------------") console.log("Animals object----------------") console.log(object) console.log("-----------------------") object.mixer = new THREE.AnimationMixer( object.scene ) player.mixer = object.mixer player.root = object.mixer.getRoot() object.name = "Chicken Dance" object.scene.traverse( function ( child ) { if ( child.isMesh ) { child.castShadow = true child.receiveShadow = false } } ) player.object = new THREE.Object3D() player.object.add(object.scene) player.object.position.set(0, 0, 10) player.object.scale.set(4, 4, 4) player.object.rotation.x = Math.PI/2 // 90 degrees in radians player.mixer.timeScale = 0.5 player.mixer.clipAction(object.animations[2]).play() //animations.Idle = object.animations[0] //setAction("Idle") plane.add(player.object) //guiFolderPlayer.add(player.object, "visible").name("Show Character").listen() //animate() // OR //loadNextAnim(loaderFBX) // OR //loadEnvironment(loaderFBX) } ) } function loadChickGLTF(plane) { loaderGLTF.load( `${params.assetsPath}gltf/Chick.glb`, function (object) { let model = object.scene model.name = "Chick GLB" model.position.set(3, 0, 0) //model.rotation.y = 90 * (Math.PI/180) // 90 degrees in radians model.scale.set(2, 2, 2) model.traverse( function ( child ) { if ( child.isMesh ) child.castShadow = true } ) scene.add(model) // helper = new THREE.SkeletonHelper(model) // helper.material.linewidth = 5 // helper.visible = true // scene.add(helper) console.log("-----------------------") console.log("loadChickGLTF object----------------") console.log(object) console.log("-----------------------") console.log("-----------------------") console.log("loadChickGLTF model----------------") console.log(model) console.log("-----------------------") //guiFolderPlayer.add(model, "visible").name("Show Chicken").listen() } ) } function loadHen(plane) { loaderFBX.load(`${params.assetsPath}Hen&Chicken_FBX/Hen_HP.fbx`, function(object){ params.farmhouse = object params.colliders = [] //object.rotation.y = 270 * (Math.PI/180) // 90 degrees in radians object.position.set(3, 0, 0) object.scale.set(0.05, 0.05, 0.05) object.traverse( function ( child ) { if ( child.isMesh ) { if (child.name.startsWith("proxy")){ params.colliders.push(child) child.material.visible = false }else{ child.castShadow = true child.receiveShadow = true } } } ) loaderTexture.load(`${params.assetsPath}Hen&Chicken_FBX/Textures/Hen&Chicken_A.png`, function(texture) { object.traverse( function ( child ) { if ( child.isMesh ){ child.material.map = texture console.log("-----------------------") console.log("loadHen child----------------") console.log(child) console.log(child.geometry.attributes.uv) console.log("-----------------------") } } ) }) console.log("-----------------------") console.log("loadHen object----------------") console.log(object) console.log("-----------------------") scene.add(object) //loadNextAnim(loader) }) } function loadHenGLTF(plane) { // loaderFBX.load( `${params.assetsPath}fbx/Building_Farm_House_02.fbx`, function (object) { loaderGLTF.load( `${params.assetsPath}gltf/Hen_HP.glb`, function (object) { let model = object.scene //model.name = "Hen" //model.position.set(10, 0, 0) //model.scale.set(0.2, 0.2, 0.2) model.traverse( function ( child ) { if ( child.isMesh ) child.castShadow = true } ) scene.add(model) // helper = new THREE.SkeletonHelper(model) // helper.material.linewidth = 5 // helper.visible = true // scene.add(helper) console.log("-----------------------") console.log("loadHenGLTF object----------------") console.log(object) console.log("-----------------------") console.log("-----------------------") console.log("loadHenGLTF model----------------") console.log(model) console.log("-----------------------") //guiFolderPlayer.add(model, "visible").name("Show Hen GLTF").listen() } ) } function loadKitchenSink(plane) { loaderFBX.load(`${params.assetsPath}fbx/Prop_KitchenSink_Black.fbx`, function(object){ params.farmhouse = object params.colliders = [] object.rotation.y = 270 * (Math.PI/180) // 90 degrees in radians object.position.set(0, 0, 10) //object.scale.set(0.025, 0.025, 0.025) object.scale.set(2.2, 2.2, 2.2) scene.add(object) object.traverse( function ( child ) { if ( child.isMesh ) { if (child.name.startsWith("proxy")){ params.colliders.push(child) child.material.visible = false }else{ child.castShadow = true child.receiveShadow = true } } } ) //loaderTexture.load(`${params.assetsPath}textures/PolygonFarm_Texture_01_A.png`, function(texture) { loaderTexture.load(`${params.assetsPath}textures/SimpleInteriorsHouses.png`, function(texture) { object.traverse( function ( child ) { if ( child.isMesh ){ child.material.map = texture } } ) }) //loadNextAnim(loader) }) } function loadChickenFree(plane) { loaderOBJ.load(`${params.assetsPath}obj/chicken_01.obj`, function(object){ // params.farmhouse = object // params.colliders = [] //object.rotation.y = 270 * (Math.PI/180) // 90 degrees in radians //object.position.set(0, 0, 10) //object.scale.set(0.025, 0.025, 0.025) //object.scale.set(2.2, 2.2, 2.2) scene.add(object) // object.traverse( function ( child ) { // if ( child.isMesh ) { // if (child.name.startsWith("proxy")){ // params.colliders.push(child) // child.material.visible = false // }else{ // child.castShadow = true // child.receiveShadow = true // } // } // } ) // //loaderTexture.load(`${params.assetsPath}textures/PolygonFarm_Texture_01_A.png`, function(texture) { // loaderTexture.load(`${params.assetsPath}textures/SimpleInteriorsHouses.png`, function(texture) { // object.traverse( function ( child ) { // if ( child.isMesh ){ // child.material.map = texture // } // } ) // }) //loadNextAnim(loader) }) } function loadRooster(plane) { loaderFBX.load(`${params.assetsPath}fbx/rooster_1.0.1.fbx`, function(object){ // params.farmhouse = object // params.colliders = [] //object.rotation.y = 270 * (Math.PI/180) // 90 degrees in radians object.position.set(0, 0, 10) object.scale.set(0.025, 0.025, 0.025) //object.scale.set(2.2, 2.2, 2.2) scene.add(object) // object.traverse( function ( child ) { // if ( child.isMesh ) { // if (child.name.startsWith("proxy")){ // params.colliders.push(child) // child.material.visible = false // }else{ // child.castShadow = true // child.receiveShadow = true // } // } // } ) // //loaderTexture.load(`${params.assetsPath}textures/PolygonFarm_Texture_01_A.png`, function(texture) { // loaderTexture.load(`${params.assetsPath}textures/SimpleInteriorsHouses.png`, function(texture) { // object.traverse( function ( child ) { // if ( child.isMesh ){ // child.material.map = texture // } // } ) // }) //loadNextAnim(loader) }) } function loadRoad(plane) { let i let count = 8 let startX = -45 let offsetX = 0 let startZ = -138 let offsetZ = 20 // ROAD A for ( i = 1; i <= count; i++ ) { loaderFBX.load(`${params.assetsPath}fbx/SM_Env_Road_Gravel_Straight_01.fbx`, function(object){ // console.log("-----------------------") // console.log("ROAD----------------") // console.log(object) // console.log("-----------------------") //params.farmhouse = object //params.colliders = [] //object.rotation.y = 90 * (Math.PI/180) // 90 degrees in radians object.position.set(startX, 0, startZ) startX = startX + offsetX startZ = startZ + offsetZ object.scale.set(0.02, 0.01, 0.02) object.traverse( function ( child ) { if ( child.isMesh ) { // if (child.name.startsWith("proxy")){ // params.colliders.push(child) // child.material.visible = false // }else{ child.castShadow = true child.receiveShadow = true //} } } ) loaderTexture.load(`${params.assetsPath}textures/PolygonFarm_Texture_03_A.png`, function(texture) { object.traverse( function ( child ) { if ( child.isMesh ){ //child.material.color.setHex(0x000000) child.material.transparent = true child.material.opacity = 0.7 //child.material.depthWrite = true child.material.map = texture } } ) }) scene.add(object) console.log("-----------------------") console.log("ROAD----------------") console.log(object) console.log("-----------------------") //loadNextAnim(loader) }) } // ROAD T for ( i = 1; i <= 1; i++ ) { loaderFBX.load(`${params.assetsPath}fbx/SM_Env_Road_Gravel_T_Section_01.fbx`, function(object){ console.log("-----------------------") console.log("ROAD T----------------") console.log(startX, startZ) console.log("-----------------------") //params.farmhouse = object //params.colliders = [] //object.rotation.y = 90 * (Math.PI/180) // 90 degrees in radians object.position.set(startX, 0, startZ) startX = startX + offsetX startZ = startZ + offsetZ object.scale.set(0.02, 0.01, 0.02) object.traverse( function ( child ) { if ( child.isMesh ) { // if (child.name.startsWith("proxy")){ // params.colliders.push(child) // child.material.visible = false // }else{ child.castShadow = true child.receiveShadow = true //} } } ) loaderTexture.load(`${params.assetsPath}textures/PolygonFarm_Texture_03_A.png`, function(texture) { object.traverse( function ( child ) { if ( child.isMesh ){ //child.material.color.setHex(0x000000) child.material.transparent = true child.material.opacity = 0.7 //child.material.depthWrite = true child.material.map = texture } } ) }) scene.add(object) console.log("-----------------------") console.log("ROAD T----------------") console.log(object) console.log("-----------------------") //loadNextAnim(loader) }) } } /** * BUILD "ALLOTMENTS" FROM REST API POST OBJECT ************************************************************ */ function buildAllotments(postObject, plane, sceneID) { // console.log("-------------------------") // console.log("postObject ALLOTMENTS----") // console.log(postObject) // console.log("-------------------------") var filteredPostObject = postObject.filter(function (obj) { return obj.acf.allotment_scene == sceneID }) // console.log("filteredPostObject-------") // console.log(filteredPostObject) // console.log("-------------------------") filteredPostObject.forEach( function(key) { // console.log("-------------------------") // console.log("key.id (postObject)------") // console.log(key.id) // console.log(key) // console.log("-------------------------") // BUILD ALLOTMENT OBJECT GROUP let allotment = {} allotment.parameters = {} allotment.position = {} allotment.images = {} allotment.parameters.x = parseInt(key.acf.allotment_width) allotment.parameters.y = parseInt(key.acf.allotment_length) allotment.parameters.z = parseInt(key.acf.allotment_height) // 0 allotment.position.x = parseInt(key.acf.allotment_position_x) allotment.position.y = parseInt(key.acf.allotment_position_y) allotment.position.z = parseInt(key.acf.allotment_position_z) allotment.images.texture = key.acf.allotment_texture_image allotment.images.featured = getFeaturedImage(key) allotment.shape = key.acf.allotment_shape allotment.color = key.acf.allotment_color allotment.title = key.title.rendered allotment.postID = key.id allotment.description = key.content.rendered allotment.link = key.link // console.log("-------------------------") // console.log("allotment----------------") // console.log(allotment) // console.log("-------------------------") let structure = getGeometry( allotment.shape, allotment.parameters.x, allotment.parameters.y, allotment.parameters.z, allotment.color ) structure.name = allotment.title structure.userData.type = "structure" structure.userData.postID = allotment.postID structure.userData.description = allotment.description structure.userData.annotation = allotment.title structure.userData.link = allotment.link structure.position.x = allotment.position.x structure.position.y = allotment.position.y structure.position.z = (structure.geometry.parameters.depth / 2) + allotment.position.z // - 10 for gap between plane structure.material.roughness = 0.9 if (allotment.images.texture != null && allotment.images.texture != false) { structure.material.map = loaderTexture.load(allotment.images.texture) for (let i = 0; i < structure.material.length; i++) { // hightlight object //structure.material[i].color.set(0xff0000) structure.material[i].map = loaderTexture.load(allotment.images.texture) //structure.faces[i].materialIndex = 1 //console.log(intersects[i]) // structure.material[i].bumpMap = loaderTexture.load(allotment.images.texture) // structure.material[i].bumpScale = 0.05 let structureTextureMap = structure.material[i].map structureTextureMap.wrapS = THREE.RepeatWrapping structureTextureMap.wrapT = THREE.RepeatWrapping structureTextureMap.repeat.set(4, 4) } } plane.add(structure) //params.colliders.push(structure) //guiFolderAllotments.add(structure.geometry.parameters, "depth", 0, allotment.parameters.z) // console.log("-------------------------") // console.log("allotment----------------") // console.log(structure) // console.log("-------