|
|
"use strict";(self.webpackChunkplaycanvas_game=self.webpackChunkplaycanvas_game||[]).push([[565],{565:(e,i,r)=>{r.r(i),r.d(i,{default:()=>t});class o{constructor(e){this.app=e,this.spinners=[],this.oscillators=[],this.drivers=[],this.textureCache=new Map,this.app.on("update",e=>this.updateAnimations(e))}build(e,i){const r=new pc.Entity(e.name||"ProceduralObject");return i.addChild(r),this.buildNode(e,r),r}buildNode(e,i){if(!e)return null;const r=(e.op||e.type||"prim").toLowerCase();if("group"===r){const r=new pc.Entity(e.name||"group");return i.addChild(r),this.applyTransform(r,e),(e.children||[]).forEach(e=>this.buildNode(e,r)),e.spin&&this.addSpinner(r,e.spin),r}if("mirror"===r){const r=(e.axis||"x").toLowerCase(),o=new pc.Entity(e.name||`mirror_${r}`);i.addChild(o),(e.children||[]).forEach(e=>this.buildNode(e,o));const n=o.clone();o.parent.addChild(n);const t=new pc.Vec3(1,1,1);return"x"===r&&(t.x=-1),"y"===r&&(t.y=-1),"z"===r&&(t.z=-1),n.setLocalScale(t),o}if("radial"===r){const r=e.count||4,o=e.radius||1,n=e.phase||0,t=(e.axis||"y").toLowerCase(),a=new pc.Entity(e.name||`radial_${t}`);i.addChild(a),e.center&&a.setLocalPosition(this.vec3(e.center));for(let i=0;i<r;i++){const l=new pc.Entity(`r_${i}`);a.addChild(l);const s=360/r*i+n;"x"===t?l.setLocalEulerAngles(s,0,0):"y"===t?l.setLocalEulerAngles(0,s,0):l.setLocalEulerAngles(0,0,s);const p=new pc.Entity(`o_${i}`);l.addChild(p),"z"===t?p.setLocalPosition(o,0,0):p.setLocalPosition(0,0,o),(e.children||[]).forEach(e=>this.buildNode(e,p))}return e.spin&&this.addSpinner(a,e.spin),a}if("corners"===r){const r=e.dx||1,o=e.dz||1,n=new pc.Entity(e.name||"corners");i.addChild(n),e.center&&n.setLocalPosition(this.vec3(e.center));const t=[[r,0,o],[r,0,-o],[-r,0,o],[-r,0,-o]];for(let i=0;i<t.length;i++){const r=new pc.Entity(`c_${i}`);n.addChild(r),r.setLocalPosition(t[i][0],t[i][1],t[i][2]),(e.children||[]).forEach(e=>this.buildNode(e,r))}return e.spin&&this.addSpinner(n,e.spin),n}const o=new pc.Entity(e.name||"part"),n=(e.primitive||"box").toLowerCase();return o.addComponent("render",{type:n}),this.applyTransform(o,e),o.render.material=this.makeMaterial(e),i.addChild(o),e.spin&&this.addSpinner(o,e.spin),o}applyTransform(e,i){i.pos&&e.setLocalPosition(this.vec3(i.pos)),i.rot&&e.setLocalEulerAngles(this.vec3(i.rot)),i.scl&&e.setLocalScale(this.vec3(i.scl))}vec3(e){return new pc.Vec3(e[0]||0,e[1]||0,e[2]||0)}color(e){return new pc.Color(e[0]||1,e[1]||1,e[2]||1)}makeMaterial(e){const i=new pc.StandardMaterial;if(e&&e.color){const r=this.color(e.color);i.diffuse=r.clone(),i.emissive=r.clone(),i.emissiveIntensity=.35}else i.diffuse=new pc.Color(.75,.75,.78),i.emissive=new pc.Color(.75,.75,.78),i.emissiveIntensity=.35;return i.useMetalness=!1,i.shadingModel=pc.SPECULAR_BLINN,i.roughness=1,i.update(),i}addSpinner(e,i){const r=i.rpm||24,o=new pc.Vec3(i.axis?.[0]||0,i.axis?.[1]||1,i.axis?.[2]||0);o.lengthSq()<1e-6&&o.set(0,1,0);const n=o.normalize(),t=e.getLocalRotation().clone();this.spinners.push({entity:e,rpm:r,axis:n,base:t,angle:0})}updateAnimations(e){for(let i=0;i<this.spinners.length;i++){const r=this.spinners[i],o=r.entity;if(o&&!o.destroyed){r.angle+=6*r.rpm*e;const i=new pc.Quat;i.setFromAxisAngle(r.axis,r.angle);const n=r.base.clone();n.mul(i),o.setLocalRotation(n)}}for(let i=0;i<this.oscillators.length;i++){const r=this.oscillators[i];if(r.entity&&!r.entity.destroyed){r.t+=e;const i=r.base+Math.sin(2*r.t*Math.PI*r.speed+r.phase)*r.amp,o=r.entity.getLocalEulerAngles();"x"===r.axis&&r.entity.setLocalEulerAngles(i,o.y,o.z),"y"===r.axis&&r.entity.setLocalEulerAngles(o.x,i,o.z),"z"===r.axis&&r.entity.setLocalEulerAngles(o.x,o.y,i)}}for(let i=0;i<this.drivers.length;i++)try{this.drivers[i](e)}catch(e){console.warn("Driver error:",e)}}addOscillator(e,i,r,o,n=0,t=0){this.oscillators.push({entity:e,axis:i,amp:r,speed:o,base:n,phase:t,t:0})}addDriver(e){this.drivers.push(e)}cleanup(){this.spinners.length=0,this.oscillators.length=0,this.drivers.length=0,this.textureCache.clear()}createTexture(e){if(!this.app.graphicsDevice)return console.warn("[ProceduralBuilder] Graphics device not available for texture creation"),null;const i=document.createElement("canvas");i.width=128,i.height=128,e(i.getContext("2d"),i.width,i.height);const r=new pc.Texture(this.app.graphicsDevice,{width:i.width,height:i.height,format:pc.PIXELFORMAT_R8_G8_B8_A8});return r.setSource(i),r}applyMaterialPreset(e,i){if(!e||!e.render)return;const r=new pc.StandardMaterial;switch(i){case"wood":const e=this.getWoodTexture();e&&(r.diffuseMap=e,r.emissiveMap=e),r.roughness=.85,r.useMetalness=!0,r.metalness=.05;break;case"metal":const i=this.getMetalTexture();i&&(r.diffuseMap=i,r.emissiveMap=i),r.roughness=.35,r.useMetalness=!0,r.metalness=.8;break;case"plastic":const o=this.getPlasticTexture();o&&(r.diffuseMap=o,r.emissiveMap=o),r.roughness=.6,r.useMetalness=!0,r.metalness=.2}r.emissive=new pc.Color(1,1,1),r.update(),e.render.material=r}getWoodTexture(){if(!this.textureCache.has("wood")){const e=this.createTexture((e,i,r)=>{e.fillStyle="#7a5533",e.fillRect(0,0,i,r);for(let o=0;o<10;o++)e.fillStyle=o%2?"#6d4b2d":"#805a38",e.fillRect(0,o*(r/10),i,r/20);e.globalAlpha=.15,e.fillStyle="#000";for(let o=0;o<24;o++)e.beginPath(),e.arc(13*o%i,29*o%r,6+7*o%5,0,2*Math.PI),e.fill();e.globalAlpha=1});e&&this.textureCache.set("wood",e)}return this.textureCache.get("wood")||null}getMetalTexture(){if(!this.textureCache.has("metal")){const e=this.createTexture((e,i,r)=>{const o=e.createLinearGradient(0,0,i,r);o.addColorStop(0,"#d7dbe0"),o.addColorStop(.5,"#aeb6bf"),o.addColorStop(1,"#e3e6ea"),e.fillStyle=o,e.fillRect(0,0,i,r),e.globalAlpha=.15,e.fillStyle="#fff";for(let o=0;o<40;o++)e.fillRect(11*o%i,23*o%r,2,2);e.globalAlpha=1});e&&this.textureCache.set("metal",e)}return this.textureCache.get("metal")||null}getPlasticTexture(){if(!this.textureCache.has("plastic")){const e=this.createTexture((e,i,r)=>{e.fillStyle="#2a3b58",e.fillRect(0,0,i,r),e.globalAlpha=.25,e.fillStyle="#3f567f";for(let o=0;o<80;o++)e.fillRect(17*o%i,13*o%r,3,3);e.globalAlpha=1});e&&this.textureCache.set("plastic",e)}return this.textureCache.get("plastic")||null}}const n={windmill:{op:"group",name:"Windmill",children:[{type:"prim",primitive:"cylinder",name:"Tower",pos:[0,3,0],scl:[1.2,6,1.2],color:[.85,.85,.82]},{type:"prim",primitive:"cone",name:"Cap",pos:[0,6.8,0],scl:[1.4,1.1,1.4],color:[.6,.6,.6]},{op:"group",name:"Hub",pos:[0,6.4,1],children:[{type:"prim",primitive:"sphere",scl:[.35,.35,.35],color:[.4,.4,.45]},{op:"radial",name:"Blades",count:4,radius:.2,axis:"x",children:[{type:"prim",primitive:"box",name:"Blade",pos:[0,1.5,0],scl:[.1,3,.2],color:[.9,.9,.9]}]}],spin:{rpm:12,axis:[1,0,0]}}]},ferrisWheel:{op:"group",name:"FerrisWheel",children:[{type:"prim",primitive:"box",name:"StandL",pos:[-2,1,0],scl:[.3,2,.3],color:[.4,.42,.45]},{type:"prim",primitive:"box",name:"StandR",pos:[2,1,0],scl:[.3,2,.3],color:[.4,.42,.45]},{op:"group",name:"Wheel",pos:[0,2.2,0],rot:[0,0,0],children:[{op:"radial",name:"RimSegs",count:20,radius:2,axis:"x",children:[{type:"prim",primitive:"box",name:"RimSeg",pos:[0,0,0],scl:[.1,.15,.4],color:[.8,.2,.2]}]},{op:"radial",name:"Spokes",count:8,radius:0,axis:"x",children:[{type:"prim",primitive:"box",name:"Spoke",pos:[0,1,0],scl:[.05,2,.05],color:[.7,.7,.75]}]},{op:"radial",name:"Cabins",count:8,radius:2,axis:"x",children:[{type:"prim",primitive:"box",name:"Cabin",pos:[0,-.4,0],scl:[.3,.4,.5],color:[.1,.4,.85]}]},{type:"prim",primitive:"cylinder",name:"Hub",pos:[0,0,0],rot:[0,0,90],scl:[.2,.3,.2],color:[.3,.3,.35]}],spin:{rpm:2,axis:[1,0,0]}}]},workbench:{op:"group",name:"Workbench",children:[{type:"prim",primitive:"box",name:"Top",pos:[0,1,0],scl:[2,.12,1],color:[.7,.55,.4]},{op:"corners",name:"Legs",dx:.9,dz:.45,children:[{type:"prim",primitive:"cylinder",pos:[0,.47,0],scl:[.12,.94,.12],color:[.4,.3,.2]}]}]},industrialFan:{op:"group",name:"IndustrialFan",children:[{type:"prim",primitive:"cylinder",name:"Base",pos:[0,.4,0],scl:[.4,.1,.4],color:[.25,.25,.28]},{type:"prim",primitive:"cylinder",name:"Pole",pos:[0,1.2,0],scl:[.05,.8,.05],color:[.3,.3,.34]},{op:"group",name:"Head",pos:[0,1.9,0],children:[{type:"prim",primitive:"sphere",name:"Hub",scl:[.18,.18,.18],color:[.6,.6,.65]},{op:"radial",name:"FanBlades",count:5,radius:.15,axis:"z",children:[{type:"prim",primitive:"box",name:"Blade",pos:[.9,0,0],scl:[1.8,.05,.18],color:[.9,.9,.95]}]}],spin:{rpm:15,axis:[0,0,1]}}]},toolRack:{op:"group",name:"ToolRack",children:[{type:"prim",primitive:"box",name:"Frame",pos:[0,1,0],scl:[.1,2,1.5],color:[.3,.3,.3]},{op:"radial",name:"Tools",count:8,radius:.6,axis:"y",center:[0,1,0],children:[{type:"prim",primitive:"cylinder",name:"Tool",pos:[0,0,.3],scl:[.05,.8,.05],color:[.8,.6,.2]}]}]},kitchenBlender:{op:"group",name:"KitchenBlender",children:[{type:"prim",primitive:"cylinder",name:"Base",pos:[0,.6,0],scl:[.6,1.2,.6],color:[.25,.25,.28]},{type:"prim",primitive:"cylinder",name:"Jar",pos:[0,1.6,0],scl:[.45,.9,.45],color:[.7,.9,1]},{op:"group",name:"BladeHub",pos:[0,1.2,0],children:[{op:"radial",name:"Blades",count:4,radius:.08,axis:"z",children:[{type:"prim",primitive:"box",name:"Blade",pos:[.4,0,0],scl:[.8,.05,.15],color:[.9,.9,.95]}]}],spin:{rpm:45,axis:[0,0,1]}}]},kitchenMicrowave:{op:"group",name:"KitchenMicrowave",children:[{type:"prim",primitive:"box",name:"Body",pos:[0,1.2,0],scl:[1.6,.9,1.2],color:[.2,.2,.22]},{op:"group",name:"DoorPivot",pos:[.85,1.2,.55],children:[{type:"prim",primitive:"box",name:"Door",pos:[0,0,0],scl:[.05,.8,1.1],color:[.35,.35,.38]}]}]},kitchenRangeHood:{op:"group",name:"KitchenRangeHood",children:[{type:"prim",primitive:"box",name:"Hood",pos:[0,2.2,0],scl:[2,.4,1.2],color:[.3,.3,.35]},{op:"group",name:"Fan",pos:[0,2.2,.3],children:[{type:"prim",primitive:"sphere",scl:[.12,.12,.12],color:[.6,.6,.65]},{op:"radial",name:"FanBlades",count:5,radius:.1,axis:"z",children:[{type:"prim",primitive:"box",name:"Blade",pos:[.8,0,0],scl:[1.6,.08,.18],color:[.9,.9,.95]}]}],spin:{rpm:20,axis:[0,0,1]}}]},bathExhaustFan:{op:"group",name:"BathExhaustFan",children:[{type:"prim",primitive:"box",name:"Mount",pos:[0,2.6,0],scl:[1.2,.2,1.2],color:[.3,.3,.35]},{op:"group",name:"FanHead",pos:[0,2.6,.01],children:[{type:"prim",primitive:"sphere",scl:[.1,.1,.1],color:[.6,.6,.65]},{op:"radial",name:"FanBlades",count:4,radius:.08,axis:"z",children:[{type:"prim",primitive:"box",name:"Blade",pos:[.7,0,0],scl:[1.4,.08,.18],color:[.9,.9,.95]}]}],spin:{rpm:18,axis:[0,0,1]}}]},bathShowerHead:{op:"group",name:"BathShowerHead",children:[{type:"prim",primitive:"cylinder",name:"Pipe",pos:[0,2,0],scl:[.08,1.2,.08],color:[.6,.6,.65]},{op:"group",name:"HeadPivot",pos:[0,2.6,0],children:[{type:"prim",primitive:"cone",name:"Head",pos:[.25,0,0],rot:[0,90,0],scl:[.35,.25,.35],color:[.75,.75,.78]}]}]},bathWasher:{op:"group",name:"BathWasher",children:[{type:"prim",primitive:"box",name:"Cabinet",pos:[0,1.2,0],scl:[1.6,1.6,1.4],color:[.85,.85,.9]},{op:"group",name:"Drum",pos:[0,1.2,.75],children:[{type:"prim",primitive:"cylinder",name:"DrumBody",rot:[0,0,90],scl:[.5,.5,.5],color:[.6,.6,.65]},{op:"radial",name:"DrumFins",count:8,radius:.45,axis:"z",children:[{type:"prim",primitive:"box",name:"Fin",pos:[.3,0,0],scl:[.6,.05,.1],color:[.8,.8,.85]}]}],spin:{rpm:12,axis:[0,0,1]}}]},livingPendulumClock:{op:"group",name:"PendulumClock",children:[{type:"prim",primitive:"box",name:"Case",pos:[0,1.8,0],scl:[1.2,3.6,.6],color:[.35,.25,.15]},{op:"group",name:"Pendulum",pos:[0,1.2,.25],children:[{type:"prim",primitive:"cylinder",name:"Rod",pos:[0,-.6,0],scl:[.04,1.2,.04],color:[.6,.6,.65]},{type:"prim",primitive:"sphere",name:"Bob",pos:[0,-1.3,0],scl:[.25,.25,.25],color:[.8,.7,.2]}]}]},livingRecordPlayer:{op:"group",name:"RecordPlayer",children:[{type:"prim",primitive:"box",name:"Plinth",pos:[0,.8,0],scl:[1.6,.2,1.6],color:[.15,.15,.18]},{op:"group",name:"Turntable",pos:[0,.95,0],children:[{type:"prim",primitive:"cylinder",name:"Disc",scl:[1,.05,1],color:[.05,.05,.05]}],spin:{rpm:33,axis:[0,1,0]}}]},livingTableFan:{op:"group",name:"TableFan",children:[{type:"prim",primitive:"cylinder",name:"Stand",pos:[0,1.1,0],scl:[.12,.9,.12],color:[.3,.3,.35]},{op:"group",name:"Head",pos:[0,1.8,0],children:[{type:"prim",primitive:"sphere",name:"Hub",scl:[.12,.12,.12],color:[.6,.6,.65]},{op:"radial",name:"Blades",count:4,radius:.1,axis:"z",children:[{type:"prim",primitive:"box",name:"Blade",pos:[.9,0,0],scl:[1.8,.08,.2],color:[.9,.9,.95]}]}],spin:{rpm:16,axis:[0,0,1]}}]},garageDrillPress:{op:"group",name:"DrillPress",children:[{type:"prim",primitive:"box",name:"Base",pos:[0,.5,0],scl:[1.2,.2,1.2],color:[.2,.2,.22]},{type:"prim",primitive:"cylinder",name:"Column",pos:[0,1.6,0],scl:[.18,2.2,.18],color:[.35,.35,.38]},{type:"prim",primitive:"box",name:"Table",pos:[0,1.2,0],scl:[1.2,.12,1],color:[.25,.25,.28]},{op:"group",name:"Spindle",pos:[0,2.2,0],children:[{type:"prim",primitive:"cylinder",name:"Chuck",scl:[.15,.25,.15],color:[.6,.6,.65]}],spin:{rpm:40,axis:[0,-1,0]}}]},garageBenchGrinder:{op:"group",name:"BenchGrinder",children:[{type:"prim",primitive:"box",name:"Body",pos:[0,1.2,0],scl:[1.6,.8,.6],color:[.2,.2,.22]},{op:"group",name:"WheelL",pos:[-.9,1.2,0],children:[{type:"prim",primitive:"cylinder",name:"DiscL",rot:[0,0,90],scl:[.5,.25,.5],color:[.7,.7,.75]}],spin:{rpm:25,axis:[1,0,0]}},{op:"group",name:"WheelR",pos:[.9,1.2,0],children:[{type:"prim",primitive:"cylinder",name:"DiscR",rot:[0,0,90],scl:[.5,.25,.5],color:[.7,.7,.75]}],spin:{rpm:25,axis:[-1,0,0]}}]},garageShopLight:{op:"group",name:"ShopLight",children:[{type:"prim",primitive:"cylinder",name:"Mount",pos:[0,2.6,0],scl:[.08,.3,.08],color:[.35,.35,.38]},{op:"group",name:"LightBar",pos:[0,2.8,0],children:[{type:"prim",primitive:"box",name:"Bar",scl:[2.4,.12,.3],color:[.95,.95,.85]}]}]}},t={id:"kitbash_gallery",title:"Kitbash Gallery",type:"scene",async build(e,i,r){console.log("[KitbashGallery] Building procedural object gallery...");const t=i.createRoom({size:[48,8,32],lighting:"bright",position:[0,0,0]});t.name="KitbashGallery";const a=new o(e);return this.proceduralBuilder=a,[{recipe:"windmill",position:[-8,0,-5],label:"Windmill\nRadial Blades + Spin"},{recipe:"ferrisWheel",position:[0,0,-5],label:"Ferris Wheel\nComplex Radial + Animation"},{recipe:"industrialFan",position:[8,0,-5],label:"Industrial Fan\nSpinner System"},{recipe:"workbench",position:[-8,0,2],label:"Workbench\nCorners Operation"},{recipe:"toolRack",position:[0,0,2],label:"Tool Rack\nRadial Tool Array"},{recipe:"hydraulicLift",position:[8,0,2],label:"Hydraulic Lift\nMirror + Group Operations"},{recipe:"serverRack",position:[-8,0,8],label:"Server Rack\nStacked Components"},{recipe:"assemblyLine",position:[0,0,8],label:"Assembly Line\nLinear Arrangement"},{recipe:"controlPanel",position:[8,0,8],label:"Control Panel\nInterface Elements"},{recipe:"ceilingFan",position:[-16,0,12],label:"Ceiling Fan\nSpin (Y axis)"},{recipe:"radarDish",position:[-6,0,12],label:"Radar Dish\nOscillate (Yaw)"},{recipe:"gearPair",position:[4,0,12],label:"Gear Pair\nOpposed Spin"},{recipe:"propeller",position:[14,0,12],label:"Propeller\nSpin (Z axis)"},{recipe:"kitchenBlender",position:[-18,0,-12],label:"Kitchen: Blender\nBlade Spin"},{recipe:"kitchenMicrowave",position:[-10,0,-12],label:"Kitchen: Microwave\nDoor Oscillation"},{recipe:"kitchenRangeHood",position:[-2,0,-12],label:"Kitchen: Range Hood\nFan Spin"},{recipe:"bathExhaustFan",position:[6,0,-12],label:"Bathroom: Exhaust Fan\nSpin"},{recipe:"bathShowerHead",position:[14,0,-12],label:"Bathroom: Shower Head\nOscillate"},{recipe:"bathWasher",position:[22,0,-12],label:"Bathroom: Washing Machine\nDrum Spin"},{recipe:"livingPendulumClock",position:[-18,0,-2],label:"Living: Pendulum Clock\nPendulum Swing"},{recipe:"livingRecordPlayer",position:[-10,0,-2],label:"Living: Record Player\nTurntable Spin"},{recipe:"livingTableFan",position:[-2,0,-2],label:"Living: Table Fan\nSpin"},{recipe:"garageDrillPress",position:[6,0,-2],label:"Garage: Drill Press\nSpindle Spin"},{recipe:"garageBenchGrinder",position:[14,0,-2],label:"Garage: Bench Grinder\nDual Wheels"},{recipe:"garageShopLight",position:[22,0,-2],label:"Garage: Shop Light\nOscillate"}].forEach((e,i)=>{const o=r.create(`Platform_${i}`,{components:{render:{type:"cylinder"}},position:[e.position[0],e.position[1]-.1,e.position[2]],scale:[2,.2,2],tags:["platform"]});t.addChild(o);const l=new pc.Entity(`Display_${i}_Anchor`);l.setLocalPosition(e.position[0],e.position[1],e.position[2]),l.setLocalEulerAngles(0,0,0),l.setLocalScale(1,1,1),t.addChild(l);const s=r.create(`Spot_${i}`,{components:{light:{type:"point",color:new pc.Color(1,.98,.9),intensity:1.4,range:10,castShadows:!1}},position:[e.position[0],5,e.position[2]]});t.addChild(s);const p=this.getCustomRecipe(e.recipe)||n[e.recipe];if(!p)return void console.warn("[KitbashGallery] Missing recipe:",e.recipe);const c=a.build(p,l);c.addComponent("collision",{type:"box",halfExtents:[2,2,2]}),c.tags.add("interactive"),c.tags.add("procedural_object");try{if(this.proceduralBuilder){if("radarDish"===e.recipe){const e=c.findByName("DishPivot");e&&this.proceduralBuilder.addOscillator(e,"y",25,.2,0,0)}if("kitchenMicrowave"===e.recipe){const e=c.findByName("DoorPivot");e&&this.proceduralBuilder.addOscillator(e,"y",20,.25,0,0)}if("bathShowerHead"===e.recipe){const e=c.findByName("HeadPivot");e&&this.proceduralBuilder.addOscillator(e,"y",15,.35,0,0)}if("livingPendulumClock"===e.recipe){const e=c.findByName("Pendulum");e&&this.proceduralBuilder.addOscillator(e,"z",20,.5,0,0)}if("garageShopLight"===e.recipe){const e=c.findByName("LightBar");e&&this.proceduralBuilder.addOscillator(e,"y",10,.25,0,0)}}}catch(e){console.warn("[KitbashGallery] Oscillator attach skipped:",e)}this.createLabel(o,r,e.label,[0,3,0])}),this.createInfoPanels(t,r),this.addGalleryLighting(t,r),console.log("[KitbashGallery] Gallery construction complete"),t},createInfoPanels(e,i){const r=i.create("InfoPanel",{components:{render:{type:"plane"}},position:[0,4,-8],rotation:[0,0,0],scale:[6,2,1],tags:["info_panel"]});this.createInfoMaterial(r,"PROCEDURAL KITBASH GALLERY","Explore complex 3D objects built from simple ops:\n Group / Mirror / Radial / Corners\n Spinning animations and materials"),e.addChild(r);const o=i.create("ControlsPanel",{components:{render:{type:"plane"}},position:[0,2.5,-8],rotation:[0,0,0],scale:[4,1,1],tags:["controls_panel"]});this.createInfoMaterial(o,"CONTROLS","F - Inspect object details\nWASD - Move\nMouse - Look"),e.addChild(o)},createLabel(e,i,r,o){const n=i.create("Label",{components:{render:{type:"plane"}},position:o,rotation:[-15,0,0],scale:[2,1,1],tags:["label"]});return this.createInfoMaterial(n,"",r,"#000","#fff"),e.addChild(n),n},createInfoMaterial(e,i,r,o="#1a1a2e",n="#00ff88"){const t=new pc.StandardMaterial;try{const a=document.createElement("canvas");a.width=512,a.height=256;const l=a.getContext("2d");l.fillStyle=o,l.fillRect(0,0,a.width,a.height),i&&(l.fillStyle=n,l.font="bold 24px Arial, sans-serif",l.textAlign="center",l.fillText(i,a.width/2,40)),l.fillStyle=n,l.font="16px Arial, sans-serif",l.textAlign="center";const s=(r||"").split("\n"),p=i?80:40,c=20;s.forEach((e,i)=>l.fillText(e,a.width/2,p+i*c));const d=e?.element?.app?.graphicsDevice||window.app?.graphicsDevice;if(d){const e=new pc.Texture(d,{width:a.width,height:a.height,format:pc.PIXELFORMAT_R8_G8_B8_A8});e.setSource(a),t.diffuseMap=e,t.emissiveMap=e,t.emissive=new pc.Color(1,1,1),t.emissiveIntensity=.8}else t.diffuse=new pc.Color(.1,.1,.2),t.emissive=new pc.Color(0,1,.5),t.emissiveIntensity=.5}catch(e){t.diffuse=new pc.Color(.1,.1,.2),t.emissive=new pc.Color(0,1,.5),t.emissiveIntensity=.5}t.cull=pc.CULLFACE_NONE,t.update(),e.render.material=t},addGalleryLighting(e,i){for(let r=0;r<3;r++)for(let o=0;o<3;o++){const n=i.create(`GridLight_${r}_${o}`,{components:{light:{type:"spot",color:new pc.Color(1,1,.9),intensity:1.1,range:18,innerConeAngle:20,outerConeAngle:35,castShadows:!1}},position:[8*r-8,6,6.5*o-5],rotation:[60,0,0],tags:["gallery_light"]});e.addChild(n)}},getCustomRecipe:e=>({windmill:{op:"group",name:"Windmill",children:[{type:"prim",primitive:"cylinder",name:"Tower",pos:[0,3,0],scl:[1.2,6,1.2],color:[.85,.85,.82]},{type:"prim",primitive:"cone",name:"Cap",pos:[0,6.8,0],scl:[1.4,1.1,1.4],color:[.6,.6,.6]},{op:"group",name:"Hub",pos:[0,6.4,1],children:[{type:"prim",primitive:"sphere",scl:[.35,.35,.35],color:[.4,.4,.45]},{op:"radial",name:"Blades",count:4,radius:.2,axis:"x",children:[{type:"prim",primitive:"box",name:"Blade",pos:[0,1.5,0],scl:[.1,3,.2],color:[.9,.9,.9]}]}],spin:{rpm:12,axis:[1,0,0]}}]},ferrisWheel:{op:"group",name:"FerrisWheel",children:[{type:"prim",primitive:"box",name:"StandL",pos:[-2,1,0],scl:[.3,2,.3],color:[.4,.42,.45]},{type:"prim",primitive:"box",name:"StandR",pos:[2,1,0],scl:[.3,2,.3],color:[.4,.42,.45]},{op:"group",name:"Wheel",pos:[0,2.2,0],children:[{op:"radial",name:"RimSegs",count:20,radius:2,axis:"x",children:[{type:"prim",primitive:"box",name:"RimSeg",pos:[0,0,0],scl:[.1,.15,.4],color:[.8,.2,.2]}]},{op:"radial",name:"Spokes",count:8,radius:0,axis:"x",children:[{type:"prim",primitive:"box",name:"Spoke",pos:[0,1,0],scl:[.05,2,.05],color:[.7,.7,.75]}]},{op:"radial",name:"Cabins",count:8,radius:2,axis:"x",children:[{type:"prim",primitive:"box",name:"Cabin",pos:[0,-.4,0],scl:[.3,.4,.5],color:[.1,.4,.85]}]},{type:"prim",primitive:"cylinder",name:"Hub",pos:[0,0,0],rot:[0,0,90],scl:[.2,.3,.2],color:[.3,.3,.35]}],spin:{rpm:2,axis:[1,0,0]}}]},industrialFan:{op:"group",name:"IndustrialFan",children:[{type:"prim",primitive:"cylinder",name:"Base",pos:[0,.4,0],scl:[.4,.1,.4],color:[.25,.25,.28]},{type:"prim",primitive:"cylinder",name:"Pole",pos:[0,1.2,0],scl:[.05,.8,.05],color:[.3,.3,.34]},{op:"group",name:"Head",pos:[0,1.9,0],children:[{type:"prim",primitive:"sphere",name:"Hub",scl:[.18,.18,.18],color:[.6,.6,.65]},{op:"radial",name:"FanBlades",count:5,radius:.15,axis:"z",children:[{type:"prim",primitive:"box",name:"Blade",pos:[.9,0,0],scl:[1.8,.05,.18],color:[.9,.9,.95]}]}],spin:{rpm:15,axis:[0,0,1]}}]},workbench:{op:"group",name:"Workbench",children:[{type:"prim",primitive:"box",name:"Top",pos:[0,1,0],scl:[2,.12,1],color:[.7,.55,.4]},{op:"corners",name:"Legs",dx:.9,dz:.45,children:[{type:"prim",primitive:"cylinder",pos:[0,.47,0],scl:[.12,.94,.12],color:[.4,.3,.2]}]}]},toolRack:{op:"group",name:"ToolRack",children:[{type:"prim",primitive:"box",name:"Frame",pos:[0,1,0],scl:[.1,2,1.5],color:[.3,.3,.3]},{op:"radial",name:"Tools",count:8,radius:.6,axis:"y",center:[0,1,0],children:[{type:"prim",primitive:"cylinder",name:"Tool",pos:[0,0,.3],scl:[.05,.8,.05],color:[.8,.6,.2]}]}]},serverRack:{op:"group",name:"ServerRack",children:[{type:"prim",primitive:"box",name:"Frame",pos:[0,1,0],scl:[1,2,.6],color:[.1,.1,.12]},{op:"group",name:"Servers",children:Array.from({length:8},(e,i)=>({type:"prim",primitive:"box",name:`Server_${i}`,pos:[0,.3+.2*i,.25],scl:[.9,.08,.4],color:[.2,.2,.25]}))}]},assemblyLine:{op:"group",name:"AssemblyLine",children:[{type:"prim",primitive:"box",name:"ConveyorBelt",pos:[0,.8,0],scl:[6,.1,1],color:[.2,.2,.2]},{op:"group",name:"Supports",children:Array.from({length:4},(e,i)=>({type:"prim",primitive:"cylinder",name:`Support_${i}`,pos:[1.67*i-2.5,.4,0],scl:[.08,.8,.08],color:[.4,.4,.45]}))},{op:"radial",name:"RollerDrum",count:12,radius:.3,axis:"x",center:[2.5,.8,0],children:[{type:"prim",primitive:"cylinder",name:"Roller",pos:[0,0,.25],scl:[.02,.02,.5],color:[.6,.6,.65]}],spin:{rpm:10,axis:[1,0,0]}}]},controlPanel:{op:"group",name:"ControlPanel",children:[{op:"radial",name:"ButtonArray",count:12,radius:.4,axis:"z",center:[0,1.2,.15],children:[{type:"prim",primitive:"cylinder",name:"Button",scl:[.05,.05,.05],color:[.8,.2,.2]}]},{type:"prim",primitive:"box",name:"Screen",pos:[0,1.5,.12],scl:[.8,.4,.02],color:[.1,.3,.1]},{type:"prim",primitive:"cylinder",name:"Base",pos:[0,.3,0],scl:[.8,.6,.8],color:[.25,.25,.28]}]}}[e]||null)}}}]); |