threlte logo

Scope with zoom

This example shows how to utilize useFBO hook to create a sniper scope zoom effect, complete with lens distortion and crosshairs.

<script lang="ts">
  import { Canvas } from '@threlte/core'
  import Scene from './Scene.svelte'
</script>

<div>
  <ul>
    <li>Press <b>S</b> to toggle scope mode.</li>
    <li><b>Mousewheel</b> or <b>A/D</b> to adjust zoom level.</li>
  </ul>
  <Canvas>
    <Scene />
  </Canvas>
</div>

<style>
  ul {
    position: absolute;
    top: 0;
    left: 0;
  }
  div {
    height: 100%;
  }
</style>
<script
  lanng="ts"
  context="module"
>
  import { writable } from 'svelte/store'
  import { tweened } from 'svelte/motion'

  export const baseFov = 60
  export const scoping = writable(false)
  export const zoomedFov = tweened(18, {
    duration: 200
  })
</script>

<script lang="ts">
  import { useTask, useThrelte } from '@threlte/core'
  import { onDestroy } from 'svelte'
  import { Quaternion, Vector3 } from 'three'
  import { clamp } from 'three/src/math/MathUtils.js'

  const { renderer, camera } = useThrelte()

  // Pointer lock with unadjusted movement: https://github.com/slightlyoff/unadjusted_pointer_lock_explainer
  const requestPointerLock = (myTargetElement: HTMLElement) => {
    //@ts-ignore
    const promise = myTargetElement.requestPointerLock({
      unadjustedMovement: true
    })
    //@ts-ignore
    if (!promise) {
      console.log('disabling mouse acceleration is not supported, locking pointer without it')
      return
    }

    return (
      promise
        //@ts-ignore
        .then()
        //@ts-ignore
        .catch((error) => {
          if (error.name === 'NotSupportedError') {
            return myTargetElement.requestPointerLock()
          }
        })
    )
  }

  let pointerLocked = false

  /*
		Zoom in and out with mousewheel.
		I used a passive listener on the renderer dom element because in the docs we show
		examples as an iframe. Its interaction with lockng pointer was causing the page
		to scroll etc.
	*/
  renderer?.domElement.addEventListener(
    'wheel',
    (e) => {
      if (pointerLocked) {
        e.preventDefault()
        e.stopPropagation()
        e.stopImmediatePropagation()
        zoomedFov.set(clamp($zoomedFov + e.deltaY * 0.05, 0.5, baseFov * 0.5))
      }
    },
    {
      passive: false
    }
  )

  $: mouseSensitivity = 0.00008 * clamp($zoomedFov * 0.5, 1, 20)

  let phi = 0
  let theta = -0.16

  const qx = new Quaternion()
  const qz = new Quaternion()

  useTask(() => {
    qx.setFromAxisAngle(new Vector3(0, -1, 0), phi)
    qz.setFromAxisAngle(new Vector3(1, 0, 0), theta)

    const cameraQuaternion = new Quaternion()
    cameraQuaternion.multiply(qx)
    cameraQuaternion.multiply(qz)

    $camera.quaternion.copy(cameraQuaternion)
  })

  onDestroy(() => {
    document.exitPointerLock()
  })
</script>

<svelte:document
  on:keydown={(e) => {
    if (e.key === 's') scoping.set(!$scoping)
    if (e.key === 'a') zoomedFov.set(Math.min($zoomedFov + 2, baseFov * 0.5))
    if (e.key === 'd') zoomedFov.set(Math.max(0.5, $zoomedFov - 2))
  }}
  on:pointerlockchange={() => {
    pointerLocked = document.pointerLockElement ? true : false
  }}
  on:click={async () => {
    if (!pointerLocked) {
      requestPointerLock(renderer?.domElement)
    }
  }}
  on:mousemove={({ movementX, movementY }) => {
    if (!pointerLocked) return
    phi += movementX * mouseSensitivity
    theta -= movementY * mouseSensitivity * 1.5
  }}
/>
<script lang="ts">
  import { T } from '@threlte/core'

  // world
  import { Sky } from '@threlte/extras'
  import Ducks from './world/Ducks.svelte'
  import Island from './world/Island.svelte'
  import Water from './world/Water.svelte'

  // scope
  import Controls, { baseFov } from './Controls.svelte'
  import LensView from './scope/LensView.svelte'
  import Scope from './scope/Scope.svelte'
</script>

<T.PerspectiveCamera
  makeDefault
  position={[0, 1.5, 20]}
  fov={baseFov}
>
  <Scope let:ref>
    <LensView scope={ref} />
  </Scope>
</T.PerspectiveCamera>
<Controls />

<!-- World setup -->
<Sky
  elevation={0.5}
  azimuth={130}
/>

<Water />

<Island
  scale={0.2}
  position.x={-5}
  position.y={-0.01}
  position.z={0}
/>

<Ducks />
<script lang="ts">
  import { T, useTask, useThrelte } from '@threlte/core'
  import { useFBO, useTexture } from '@threlte/extras'
  import { Group, PerspectiveCamera } from 'three'

  import { baseFov, scoping, zoomedFov } from '../Controls.svelte'
  import fragmentShader from './scope_fs.glsl?raw'
  import vertexShader from './scope_vs.glsl?raw'

  const { camera, renderer, scene, size } = useThrelte()

  export let scope: Group

  // render scene at a lower resolution but multiple samples for antialiasing
  const renderTarget = useFBO($size.width * 0.5, $size.height * 0.5, {
    samples: 8
  })

  $: aspect = $size.width / $size.height

  useTask(() => {
    if (!scope || !$scoping) return
    const cam = $camera as PerspectiveCamera

    scope.visible = false
    cam.fov = $zoomedFov
    cam.updateProjectionMatrix()
    cam.matrixWorldNeedsUpdate = true
    renderer.setRenderTarget(renderTarget)
    renderer.render(scene, cam)

    renderer.setRenderTarget(null)
    cam.fov = baseFov
    cam.updateProjectionMatrix()
    scope.visible = true
  })

  const reticleTexture = useTexture('/textures/NightforceScopeReticle2.png')
</script>

<T.Mesh
  position.z={19.5}
  position.y={-0.1}
>
  <T.CircleGeometry args={[1.8]} />

  <T.ShaderMaterial
    {fragmentShader}
    {vertexShader}
    uniforms={{
      viewTexture: {
        value: renderTarget.texture
      },
      reticleTexture: {
        value: null
      },
      aspect: {
        value: 1
      }
    }}
    uniforms.reticleTexture.value={$reticleTexture}
    uniforms.aspect.value={aspect}
  />
</T.Mesh>
<!--
Auto-generated by: https://github.com/threlte/threlte/tree/main/packages/gltf
Command: npx @threlte/gltf@2.0.1 scope.glb
Author: XarMeX (https://sketchfab.com/XarMeX)
License: CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)
Source: https://sketchfab.com/3d-models/sniper-scope-nightforce-v2-907abe0a96e243b3b83b6abe47f681b7
Title: Sniper Scope NightForce_V2
-->

<script lang="ts">
  import * as THREE from 'three'

  import { T, type Props, type Events, type Slots, forwardEventHandlers } from '@threlte/core'
  import { useGltf } from '@threlte/extras'
  import { tweened, type Tweened } from 'svelte/motion'
  import { scoping } from '../Controls.svelte'
  import { DEG2RAD } from 'three/src/math/MathUtils.js'

  type $$Props = Props<THREE.Group>
  type $$Events = Events<THREE.Group>
  type $$Slots = Slots<THREE.Group> & { fallback: {}; error: { error: any }; inner: any }

  export const ref = new THREE.Group()

  const gltf = useGltf('/models/scope.glb')

  const component = forwardEventHandlers()

  const rotationX = tweened(-3)
  const position: Tweened<THREE.Vector3Tuple> = tweened([0.4, -0.15, -1])

  $: {
    if ($scoping) {
      rotationX.set(0)
      position.set([0, 0, -0.496])
    } else {
      rotationX.set(-3)
      position.set([0.4, -0.15, -1])
    }
  }
</script>

<T
  is={ref}
  dispose={false}
  {...$$restProps}
  bind:this={$component}
  scale={0.02}
  position={$position}
  rotation.y={DEG2RAD * $rotationX}
>
  {#await gltf}
    <slot name="fallback" />
  {:then gltf}
    <T.Mesh
      geometry={gltf.nodes.Object_2.geometry}
      material={gltf.materials.initialShadingGroup}
      rotation={[-Math.PI / 2, 0, 0]}
    />
    <slot name="inner" />
  {:catch error}
    <slot
      name="error"
      {error}
    />
  {/await}

  <slot {ref} />
</T>
varying vec2 vUv;

uniform sampler2D viewTexture;
uniform sampler2D reticleTexture;
uniform float aspect;

// https://www.shadertoy.com/view/4lSGRw
vec2 distortUV(vec2 uv, float k, float kcube) {
	vec2 t = uv - .5f;
	float r2 = t.x * t.x + t.y * t.y;
	float f = 0.f;

	if (kcube == 0.0f) {
		f = 1.f + r2 * k;
	} else {
		f = 1.f + r2 * (k + kcube * sqrt(r2));
	}

	vec2 nUv = f * t + .5f;
	return nUv;
}

void main() {
	float k = -1.1f;
	float kcube = 0.5f;
	float offset = .06f;

	// Adjust UV ratio for sampling view texture
	vec2 adjustedUv = vUv;
	if (aspect > 1.0f) {
		float scale = 1.0f / aspect;
		adjustedUv.x = scale * (adjustedUv.x - 0.5f) + 0.5f;
	} else {
		float scale = aspect;
		adjustedUv.y = scale * (adjustedUv.y - 0.5f) + 0.5f;
	}

	vec4 reticle = texture2D(reticleTexture, vUv);

		// circular vignettte
	vec2 vignetteUv = vUv - vec2(0.5f);
	float circlularDist = length(vignetteUv) * 2.f;
	float vig = 1.f - smoothstep(0.7f, 0.99f, circlularDist);

	// aberration + fisheye-like distortion
	float red = texture2D(viewTexture, distortUV(adjustedUv, k + offset, kcube)).r;
	float green = texture2D(viewTexture, distortUV(adjustedUv, k, kcube)).g;
	float blue = texture2D(viewTexture, distortUV(adjustedUv, k - offset, kcube)).b;

	vec3 finalColor = mix(vec3(red, green, blue) * vig, reticle.rgb, smoothstep(0.f, 1.f, reticle.a * 2.f));

	gl_FragColor = vec4(finalColor, 1.f);

	#include <tonemapping_fragment>
	#include <colorspace_fragment>
}
varying vec2 vUv;
varying vec3 vPosition;

void main() {
	vec4 modelPosition = modelMatrix * vec4(position, 1.0f);

	vec4 viewPosition = viewMatrix * modelPosition;
	vec4 projectedPosition = projectionMatrix * viewPosition;

	gl_Position = projectedPosition;
	vUv = uv;
	vPosition = (modelMatrix * vec4(position, 1.0f)).xyz;
}
<!--
Auto-generated by: https://github.com/threlte/threlte/tree/main/packages/gltf
Command: npx @threlte/gltf@1.0.0-next.13 E:\projects\2024\model\static\models\duck_floaty.glb --root /models/ --types --printwidth 120 --precision 2 --draco true --transform --resolution 1024 --simplify --weld 0.001 --ratio 0.0075 --error 1e-9
Author: raholder0909 (https://sketchfab.com/raholder0909)
License: CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)
Source: https://sketchfab.com/3d-models/duck-floaty-1467f79dc22e46c49e68a688865e9f70
Title: duck floaty
-->

<script lang="ts">
  import type * as THREE from 'three'
  import { Group } from 'three'
  import { T, type Props, type Events, type Slots, forwardEventHandlers } from '@threlte/core'
  import { useGltf, InstancedMeshes } from '@threlte/extras'

  type $$Props = Props<THREE.Group>
  type $$Events = Events<THREE.Group>
  type $$Slots = Slots<THREE.Group> & { fallback: {}; error: { error: any } }

  export const ref = new Group()

  type GLTFResult = {
    nodes: {
      Object_4: THREE.Mesh
      Object_6: THREE.Mesh
    }
    materials: {
      bill: THREE.MeshStandardMaterial
      duck_body: THREE.MeshStandardMaterial
    }
  }

  const gltf = useGltf<GLTFResult>('/models/duck_floaty-transformed.glb', { useDraco: true })

  const component = forwardEventHandlers()

  const duckSpread = 200
</script>

<T
  is={ref}
  dispose={false}
  {...$$restProps}
  bind:this={$component}
  frustumCulled={false}
>
  {#await gltf}
    <slot name="fallback" />
  {:then gltf}
    <InstancedMeshes
      meshes={gltf.nodes}
      let:components={{ Object_4, Object_6 }}
    >
      {#each { length: 200 } as _, i}
        {@const posX = Math.random() * duckSpread - duckSpread / 2}
        {@const posZ = Math.random() * duckSpread - 300}
        <T.Group
          position.x={posX}
          position.z={posZ}
          scale={0.1}
        >
          <Object_4
            position={[0, 1.59, 2.54]}
            scale={0.43}
          />
          <Object_6 position={[0, -0.03, 0]} />
        </T.Group>
      {/each}
    </InstancedMeshes>
  {:catch error}
    <slot
      name="error"
      {error}
    />
  {/await}

  <slot {ref} />
</T>
<!--
Auto-generated by: https://github.com/threlte/threlte/tree/main/packages/gltf
Command: npx @threlte/gltf@1.0.0-next.13 E:\projects\2024\model\static\models\issum_the_town_on_capital_isle.glb --root /models/ --types --printwidth 120 --precision 100 --draco true --transform --resolution 1024 --simplify --weld 0.001 --ratio 0.0075 --error 1e-9
Author: Olee (https://sketchfab.com/Olee)
License: CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)
Source: https://sketchfab.com/3d-models/issum-the-town-on-capital-isle-e433923a64d549fabb2d30635d643ab6
Title: Issum, The town on Capital Isle
-->

<script lang="ts">
  import type * as THREE from 'three'
  import { Group } from 'three'
  import { T, type Props, type Events, type Slots, forwardEventHandlers } from '@threlte/core'
  import { useGltf } from '@threlte/extras'

  type $$Props = Props<THREE.Group>
  type $$Events = Events<THREE.Group>
  type $$Slots = Slots<THREE.Group> & { fallback: {}; error: { error: any } }

  export const ref = new Group()

  type GLTFResult = {
    nodes: {
      Plane_0: THREE.Mesh
      Hide003_0: THREE.Mesh
      ['Sheep-ver1017_0']: THREE.Mesh
      ['Sheep-ver1016_0']: THREE.Mesh
      ['Sheep-ver1015_0']: THREE.Mesh
      ['Sheep-ver1014_0']: THREE.Mesh
      ['Sheep-ver1001_0']: THREE.Mesh
      ['Sheep-ver1002_0']: THREE.Mesh
      ['Sheep-ver1003_0']: THREE.Mesh
      ['Sheep-ver1004_0']: THREE.Mesh
      ['Sheep-ver1009_0']: THREE.Mesh
      ['Sheep-ver1008_0']: THREE.Mesh
      ['Sheep-ver1007_0']: THREE.Mesh
      ['Sheep-ver1006_0']: THREE.Mesh
      ['Sheep-ver1005_0']: THREE.Mesh
      ['Sheep-ver1018_0']: THREE.Mesh
      ['Sheep-ver1019_0']: THREE.Mesh
      ['Sheep-ver1020_0']: THREE.Mesh
      ['Sheep-ver1021_0']: THREE.Mesh
      Golem_0: THREE.SkinnedMesh
      mff_island_large_0: THREE.Mesh
      mff_island_small_0: THREE.Mesh
      House_4_AO001_0: THREE.Mesh
      House_3_AO001_0: THREE.Mesh
      House_1_AO001_0: THREE.Mesh
      House_2_AO001_0: THREE.Mesh
      Tower_1_AO001_0: THREE.Mesh
      HouseBase_8_AO003_0: THREE.Mesh
      HouseBase_7_AO003_0: THREE.Mesh
      HouseBase_7_AO004_0: THREE.Mesh
      Tower_2_AO001_0: THREE.Mesh
      Tower_2_AO002_0: THREE.Mesh
      House_2_AO002_0: THREE.Mesh
      House_4_AO002_0: THREE.Mesh
      House_3_AO002_0: THREE.Mesh
      Shed_AO001_0: THREE.Mesh
      ['Mill-wind001_0']: THREE.Mesh
      HouseBase_8_AO004_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO001_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO002_0: THREE.Mesh
      Fencing_Wood_Green_2_AO001_0: THREE.Mesh
      Fencing_Wood_Green_2_AO002_0: THREE.Mesh
      Fencing_Wood_Green_2_AO003_0: THREE.Mesh
      Fencing_Wood_Green_2_AO004_0: THREE.Mesh
      Fencing_Wood_Green_2_AO005_0: THREE.Mesh
      Fencing_Wood_Green_2_AO006_0: THREE.Mesh
      Fencing_Wood_Green_2_AO007_0: THREE.Mesh
      Fencing_Wood_Green_2_AO008_0: THREE.Mesh
      Fencing_Wood_Green_2_AO009_0: THREE.Mesh
      Fencing_Wood_Green_2_AO010_0: THREE.Mesh
      Fencing_Wood_Clean_8_AO001_0: THREE.Mesh
      Fencing_Wood_Clean_5_AO001_0: THREE.Mesh
      Shed_AO002_0: THREE.Mesh
      House_1_AO002_0: THREE.Mesh
      mff_stone_path_0001_0: THREE.Mesh
      mff_stone_path_1001_0: THREE.Mesh
      mff_stone_path_0002_0: THREE.Mesh
      mff_stone_path_1002_0: THREE.Mesh
      Paving_1_AO001_0: THREE.Mesh
      Paving_3_AO001_0: THREE.Mesh
      Paving_4_AO001_0: THREE.Mesh
      Paving_4_AO002_0: THREE.Mesh
      Paving_1_AO002_0: THREE.Mesh
      Paving_1_AO003_0: THREE.Mesh
      Paving_1_AO004_0: THREE.Mesh
      Paving_3_AO002_0: THREE.Mesh
      Paving_1_AO005_0: THREE.Mesh
      mff_stone_path_1003_0: THREE.Mesh
      Paving_4_AO003_0: THREE.Mesh
      Paving_4_AO004_0: THREE.Mesh
      Paving_1_AO006_0: THREE.Mesh
      Paving_4_AO005_0: THREE.Mesh
      Cylinder000_0: THREE.Mesh
      Cylinder000_1: THREE.Mesh
      mff_tree_pine_2001_0: THREE.Mesh
      mff_tree_pine_2002_0: THREE.Mesh
      mff_tree_pine_2003_0: THREE.Mesh
      mff_tree_pine_0001_0: THREE.Mesh
      mff_tree_pine_1001_0: THREE.Mesh
      mff_tree_pine_1002_0: THREE.Mesh
      mff_tree_maple001_0: THREE.Mesh
      mff_tree_maple002_0: THREE.Mesh
      mff_tree_maple003_0: THREE.Mesh
      mff_tree_maple004_0: THREE.Mesh
      mff_tree_pine_0002_0: THREE.Mesh
      mff_tree_pine_1003_0: THREE.Mesh
      mff_tree_pine_1004_0: THREE.Mesh
      mff_tree_pine_0003_0: THREE.Mesh
      mff_tree_pine_2004_0: THREE.Mesh
      ['Sheep-ver1010_0']: THREE.Mesh
      ['Sheep-ver1011_0']: THREE.Mesh
      ['Sheep-ver1012_0']: THREE.Mesh
      ['Sheep-ver1013_0']: THREE.Mesh
      TreeTrunk001_0: THREE.Mesh
      TreeTrunk002_0: THREE.Mesh
      Stones_1_AO001_0: THREE.Mesh
      Stones_1_AO002_0: THREE.Mesh
      mff_stone_mossy_0001_0: THREE.Mesh
      mff_stone_mossy_0002_0: THREE.Mesh
      Stones_4_AO001_0: THREE.Mesh
      Stones_4_AO002_0: THREE.Mesh
      Stones_4_AO003_0: THREE.Mesh
      Stones_3_AO001_0: THREE.Mesh
      Stones_3_AO002_0: THREE.Mesh
      Stones_1_AO003_0: THREE.Mesh
      Stones_1_AO004_0: THREE.Mesh
      Stones_1_AO005_0: THREE.Mesh
      Stones_4_AO004_0: THREE.Mesh
      Cube000_0: THREE.Mesh
      Paving_3_AO003_0: THREE.Mesh
      Paving_1_AO007_0: THREE.Mesh
      Stones_1_AO006_0: THREE.Mesh
      Stones_4_AO005_0: THREE.Mesh
      Stones_4_AO006_0: THREE.Mesh
      Stones_1_AO007_0: THREE.Mesh
      Stones_3_AO003_0: THREE.Mesh
      mff_stone_mossy_0003_0: THREE.Mesh
      Stones_1_AO008_0: THREE.Mesh
      mff_stone_0001_0: THREE.Mesh
      mff_stone_0002_0: THREE.Mesh
      Stones_4_AO007_0: THREE.Mesh
      mff_tree_pine_2005_0: THREE.Mesh
      mff_tree_pine_1005_0: THREE.Mesh
      tree9001_0: THREE.Mesh
      tree9002_0: THREE.Mesh
      tree9003_0: THREE.Mesh
      mff_tree_pine_0004_0: THREE.Mesh
      Stones_4_AO008_0: THREE.Mesh
      mff_stone_0003_0: THREE.Mesh
      mff_stone_0004_0: THREE.Mesh
      mff_stone_0005_0: THREE.Mesh
      mff_stone_0006_0: THREE.Mesh
      mff_stone_0007_0: THREE.Mesh
      Rock_1_AO001_0: THREE.Mesh
      Stones_4_AO009_0: THREE.Mesh
      mff_stone_0008_0: THREE.Mesh
      mff_stone_mossy_0004_0: THREE.Mesh
      mff_stone_0009_0: THREE.Mesh
      Stones_1_AO009_0: THREE.Mesh
      Stones_3_AO004_0: THREE.Mesh
      Stones_3_AO005_0: THREE.Mesh
      mff_stone_0010_0: THREE.Mesh
      mff_stone_0011_0: THREE.Mesh
      mff_stone_0012_0: THREE.Mesh
      mff_stone_0013_0: THREE.Mesh
      mff_tree_pine_1006_0: THREE.Mesh
      TreeTrunk003_0: THREE.Mesh
      TreeTrunk004_0: THREE.Mesh
      ['Deer-ver3001_0']: THREE.Mesh
      Keel000_0: THREE.Mesh
      VikingShipObjects000_0: THREE.Mesh
      VikingShipObjects001_0: THREE.Mesh
      VikingShipObjects006_0: THREE.Mesh
      VikingShipObjects007_0: THREE.Mesh
      VikingShipObjects008_0: THREE.Mesh
      VikingShipObjects009_0: THREE.Mesh
      VikingShipObjects010_0: THREE.Mesh
      VikingShipObjects011_0: THREE.Mesh
      VikingShipObjects012_0: THREE.Mesh
      VikingShipObjects013_0: THREE.Mesh
      VikingShipObjects014_0: THREE.Mesh
      VikingShipObjects015_0: THREE.Mesh
      mff_stone_0014_0: THREE.Mesh
      mff_stone_0015_0: THREE.Mesh
      VikingShipObjects016_0: THREE.Mesh
      VikingShipObjects017_0: THREE.Mesh
      VikingShipObjects018_0: THREE.Mesh
      VikingShipObjects019_0: THREE.Mesh
      VikingShipObjects020_0: THREE.Mesh
      Stones_1_AO010_0: THREE.Mesh
      Stones_1_AO011_0: THREE.Mesh
      Stones_1_AO012_0: THREE.Mesh
      VikingShipObjects021_0: THREE.Mesh
      VikingShipObjects022_0: THREE.Mesh
      VikingShipObjects023_0: THREE.Mesh
      mff_stone_0016_0: THREE.Mesh
      Stones_3_AO006_0: THREE.Mesh
      VikingShipObjects024_0: THREE.Mesh
      VikingShipObjects025_0: THREE.Mesh
      Stones_3_AO007_0: THREE.Mesh
      mff_stone_mossy_0005_0: THREE.Mesh
      mff_stone_mossy_0006_0: THREE.Mesh
      mff_stone_mossy_0007_0: THREE.Mesh
      mff_tree_maple005_0: THREE.Mesh
      tree9004_0: THREE.Mesh
      mff_tree_pine_2006_0: THREE.Mesh
      Stones_4_AO010_0: THREE.Mesh
      mff_stone_0017_0: THREE.Mesh
      mff_stone_0018_0: THREE.Mesh
      mff_stone_0019_0: THREE.Mesh
      mff_stone_0020_0: THREE.Mesh
      Stones_4_AO011_0: THREE.Mesh
      mff_stone_0021_0: THREE.Mesh
      mff_stone_0022_0: THREE.Mesh
      mff_stone_0023_0: THREE.Mesh
      Stones_4_AO012_0: THREE.Mesh
      mff_stone_0024_0: THREE.Mesh
      Stones_3_AO008_0: THREE.Mesh
      Stones_3_AO009_0: THREE.Mesh
      mff_stone_0025_0: THREE.Mesh
      mff_stone_0026_0: THREE.Mesh
      mff_stone_0027_0: THREE.Mesh
      mff_stone_0028_0: THREE.Mesh
      Stones_1_AO013_0: THREE.Mesh
      Stones_3_AO010_0: THREE.Mesh
      mff_stone_0029_0: THREE.Mesh
      Stone_Circle001_0: THREE.Mesh
      HouseBase_7_AO019_0: THREE.Mesh
      Well_AO001_0: THREE.Mesh
      Stones_3_AO011_0: THREE.Mesh
      mff_stone_0030_0: THREE.Mesh
      mff_stone_0031_0: THREE.Mesh
      mff_stone_0032_0: THREE.Mesh
      Tower_3_AO001_0: THREE.Mesh
      VikingShipObjects026_0: THREE.Mesh
      VikingShipObjects027_0: THREE.Mesh
      Stones_4_AO013_0: THREE.Mesh
      Stones_1_AO014_0: THREE.Mesh
      Stones_4_AO014_0: THREE.Mesh
      ['Castle-stairs001_0']: THREE.Mesh
      ['Castle-tower-middle-large001_0']: THREE.Mesh
      ['Castle-tower-top-ver1001_0']: THREE.Mesh
      HouseBase_3_AO001_0: THREE.Mesh
      ['Castle-tower-small-ver2003_0']: THREE.Mesh
      ['Castle-tower-small-ver2004_0']: THREE.Mesh
      ['Castle-tower-small-ver2005_0']: THREE.Mesh
      ['Castle-tower-small-ver2006_0']: THREE.Mesh
      ['castle-wall-top-half003_0']: THREE.Mesh
      ['castle-wall-top-half004_0']: THREE.Mesh
      ['castle-wall-top-half005_0']: THREE.Mesh
      ['castle-wall-top-half006_0']: THREE.Mesh
      ['castle-wall-roof001_0']: THREE.Mesh
      ['Castle-gate-closed001_0']: THREE.Mesh
      ['castle-wall-roof002_0']: THREE.Mesh
      ['window-stone001_0']: THREE.Mesh
      ['window-stone001_1']: THREE.Mesh
      ['window-stone002_0']: THREE.Mesh
      ['window-stone002_1']: THREE.Mesh
      ['Castle-window-ver3001_0']: THREE.Mesh
      ['Castle-window-ver3001_1']: THREE.Mesh
      ['Castle-window-ver3002_0']: THREE.Mesh
      ['Castle-window-ver3002_1']: THREE.Mesh
      ['Castle-window-ver3003_0']: THREE.Mesh
      ['Castle-window-ver3003_1']: THREE.Mesh
      ['Castle-window-ver3004_0']: THREE.Mesh
      ['Castle-window-ver3004_1']: THREE.Mesh
      ['Castle-window-ver3005_0']: THREE.Mesh
      ['Castle-window-ver3005_1']: THREE.Mesh
      ['Castle-window-ver3006_0']: THREE.Mesh
      ['Castle-window-ver3006_1']: THREE.Mesh
      Paving_3_AO004_0: THREE.Mesh
      Stones_1_AO015_0: THREE.Mesh
      Stones_1_AO016_0: THREE.Mesh
      mff_stone_0033_0: THREE.Mesh
      Stones_3_AO012_0: THREE.Mesh
      Stones_3_AO013_0: THREE.Mesh
      Stones_1_AO017_0: THREE.Mesh
      ['window-stone003_0']: THREE.Mesh
      ['window-stone003_1']: THREE.Mesh
      ['window-stone004_0']: THREE.Mesh
      ['window-stone004_1']: THREE.Mesh
      ['window-stone005_0']: THREE.Mesh
      ['window-stone005_1']: THREE.Mesh
      ['window-stone006_0']: THREE.Mesh
      ['window-stone006_1']: THREE.Mesh
      Stones_4_AO015_0: THREE.Mesh
      VikingShipObjects028_0: THREE.Mesh
      ['Castle-wall003_0']: THREE.Mesh
      ['Castle-wall005_0']: THREE.Mesh
      ['Castle-wall006_0']: THREE.Mesh
      ['Castle-wall007_0']: THREE.Mesh
      ['Castle-wall008_0']: THREE.Mesh
      ['Castle-wall009_0']: THREE.Mesh
      ['Castle-wall010_0']: THREE.Mesh
      ['Castle-wall011_0']: THREE.Mesh
      ['Castle-wall012_0']: THREE.Mesh
      ['Castle-wall013_0']: THREE.Mesh
      ['Castle-wall014_0']: THREE.Mesh
      ['Castle-wall015_0']: THREE.Mesh
      ['Castle-wall016_0']: THREE.Mesh
      ['Castle-wall017_0']: THREE.Mesh
      ['Castle-wall018_0']: THREE.Mesh
      ['Castle-wall019_0']: THREE.Mesh
      ['Castle-wall020_0']: THREE.Mesh
      ['Castle-wall021_0']: THREE.Mesh
      ['Castle-wall022_0']: THREE.Mesh
      ['Castle-wall023_0']: THREE.Mesh
      ['Castle-wall024_0']: THREE.Mesh
      mff_stone_0034_0: THREE.Mesh
      ['Castle-tower-top-ver1002_0']: THREE.Mesh
      ['Castle-tower-middle-large002_0']: THREE.Mesh
      ['Castle-tower-middle-large003_0']: THREE.Mesh
      ['Castle-tower-top-ver1003_0']: THREE.Mesh
      ['Castle-tower-top-ver1004_0']: THREE.Mesh
      ['Castle-tower-middle-large004_0']: THREE.Mesh
      ['Castle-tower-middle-large005_0']: THREE.Mesh
      ['Castle-tower-top-ver1005_0']: THREE.Mesh
      ['Castle-tower-top-ver1006_0']: THREE.Mesh
      ['Castle-tower-middle-large006_0']: THREE.Mesh
      ['Castle-tower-middle-large007_0']: THREE.Mesh
      ['Castle-tower-top-ver1007_0']: THREE.Mesh
      ['Castle-tower-top-ver1008_0']: THREE.Mesh
      ['Castle-tower-middle-large008_0']: THREE.Mesh
      ['Castle-tower-top-ver1009_0']: THREE.Mesh
      ['Castle-tower-middle-large009_0']: THREE.Mesh
      ['castle-wall-top-half008_0']: THREE.Mesh
      ['Castle-gate003_0']: THREE.Mesh
      ['Castle-lattice-small001_0']: THREE.Mesh
      ['Castle-gate-closed002_0']: THREE.Mesh
      ['Castle-stairs002_0']: THREE.Mesh
      ['Castle-gate-closed003_0']: THREE.Mesh
      ['Castle-gate-closed004_0']: THREE.Mesh
      ['Castle-stairs003_0']: THREE.Mesh
      ['Shelter-half001_0']: THREE.Mesh
      ['Shelter-half002_0']: THREE.Mesh
      ['Shelter-half003_0']: THREE.Mesh
      Cube001_0: THREE.Mesh
      House_1_AO003_0: THREE.Mesh
      House_2_AO003_0: THREE.Mesh
      House_4_AO003_0: THREE.Mesh
      House_2_AO004_0: THREE.Mesh
      Tower_3_AO002_0: THREE.Mesh
      House_3_AO003_0: THREE.Mesh
      House_4_AO004_0: THREE.Mesh
      House_2_AO005_0: THREE.Mesh
      House_1_AO004_0: THREE.Mesh
      House_1_AO005_0: THREE.Mesh
      House_2_AO006_0: THREE.Mesh
      House_1_AO006_0: THREE.Mesh
      House_2_AO007_0: THREE.Mesh
      House_1_AO007_0: THREE.Mesh
      House_2_AO008_0: THREE.Mesh
      House_4_AO005_0: THREE.Mesh
      House_1_AO008_0: THREE.Mesh
      House_1_AO009_0: THREE.Mesh
      Tower_3_AO003_0: THREE.Mesh
      House_4_AO006_0: THREE.Mesh
      Well_AO002_0: THREE.Mesh
      HouseBase_7_AO001_0: THREE.Mesh
      Stone_Circle002_0: THREE.Mesh
      WodenSet_1_AO001_0: THREE.Mesh
      HouseBase_5_AO001_0: THREE.Mesh
      ['Bridge-wooden-dark001_0']: THREE.Mesh
      Stones_3_AO014_0: THREE.Mesh
      mff_stone_0035_0: THREE.Mesh
      Stones_4_AO016_0: THREE.Mesh
      mff_tree_pine_2007_0: THREE.Mesh
      mff_tree_pine_2008_0: THREE.Mesh
      ['Castle-bridge001_0']: THREE.Mesh
      ['Castle-wall002_0']: THREE.Mesh
      ['Castle-bridge003_0']: THREE.Mesh
      ['Castle-wall025_0']: THREE.Mesh
      mff_stone_0036_0: THREE.Mesh
      mff_stone_0037_0: THREE.Mesh
      Tower_1_AO002_0: THREE.Mesh
      Tower_2_AO003_0: THREE.Mesh
      mff_tree_pine_0005_0: THREE.Mesh
      mff_tree_pine_0006_0: THREE.Mesh
      mff_tree_maple006_0: THREE.Mesh
      ['Shelter-half004_0']: THREE.Mesh
      ['Shelter-half005_0']: THREE.Mesh
      Tower_1_AO003_0: THREE.Mesh
      Shelter001_0: THREE.Mesh
      Shelter002_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO003_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO004_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO005_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO006_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO007_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO008_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO009_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO010_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO011_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO012_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO013_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO014_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO015_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO016_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO017_0: THREE.Mesh
      Paving_4_AO006_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO019_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO020_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO021_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO022_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO023_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO024_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO025_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO026_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO027_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO028_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO029_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO030_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO031_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO032_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO033_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO034_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO035_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO036_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO037_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO038_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO039_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO040_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO041_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO042_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO043_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO044_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO045_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO046_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO047_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO048_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO049_0: THREE.Mesh
      pCube13000_0: THREE.Mesh
      pCube13001_0: THREE.Mesh
      pCube13002_0: THREE.Mesh
      pCube13005_0: THREE.Mesh
      mff_tree_pine_2009_0: THREE.Mesh
      mff_tree_pine_2010_0: THREE.Mesh
      mff_tree_pine_1007_0: THREE.Mesh
      mff_tree_pine_2011_0: THREE.Mesh
      mff_tree_pine_1008_0: THREE.Mesh
      mff_tree_pine_0007_0: THREE.Mesh
      mff_tree_maple007_0: THREE.Mesh
      mff_tree_maple008_0: THREE.Mesh
      mff_tree_pine_0008_0: THREE.Mesh
      mff_tree_pine_0009_0: THREE.Mesh
      mff_tree_pine_1009_0: THREE.Mesh
      mff_tree_maple009_0: THREE.Mesh
      HouseBase_7_AO002_0: THREE.Mesh
      VikingShipObjects035_0: THREE.Mesh
      VikingShipObjects037_0: THREE.Mesh
      VikingShipObjects038_0: THREE.Mesh
      VikingShipObjects039_0: THREE.Mesh
      VikingShipObjects041_0: THREE.Mesh
      VikingShipObjects042_0: THREE.Mesh
      VikingShipObjects043_0: THREE.Mesh
      VikingShipObjects044_0: THREE.Mesh
      VikingShipObjects045_0: THREE.Mesh
      VikingShipObjects047_0: THREE.Mesh
      VikingShipObjects048_0: THREE.Mesh
      VikingShipObjects050_0: THREE.Mesh
      VikingShipObjects134_0: THREE.Mesh
      VikingShipObjects135_0: THREE.Mesh
      VikingShipObjects136_0: THREE.Mesh
      VikingShipObjects138_0: THREE.Mesh
      VikingShipObjects139_0: THREE.Mesh
      VikingShipObjects140_0: THREE.Mesh
      VikingShipObjects141_0: THREE.Mesh
      VikingShipObjects142_0: THREE.Mesh
      VikingShipObjects143_0: THREE.Mesh
      VikingShipObjects144_0: THREE.Mesh
      VikingShipObjects145_0: THREE.Mesh
      VikingShipObjects146_0: THREE.Mesh
      VikingShipObjects147_0: THREE.Mesh
      VikingShipObjects148_0: THREE.Mesh
      VikingShipObjects149_0: THREE.Mesh
      VikingShipObjects150_0: THREE.Mesh
      VikingShipObjects151_0: THREE.Mesh
      VikingShipObjects152_0: THREE.Mesh
      VikingShipObjects153_0: THREE.Mesh
      VikingShipObjects154_0: THREE.Mesh
      VikingShipObjects155_0: THREE.Mesh
      VikingShipObjects156_0: THREE.Mesh
      VikingShipObjects157_0: THREE.Mesh
      VikingShipObjects158_0: THREE.Mesh
      VikingShipObjects159_0: THREE.Mesh
      VikingShipObjects160_0: THREE.Mesh
      VikingShipObjects161_0: THREE.Mesh
      VikingShipObjects162_0: THREE.Mesh
      VikingShipObjects163_0: THREE.Mesh
      VikingShipObjects164_0: THREE.Mesh
      VikingShipObjects165_0: THREE.Mesh
      VikingShipObjects166_0: THREE.Mesh
      VikingShipObjects167_0: THREE.Mesh
      VikingShipObjects168_0: THREE.Mesh
      VikingShipObjects169_0: THREE.Mesh
      VikingShipObjects170_0: THREE.Mesh
      VikingShipObjects171_0: THREE.Mesh
      VikingShipObjects172_0: THREE.Mesh
      VikingShipObjects173_0: THREE.Mesh
      VikingShipObjects174_0: THREE.Mesh
      VikingShipObjects175_0: THREE.Mesh
      pCube119001_0: THREE.Mesh
      pCube119002_0: THREE.Mesh
      bench001_0: THREE.Mesh
      bench002_0: THREE.Mesh
      bench003_0: THREE.Mesh
      bench004_0: THREE.Mesh
      bench005_0: THREE.Mesh
      bench006_0: THREE.Mesh
      bench007_0: THREE.Mesh
      bench008_0: THREE.Mesh
      bench009_0: THREE.Mesh
      bench010_0: THREE.Mesh
      bench011_0: THREE.Mesh
      archer_m_easy001_0: THREE.Mesh
      Guest_m_3001_0: THREE.Mesh
      Guest_m_4001_0: THREE.Mesh
      Fireplace001_0: THREE.Mesh
      VikingShipObjects176_0: THREE.Mesh
      stall2001_0: THREE.Mesh
      Throne_king001_0: THREE.Mesh
      Throne_princess001_0: THREE.Mesh
      Throne_queen001_0: THREE.Mesh
      VikingShipObjects177_0: THREE.Mesh
      VikingShipObjects178_0: THREE.Mesh
      VikingShipObjects179_0: THREE.Mesh
      VikingShipObjects180_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO018_0: THREE.Mesh
      cup004002_0: THREE.Mesh
      SFMC_geo12432_Main_grp001_0: THREE.Mesh
      SFMC_geo12384_Main_grp001_0: THREE.Mesh
      SFMC_geo12434_Main_grp001_0: THREE.Mesh
      SFMC_geo12434_Main_grp002_0: THREE.Mesh
      cup004003_0: THREE.Mesh
      cup004004_0: THREE.Mesh
      cup004005_0: THREE.Mesh
      cup004006_0: THREE.Mesh
      cup004007_0: THREE.Mesh
      cup004008_0: THREE.Mesh
      cup004009_0: THREE.Mesh
      cup004010_0: THREE.Mesh
      cup004011_0: THREE.Mesh
      VikingShipObjects181_0: THREE.Mesh
      VikingShipObjects182_0: THREE.Mesh
      Guest_f_1001_0: THREE.Mesh
      queen_posed001_0: THREE.Mesh
      Guest_m_1001_0: THREE.Mesh
      Guest_f_2001_0: THREE.Mesh
      Guest_f_4001_0: THREE.Mesh
      Guest_m_4002_0: THREE.Mesh
      House_4_AO007_0: THREE.Mesh
      Stones_3_AO015_0: THREE.Mesh
      Stones_3_AO016_0: THREE.Mesh
      mff_stone_0038_0: THREE.Mesh
      mff_stone_0039_0: THREE.Mesh
      House_3_AO004_0: THREE.Mesh
      HouseBase_5_AO002_0: THREE.Mesh
      ['Deer-ver1001_0']: THREE.Mesh
      ['Deer-ver2001_0']: THREE.Mesh
      ['Sheep-ver3001_0']: THREE.Mesh
      ['Sheep-ver3002_0']: THREE.Mesh
      ['Sheep-ver3003_0']: THREE.Mesh
      ['Sheep-ver3004_0']: THREE.Mesh
      ['Sheep-ver3005_0']: THREE.Mesh
      ['Sheep-ver3006_0']: THREE.Mesh
      SFMC_geo12435_Main_grp001_0: THREE.Mesh
      SFMC_geo12435_Main_grp002_0: THREE.Mesh
      SFMC_geo12435_Main_grp003_0: THREE.Mesh
      archer_m_easy002_0: THREE.Mesh
      Guest_m_3002_0: THREE.Mesh
      Plane003_0: THREE.Mesh
      ['Bull-ver2001_0']: THREE.Mesh
      ['Bull-ver2002_0']: THREE.Mesh
      Shed_AO003_0: THREE.Mesh
      ['Bull-ver1001_0']: THREE.Mesh
      ['Bull-ver3001_0']: THREE.Mesh
      pCube13006_0: THREE.Mesh
      pCube13007_0: THREE.Mesh
      Paving_2_AO001_0: THREE.Mesh
      Paving_3_AO005_0: THREE.Mesh
      Paving_1_AO008_0: THREE.Mesh
      Paving_2_AO002_0: THREE.Mesh
      Paving_1_AO009_0: THREE.Mesh
      Paving_4_AO007_0: THREE.Mesh
      mff_stone_path_1004_0: THREE.Mesh
      Shed_AO004_0: THREE.Mesh
      Fencing_Wood_Clean_8_AO002_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO050_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO051_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO052_0: THREE.Mesh
      Stones_1_AO018_0: THREE.Mesh
      Fencing_Wood_Clean_8_AO003_0: THREE.Mesh
      cup004001_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO053_0: THREE.Mesh
      Fencing_Wood_Clean_3_AO054_0: THREE.Mesh
      mff_tree_maple010_0: THREE.Mesh
      mff_tree_pine_0010_0: THREE.Mesh
      mff_tree_pine_1010_0: THREE.Mesh
      Paving_2_AO003_0: THREE.Mesh
      Paving_2_AO004_0: THREE.Mesh
      Paving_4_AO008_0: THREE.Mesh
      Paving_4_AO009_0: THREE.Mesh
      Paving_2_AO005_0: THREE.Mesh
      House_4_AO008_0: THREE.Mesh
      Tower_3_AO004_0: THREE.Mesh
      House_2_AO009_0: THREE.Mesh
      Paving_4_AO010_0: THREE.Mesh
      Paving_3_AO006_0: THREE.Mesh
      Paving_2_AO006_0: THREE.Mesh
      Paving_2_AO007_0: THREE.Mesh
      Paving_2_AO008_0: THREE.Mesh
      Plane004_0: THREE.Mesh
      mff_stone_0040_0: THREE.Mesh
      mff_stone_0041_0: THREE.Mesh
      mff_stone_0042_0: THREE.Mesh
      mff_stone_0043_0: THREE.Mesh
      mff_stone_0044_0: THREE.Mesh
      mff_stone_0045_0: THREE.Mesh
      mff_stone_0046_0: THREE.Mesh
      mff_stone_0047_0: THREE.Mesh
      mff_stone_0048_0: THREE.Mesh
      mff_stone_0049_0: THREE.Mesh
      mff_stone_0050_0: THREE.Mesh
      mff_stone_0051_0: THREE.Mesh
      mff_stone_0052_0: THREE.Mesh
      mff_stone_0053_0: THREE.Mesh
      Sun_0: THREE.Mesh
      Moon_0: THREE.Mesh
      Stones_1_AO000_0: THREE.Mesh
      VikingShipObjects002_0: THREE.Mesh
      VikingShipObjects003_0: THREE.Mesh
      SFMC_geo12384_Main_grp000_0: THREE.Mesh
      SFMC_geo12384_Main_grp002_0: THREE.Mesh
      Paving_3_AO000_0: THREE.Mesh
      Paving_3_AO007_0: THREE.Mesh
      Paving_1_AO000_0: THREE.Mesh
      Paving_4_AO000_0: THREE.Mesh
      CageMix_0: THREE.Mesh
      CageMix_1: THREE.Mesh
      mff_stone_path_0000_0: THREE.Mesh
      pCube13003_0: THREE.Mesh
      pCube13004_0: THREE.Mesh
      pCube13008_0: THREE.Mesh
      pCube13009_0: THREE.Mesh
      mff_stone_0000_0: THREE.Mesh
      mff_stone_0054_0: THREE.Mesh
      mff_stone_0055_0: THREE.Mesh
      mff_stone_0056_0: THREE.Mesh
      mff_stone_0057_0: THREE.Mesh
      stall2000_0: THREE.Mesh
      Cube002_0: THREE.Mesh
      bench000_0: THREE.Mesh
      stall2002_0: THREE.Mesh
      Cube003_0: THREE.Mesh
      pCube13010_0: THREE.Mesh
      mff_stone_0058_0: THREE.Mesh
      Stones_4_AO000_0: THREE.Mesh
      GolemArmature_rootJoint: THREE.Bone
    }
    materials: {
      Wizard: THREE.MeshStandardMaterial
      Objects: THREE.MeshStandardMaterial
      ['Material.007']: THREE.MeshStandardMaterial
      ['Material.012']: THREE.MeshStandardMaterial
      medievalfantasyforest_unwrap: THREE.MeshStandardMaterial
      House_4_AO_tex: THREE.MeshStandardMaterial
      House_3_AO_tex: THREE.MeshStandardMaterial
      House_1_AO_tex: THREE.MeshStandardMaterial
      House_2_AO_tex: THREE.MeshStandardMaterial
      Tower_tex_1: THREE.MeshStandardMaterial
      StoneWall: THREE.MeshStandardMaterial
      Tower_tex_2: THREE.MeshStandardMaterial
      Material: THREE.MeshStandardMaterial
      ['Material.001']: THREE.MeshStandardMaterial
      ['Material.003']: THREE.MeshStandardMaterial
      ['Material.009']: THREE.MeshStandardMaterial
      ['well_material.001']: THREE.MeshStandardMaterial
      ['pulley_mat.001']: THREE.MeshStandardMaterial
      ['Material.012']: THREE.MeshStandardMaterial
      ['Material.013']: THREE.MeshStandardMaterial
      ['Material.017']: THREE.MeshStandardMaterial
      ['Material.008']: THREE.MeshStandardMaterial
      Stone_Circle_Mat: THREE.MeshStandardMaterial
      ['Material.020']: THREE.MeshStandardMaterial
      Tower_tex_3: THREE.MeshStandardMaterial
      ['Material.021']: THREE.MeshStandardMaterial
      ['Material.014']: THREE.MeshStandardMaterial
      ['Ravens.001']: THREE.MeshStandardMaterial
      ['Material.035']: THREE.MeshStandardMaterial
      bench_mat: THREE.MeshStandardMaterial
      ['Material.033']: THREE.MeshStandardMaterial
      ['Material.026']: THREE.MeshStandardMaterial
      ['Material.025']: THREE.MeshStandardMaterial
      ['Material.037']: THREE.MeshStandardMaterial
      ['Material.038']: THREE.MeshStandardMaterial
      ['Material.036']: THREE.MeshStandardMaterial
      ['Material.034']: THREE.MeshStandardMaterial
      ['Material.032']: THREE.MeshStandardMaterial
      ['Material.024']: THREE.MeshStandardMaterial
      ['Material.028']: THREE.MeshStandardMaterial
      ['Material.031']: THREE.MeshStandardMaterial
      ['Material.029']: THREE.MeshStandardMaterial
      ['color.003']: THREE.MeshStandardMaterial
      Water: THREE.MeshStandardMaterial
      SunM: THREE.MeshStandardMaterial
      MoonM: THREE.MeshStandardMaterial
    }
  }

  const gltf = useGltf<GLTFResult>('/models/issum_the_town_on_capital_isle-transformed.glb', {
    useDraco: true
  })

  const component = forwardEventHandlers()
</script>

<T
  is={ref}
  dispose={false}
  {...$$restProps}
  bind:this={$component}
>
  {#await gltf}
    <slot name="fallback" />
  {:then gltf}
    <T.Group rotation={[-Math.PI / 2, 0, 0]}>
      <T.Group
        position={[0.24123000000000003, -7.5024, 6.845809999999999]}
        rotation={[0, 0, 0.15076272552981504]}
        scale={[0.597234544881657, 0.597234544881657, 0.5972400000000001]}
      >
        <T is={gltf.nodes.GolemArmature_rootJoint} />
        <T.SkinnedMesh
          geometry={gltf.nodes.Golem_0.geometry}
          material={gltf.materials['Material.012']}
          skeleton={gltf.nodes.Golem_0.skeleton}
        />
      </T.Group>
      <T.Group
        position={[1.4270599999999998, 18.33742, 7.4381900000000005]}
        rotation={[0.025704200637448004, 0.12630121446799059, -0.04029270564498475]}
        scale={[0.47847675680225055, 0.4784738593695585, 0.4784778500620484]}
      >
        <T.Mesh
          geometry={gltf.nodes.Cylinder000_0.geometry}
          material={gltf.materials['well_material.001']}
        />
        <T.Mesh
          geometry={gltf.nodes.Cylinder000_1.geometry}
          material={gltf.materials['pulley_mat.001']}
        />
      </T.Group>
      <T.Group
        position={[-10.94251, -4.27819, 12.269319999999999]}
        scale={0.30000000000000004}
      >
        <T.Mesh
          geometry={gltf.nodes['window-stone001_0'].geometry}
          material={gltf.materials['Material.007']}
        />
        <T.Mesh
          geometry={gltf.nodes['window-stone001_1'].geometry}
          material={gltf.materials['Material.007']}
        />
      </T.Group>
      <T.Group
        position={[-10.045219999999999, -4.27819, 12.269319999999999]}
        scale={0.30000000000000004}
      >
        <T.Mesh
          geometry={gltf.nodes['window-stone002_0'].geometry}
          material={gltf.materials['Material.007']}
        />
        <T.Mesh
          geometry={gltf.nodes['window-stone002_1'].geometry}
          material={gltf.materials['Material.007']}
        />
      </T.Group>
      <T.Group
        position={[-9.13283, -0.45482000000000006, 13.055530000000003]}
        rotation={[0, 0, -2.638191576514229]}
        scale={[0.29999534463054595, 0.29999534463054595, 0.30000000000000004]}
      >
        <T.Mesh
          geometry={gltf.nodes['Castle-window-ver3001_0'].geometry}
          material={gltf.materials['Material.007']}
        />
        <T.Mesh
          geometry={gltf.nodes['Castle-window-ver3001_1'].geometry}
          material={gltf.materials['Material.007']}
        />
      </T.Group>
      <T.Group
        position={[-8.70924, -