bx-1316-refactoring #14

Merged
ksenia_mikhailova merged 46 commits from bx-1316-refactoring into dev 2024-08-28 15:06:52 +03:00
2 changed files with 22 additions and 26 deletions
Showing only changes of commit 9962f33296 - Show all commits

BIN
front/public/pointer.glb Normal file

Binary file not shown.

View File

@ -1,10 +1,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, onUnmounted, reactive, ref, watch } from 'vue'; import { onMounted, onUnmounted, reactive, ref, watch } from 'vue';
import { import {
Box3, Color, DoubleSide, Group, Mesh, MeshBasicMaterial, Box3, Color, DoubleSide, Group, Mesh, PlaneGeometry,
MeshStandardMaterial, MeshStandardMaterial, MeshStandardMaterialParameters,
MeshStandardMaterialParameters, Vector2, Vector3, Object3D
PlaneGeometry, SpriteMaterial, TextureLoader, Vector2, Vector3,
} from 'three'; } from 'three';
import { useTresContext, useSeek, useTexture, useLoop } from '@tresjs/core'; import { useTresContext, useSeek, useTexture, useLoop } from '@tresjs/core';
@ -23,20 +22,23 @@ const models = ref<model3DType[]>([])
const clickable = ref<clickableAreaType[]>([]) const clickable = ref<clickableAreaType[]>([])
const clickable_items = ref<any[]>([]) const clickable_items = ref<any[]>([])
const clickable_refs = ref<any[]>([]) const clickable_refs = ref<any[]>([])
const envVars = reactive({}) as EnvVars
const sidebar = usePromoSidebar(); const sidebar = usePromoSidebar();
const sidebar_scene = usePromoScene() const sidebar_scene = usePromoScene()
const { controls, camera, scene, raycaster, renderer } = useTresContext() const { controls, camera, scene, raycaster, renderer } = useTresContext()
const { pause, resume } = useLoop() const { pause, resume } = useLoop()
const { seekByName, seekAllByName } = useSeek() const { seekByName, seekAllByName } = useSeek()
const envVars = reactive({}) as EnvVars
const groundTexture = await useTexture({ const groundTexture = await useTexture({
displacementMap: '/ground_displacement.jpg', displacementMap: '/ground_displacement.jpg',
}) })
const { scene: pointer_pin } = await useGLTF('/pointer.glb')
const timer = ref(10) const timer = ref(10)
setInterval(() => { setInterval(() => {
console.log({ timer: timer.value }) // console.log({ timer: timer.value })
if (timer.value > 0) { if (timer.value > 0) {
timer.value -= 1 timer.value -= 1
} else if (timer.value == 0 && !(controls.value as any).autoRotate && (controls.value as any).enabled) { } else if (timer.value == 0 && !(controls.value as any).autoRotate && (controls.value as any).enabled) {
@ -51,10 +53,6 @@ setInterval(() => {
} }
}, 1000); }, 1000);
// renderer.value.capabilities.maxTextures = 4
// renderer.value.capabilities.maxTextureSize = 512
renderer.value.capabilities.precision = 'lowp'
const loadModels = async () => { const loadModels = async () => {
const res = await fetch(`${SERVER_URL}/api/obj/scene/${props.source}`) const res = await fetch(`${SERVER_URL}/api/obj/scene/${props.source}`)
const raw_data = await res.json() as scene3D const raw_data = await res.json() as scene3D
@ -167,23 +165,20 @@ const loadModels = async () => {
(find_element as Mesh).localToWorld(world_position); (find_element as Mesh).localToWorld(world_position);
const p = raw_data.min_distance * 0.05 const p = raw_data.min_distance * 0.05
const plane = new PlaneGeometry(p, p, 32) // const plane = new PlaneGeometry(p, p, 32)
const mesh_material = new MeshBasicMaterial({ side: DoubleSide }) // const mesh_material = new MeshBasicMaterial({ side: DoubleSide })
const sprite_material = new SpriteMaterial() // mesh_material.color = new Color('red')
if (element.image) { // if (element.image) {
const map = new TextureLoader().load(`${IMAGE_URL}/${element.image}`); // const map = new TextureLoader().load(`${IMAGE_URL}/${element.image}`);
mesh_material.map = map // mesh_material.map = map
sprite_material.map = map // }
} else {
mesh_material.color = new Color('red')
sprite_material.color = new Color('red')
}
const point = new Mesh(plane, mesh_material); const point = pointer_pin.clone()
point.position.set(world_position.x, p * 3, world_position.z) point.position.set(world_position.x, p * 3, world_position.z)
point.name = `${element.id}_clickable` point.name = `${element.id}_clickable`
point.renderOrder = 10 point.scale.set(p * 2, p * 2, p * 2)
point.updateMatrixWorld()
if (clickable_items.value.find(el => el.name == point.name)) continue if (clickable_items.value.find(el => el.name == point.name)) continue
clickable_items.value.push(point) clickable_items.value.push(point)
@ -215,8 +210,9 @@ const loadModels = async () => {
const { onAfterRender } = useLoop() const { onAfterRender } = useLoop()
onAfterRender(() => { onAfterRender(() => {
clickable_refs.value.map(el => { clickable_refs.value.map(el => {
if (el.value[0] && typeof el.value[0].lookAt == 'function') { if (el.value[0].children[0] && typeof el.value[0].children[0].lookAt == 'function') {
el.value[0].lookAt(camera.value?.position); el.value[0].children[0].lookAt(camera.value?.position);
// el.value[0].updateMatrixWorld()
} }
}) })
if (controls.value) { if (controls.value) {
@ -318,7 +314,7 @@ watch(() => sidebar_scene.list, () => {
</TresGroup> </TresGroup>
</template> </template>
<template v-for="(item, i) in clickable_items"> <template v-for="(item, i) in clickable_items">
<TresMesh v-bind="item" :ref="clickable_refs[i]" /> <TresObject3D v-bind="item.clone()" :ref="clickable_refs[i]" />
</template> </template>
</TresGroup> </TresGroup>
</template> </template>