Compare commits
9 Commits
Author | SHA1 | Date |
---|---|---|
|
5ec685374d | |
|
0a801c4188 | |
|
50c78fd219 | |
|
19026731f6 | |
|
1219204f45 | |
|
6cbb63b4e8 | |
|
1329678fe6 | |
|
e9ebc96aac | |
|
8872674ba6 |
|
@ -2,6 +2,7 @@
|
||||||
files/*
|
files/*
|
||||||
postgres_data/*
|
postgres_data/*
|
||||||
export_images/*
|
export_images/*
|
||||||
|
glb_import/*
|
||||||
.vscode/
|
.vscode/
|
||||||
__pycache__/
|
__pycache__/
|
||||||
poetry.lock
|
poetry.lock
|
||||||
|
|
|
@ -26,6 +26,7 @@ class Item(models.Model):
|
||||||
slug = models.SlugField(unique=True)
|
slug = models.SlugField(unique=True)
|
||||||
images = models.ManyToManyField(Image)
|
images = models.ManyToManyField(Image)
|
||||||
scene_3d = models.ForeignKey(Scene3D, on_delete=models.RESTRICT)
|
scene_3d = models.ForeignKey(Scene3D, on_delete=models.RESTRICT)
|
||||||
|
file = models.FileField(blank=True, null=True, upload_to=group_based_upload_to)
|
||||||
is_front = models.BooleanField()
|
is_front = models.BooleanField()
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
|
|
@ -11,6 +11,7 @@ class ImageSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
class ItemSerializer(serializers.ModelSerializer):
|
class ItemSerializer(serializers.ModelSerializer):
|
||||||
images = ImageSerializer(many=True)
|
images = ImageSerializer(many=True)
|
||||||
|
file = serializers.FileField(use_url=False)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
lookup_field = 'slug'
|
lookup_field = 'slug'
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
from django.core.management.base import BaseCommand, CommandError
|
||||||
|
from django.core.files import File
|
||||||
|
import glob
|
||||||
|
import os
|
||||||
|
import logging
|
||||||
|
from object.models import Element3D, Scene3D
|
||||||
|
logger = logging.getLogger("root")
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
def handle(self, *args, **options):
|
||||||
|
root_directory = "object/management/commands/data"
|
||||||
|
|
||||||
|
files = glob.glob("*.glb", recursive=True, root_dir=root_directory)
|
||||||
|
hv = Scene3D.objects.get(id=48)
|
||||||
|
for f in files:
|
||||||
|
with open(os.path.join(root_directory, f), 'rb') as file:
|
||||||
|
el = Element3D(name=f)
|
||||||
|
el.model_file = File(file, f)
|
||||||
|
el.save()
|
||||||
|
logger.info(el)
|
||||||
|
hv.elements.add(el)
|
||||||
|
logger.info(hv.elements.count())
|
||||||
|
|
|
@ -37,6 +37,7 @@ services:
|
||||||
volumes:
|
volumes:
|
||||||
- ./.env:/app/.env
|
- ./.env:/app/.env
|
||||||
- ./files:/app/files
|
- ./files:/app/files
|
||||||
|
- ./glb_import:/app/object/management/commands/data
|
||||||
networks:
|
networks:
|
||||||
- dev
|
- dev
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ const loadEnv = async () => {
|
||||||
const c = new Color()
|
const c = new Color()
|
||||||
c.set(props.clear_color || PROMOBG)
|
c.set(props.clear_color || PROMOBG)
|
||||||
renderer.value.setClearColor(c)
|
renderer.value.setClearColor(c)
|
||||||
scene.value.fog = new Fog(c, props.focus * k.start, props.focus * k.end)
|
// scene.value.fog = new Fog(c, props.focus * k.start, props.focus * k.end)
|
||||||
|
|
||||||
const hsl_value = { h: 0, s: 0, l: 0 }
|
const hsl_value = { h: 0, s: 0, l: 0 }
|
||||||
new Color(props.clear_color).getHSL(hsl_value);
|
new Color(props.clear_color).getHSL(hsl_value);
|
||||||
|
|
|
@ -58,7 +58,7 @@ const sidebarFunc = () => {
|
||||||
if (sidebar.is_open) {
|
if (sidebar.is_open) {
|
||||||
sidebar.close()
|
sidebar.close()
|
||||||
} else {
|
} else {
|
||||||
sidebar.open()
|
sidebar.is_open = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -245,6 +245,7 @@ watch(() => props.source, () => {
|
||||||
}
|
}
|
||||||
console.log('props change')
|
console.log('props change')
|
||||||
sidebar.close()
|
sidebar.close()
|
||||||
|
sidebar.closeBtn()
|
||||||
} else {
|
} else {
|
||||||
renderer.value.dispose()
|
renderer.value.dispose()
|
||||||
}
|
}
|
||||||
|
@ -294,7 +295,7 @@ onBeforeRender(() => {
|
||||||
|
|
||||||
const dis_to_cam = camera.value?.position.distanceTo(el.value[0].position);
|
const dis_to_cam = camera.value?.position.distanceTo(el.value[0].position);
|
||||||
if (dis_to_cam) {
|
if (dis_to_cam) {
|
||||||
const scaling = (0.5 * dis_to_cam) / 100
|
const scaling = (0.66 * dis_to_cam) / 100
|
||||||
el.value[0].children[0].scale.set(scaling, scaling, scaling);
|
el.value[0].children[0].scale.set(scaling, scaling, scaling);
|
||||||
el.value[0].updateMatrixWorld()
|
el.value[0].updateMatrixWorld()
|
||||||
}
|
}
|
||||||
|
@ -335,6 +336,8 @@ onBeforeRender(() => {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
(controls.value as any).update()
|
||||||
})
|
})
|
||||||
|
|
||||||
watch(() => targetDistance.min, () => {
|
watch(() => targetDistance.min, () => {
|
||||||
|
|
|
@ -4,12 +4,14 @@ type state = {
|
||||||
name?: string,
|
name?: string,
|
||||||
description?: string,
|
description?: string,
|
||||||
clickable: PromoScene[],
|
clickable: PromoScene[],
|
||||||
|
_visible: { id: number, is_enabled: boolean }[],
|
||||||
visible: PromoScene[],
|
visible: PromoScene[],
|
||||||
}
|
}
|
||||||
export const usePromoScene = defineStore('promo_scene', {
|
export const usePromoScene = defineStore('promo_scene', {
|
||||||
state: () => {
|
state: () => {
|
||||||
return {
|
return {
|
||||||
clickable: [],
|
clickable: [],
|
||||||
|
_visible: [],
|
||||||
visible: [],
|
visible: [],
|
||||||
} as state
|
} as state
|
||||||
},
|
},
|
||||||
|
@ -22,7 +24,10 @@ export const usePromoScene = defineStore('promo_scene', {
|
||||||
this.clickable = data
|
this.clickable = data
|
||||||
},
|
},
|
||||||
setVisible(data: PromoScene[]) {
|
setVisible(data: PromoScene[]) {
|
||||||
this.visible = data
|
this._visible = data.slice(0).map(el => {
|
||||||
|
return { id: el.id, is_enabled: el.is_enabled ?? true }
|
||||||
|
})
|
||||||
|
this.visible = data.slice(0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { defineStore } from 'pinia'
|
import { defineStore } from 'pinia'
|
||||||
import { useClickable } from './clickable'
|
import { useClickable } from './clickable'
|
||||||
|
import { usePromoScene } from './promo_scene'
|
||||||
|
|
||||||
export const usePromoSidebar = defineStore('promo_sidebar', {
|
export const usePromoSidebar = defineStore('promo_sidebar', {
|
||||||
state: () => {
|
state: () => {
|
||||||
|
@ -47,13 +48,18 @@ export const usePromoSidebar = defineStore('promo_sidebar', {
|
||||||
// this.target = undefined;
|
// this.target = undefined;
|
||||||
// this.loading = true;
|
// this.loading = true;
|
||||||
this.is_open = false;
|
this.is_open = false;
|
||||||
this.accordions = []
|
// this.accordions = [];
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
closeBtn() {
|
closeBtn() {
|
||||||
this.$reset;
|
this.$reset;
|
||||||
this.is_open = false;
|
this.is_open = false;
|
||||||
this.is_btn_open = false;
|
this.is_btn_open = false;
|
||||||
|
|
||||||
|
const sidebar_scene = usePromoScene()
|
||||||
|
sidebar_scene.visible.map(el => {
|
||||||
|
el.is_enabled = (sidebar_scene._visible.find(item => item.id == el.id) ?? { is_enabled: true }).is_enabled
|
||||||
|
})
|
||||||
},
|
},
|
||||||
toggleAccordion(name: string, newState = null) {
|
toggleAccordion(name: string, newState = null) {
|
||||||
if (name == 'obj' && this.accordions.includes('clickable')) this.toggleAccordion('clickable')
|
if (name == 'obj' && this.accordions.includes('clickable')) this.toggleAccordion('clickable')
|
||||||
|
|
Loading…
Reference in New Issue