diff --git a/.vscode/PythonImportHelper-v2-Completion.json b/.vscode/PythonImportHelper-v2-Completion.json
index 5f77b9d..5980d5a 100644
--- a/.vscode/PythonImportHelper-v2-Completion.json
+++ b/.vscode/PythonImportHelper-v2-Completion.json
@@ -168,6 +168,30 @@
"detail": "django.db",
"documentation": {}
},
+ {
+ "label": "migrations",
+ "importPath": "django.db",
+ "description": "django.db",
+ "isExtraImport": true,
+ "detail": "django.db",
+ "documentation": {}
+ },
+ {
+ "label": "models",
+ "importPath": "django.db",
+ "description": "django.db",
+ "isExtraImport": true,
+ "detail": "django.db",
+ "documentation": {}
+ },
+ {
+ "label": "migrations",
+ "importPath": "django.db",
+ "description": "django.db",
+ "isExtraImport": true,
+ "detail": "django.db",
+ "documentation": {}
+ },
{
"label": "models",
"importPath": "django.db",
@@ -594,6 +618,23 @@
"detail": "object.models",
"documentation": {}
},
+ {
+ "label": "colorfield.fields",
+ "kind": 6,
+ "isExtraImport": true,
+ "importPath": "colorfield.fields",
+ "description": "colorfield.fields",
+ "detail": "colorfield.fields",
+ "documentation": {}
+ },
+ {
+ "label": "ColorField",
+ "importPath": "colorfield.fields",
+ "description": "colorfield.fields",
+ "isExtraImport": true,
+ "detail": "colorfield.fields",
+ "documentation": {}
+ },
{
"label": "Image",
"importPath": "PIL",
@@ -1177,12 +1218,30 @@
"detail": "back.object.migrations.0008_rename_can_disabled_element3d_can_not_disable",
"documentation": {}
},
+ {
+ "label": "Migration",
+ "kind": 6,
+ "importPath": "back.object.migrations.0009_environment_remove_scene3d_hdr_gainmap_and_more",
+ "description": "back.object.migrations.0009_environment_remove_scene3d_hdr_gainmap_and_more",
+ "peekOfCode": "class Migration(migrations.Migration):\n dependencies = [\n ('object', '0008_rename_can_disabled_element3d_can_not_disable'),\n ]\n operations = [\n migrations.CreateModel(\n name='Environment',\n fields=[\n ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),\n ('env_displacementmap', models.FileField(blank=True, null=True, upload_to=object.models.group_based_upload_to)),",
+ "detail": "back.object.migrations.0009_environment_remove_scene3d_hdr_gainmap_and_more",
+ "documentation": {}
+ },
+ {
+ "label": "Migration",
+ "kind": 6,
+ "importPath": "back.object.migrations.0010_environment_clear_color",
+ "description": "back.object.migrations.0010_environment_clear_color",
+ "peekOfCode": "class Migration(migrations.Migration):\n dependencies = [\n ('object', '0009_environment_remove_scene3d_hdr_gainmap_and_more'),\n ]\n operations = [\n migrations.AddField(\n model_name='environment',\n name='clear_color',\n field=colorfield.fields.ColorField(blank=True, default=None, image_field=None, max_length=25, null=True, samples=None),\n ),",
+ "detail": "back.object.migrations.0010_environment_clear_color",
+ "documentation": {}
+ },
{
"label": "Scene3DAdmin",
"kind": 6,
"importPath": "back.object.admin",
"description": "back.object.admin",
- "peekOfCode": "class Scene3DAdmin(admin.ModelAdmin):\n filter_horizontal = ('elements',)\nadmin.site.register(Scene3D, Scene3DAdmin)\nadmin.site.register(Element3D)\nadmin.site.register(ClickableArea)",
+ "peekOfCode": "class Scene3DAdmin(admin.ModelAdmin):\n filter_horizontal = (\"elements\",)\nadmin.site.register(Environment)\nadmin.site.register(Scene3D, Scene3DAdmin)\nadmin.site.register(Element3D)\nadmin.site.register(ClickableArea)",
"detail": "back.object.admin",
"documentation": {}
},
@@ -1195,6 +1254,15 @@
"detail": "back.object.apps",
"documentation": {}
},
+ {
+ "label": "Environment",
+ "kind": 6,
+ "importPath": "back.object.models",
+ "description": "back.object.models",
+ "peekOfCode": "class Environment(models.Model):\n env_displacementmap = models.FileField(\n upload_to=group_based_upload_to, blank=True, null=True\n )\n env_normalmap = models.FileField(\n upload_to=group_based_upload_to, blank=True, null=True\n )\n clear_color = ColorField(blank=True, null=True)\n hdr_gainmap = models.FileField(\n upload_to=group_based_upload_to, blank=True, null=True",
+ "detail": "back.object.models",
+ "documentation": {}
+ },
{
"label": "Element3D",
"kind": 6,
@@ -1209,7 +1277,7 @@
"kind": 6,
"importPath": "back.object.models",
"description": "back.object.models",
- "peekOfCode": "class Scene3D(models.Model):\n filter_horizontal = (\"elements\",)\n name = models.CharField(\n max_length=120,\n )\n elements = models.ManyToManyField(Element3D)\n min_distance = models.IntegerField(\n validators=[MinValueValidator(1), MaxValueValidator(600)], blank=True, null=True\n )\n max_distance = models.IntegerField(",
+ "peekOfCode": "class Scene3D(models.Model):\n name = models.CharField(max_length=120)\n elements = models.ManyToManyField(Element3D)\n env = models.ForeignKey(Environment, models.RESTRICT, blank=True, null=True)\n min_distance = models.IntegerField(\n default=10,\n validators=[MinValueValidator(1), MaxValueValidator(600)],\n )\n max_distance = models.IntegerField(\n default=20,",
"detail": "back.object.models",
"documentation": {}
},
@@ -1227,7 +1295,7 @@
"kind": 2,
"importPath": "back.object.models",
"description": "back.object.models",
- "peekOfCode": "def group_based_upload_to(instance, filename):\n logger.info(instance)\n return \"files/image/{}/{}/{}\".format(\n type(instance).__name__.lower(), instance.id, filename\n )\nclass Element3D(models.Model):\n parent = models.ForeignKey(\"self\", on_delete=models.PROTECT, blank=True, null=True)\n model_file = models.FileField(upload_to=group_based_upload_to)\n name = models.CharField(max_length=255)\n description = models.TextField(blank=True, null=True)",
+ "peekOfCode": "def group_based_upload_to(instance, filename):\n logger.info(instance)\n return \"files/image/{}/{}/{}\".format(\n type(instance).__name__.lower(), instance.id, filename\n )\nclass Environment(models.Model):\n env_displacementmap = models.FileField(\n upload_to=group_based_upload_to, blank=True, null=True\n )\n env_normalmap = models.FileField(",
"detail": "back.object.models",
"documentation": {}
},
@@ -1245,16 +1313,25 @@
"kind": 5,
"importPath": "back.object.models",
"description": "back.object.models",
- "peekOfCode": "logger = logging.getLogger(\"root\")\ndef group_based_upload_to(instance, filename):\n logger.info(instance)\n return \"files/image/{}/{}/{}\".format(\n type(instance).__name__.lower(), instance.id, filename\n )\nclass Element3D(models.Model):\n parent = models.ForeignKey(\"self\", on_delete=models.PROTECT, blank=True, null=True)\n model_file = models.FileField(upload_to=group_based_upload_to)\n name = models.CharField(max_length=255)",
+ "peekOfCode": "logger = logging.getLogger(\"root\")\ndef group_based_upload_to(instance, filename):\n logger.info(instance)\n return \"files/image/{}/{}/{}\".format(\n type(instance).__name__.lower(), instance.id, filename\n )\nclass Environment(models.Model):\n env_displacementmap = models.FileField(\n upload_to=group_based_upload_to, blank=True, null=True\n )",
"detail": "back.object.models",
"documentation": {}
},
+ {
+ "label": "EnvironmentSerializer",
+ "kind": 6,
+ "importPath": "back.object.serializers",
+ "description": "back.object.serializers",
+ "peekOfCode": "class EnvironmentSerializer(serializers.ModelSerializer):\n hdr_gainmap = serializers.FileField(use_url=False)\n hdr_json = serializers.FileField(use_url=False)\n hdr_webp = serializers.FileField(use_url=False)\n env_displacementmap = serializers.FileField(use_url=False)\n env_normalmap = serializers.FileField(use_url=False)\n class Meta:\n model = Environment\n fields = \"__all__\"\nclass Element3DSerializer(serializers.ModelSerializer):",
+ "detail": "back.object.serializers",
+ "documentation": {}
+ },
{
"label": "Element3DSerializer",
"kind": 6,
"importPath": "back.object.serializers",
"description": "back.object.serializers",
- "peekOfCode": "class Element3DSerializer(serializers.ModelSerializer):\n model_file = serializers.ImageField(use_url=False)\n class Meta:\n model = Element3D\n fields = \"__all__\"\nclass Scene3DSerializer(serializers.ModelSerializer):\n elements = Element3DSerializer(many=True)\n hdr_gainmap = serializers.FileField(use_url=False)\n hdr_json = serializers.FileField(use_url=False)\n hdr_webp = serializers.FileField(use_url=False)",
+ "peekOfCode": "class Element3DSerializer(serializers.ModelSerializer):\n model_file = serializers.ImageField(use_url=False)\n class Meta:\n model = Element3D\n fields = \"__all__\"\nclass Scene3DSerializer(serializers.ModelSerializer):\n elements = Element3DSerializer(many=True)\n env = EnvironmentSerializer()\n class Meta:\n model = Scene3D",
"detail": "back.object.serializers",
"documentation": {}
},
@@ -1263,7 +1340,7 @@
"kind": 6,
"importPath": "back.object.serializers",
"description": "back.object.serializers",
- "peekOfCode": "class Scene3DSerializer(serializers.ModelSerializer):\n elements = Element3DSerializer(many=True)\n hdr_gainmap = serializers.FileField(use_url=False)\n hdr_json = serializers.FileField(use_url=False)\n hdr_webp = serializers.FileField(use_url=False)\n class Meta:\n model = Scene3D\n fields = \"__all__\"\n depth = 2\nclass ClickableAreaSerializer(serializers.ModelSerializer):",
+ "peekOfCode": "class Scene3DSerializer(serializers.ModelSerializer):\n elements = Element3DSerializer(many=True)\n env = EnvironmentSerializer()\n class Meta:\n model = Scene3D\n fields = \"__all__\"\n depth = 2\nclass ClickableAreaSerializer(serializers.ModelSerializer):\n image = serializers.ImageField(use_url=False)\n class Meta:",
"detail": "back.object.serializers",
"documentation": {}
},
diff --git a/back/back/settings.py b/back/back/settings.py
index 302a8ee..5e0483b 100644
--- a/back/back/settings.py
+++ b/back/back/settings.py
@@ -83,6 +83,7 @@ INSTALLED_APPS = [
"rest_framework",
"crispy_forms",
"crispy_bootstrap4",
+ "colorfield",
"api",
"frontImages",
"object",
diff --git a/back/object/admin.py b/back/object/admin.py
index 1147257..1bad528 100644
--- a/back/object/admin.py
+++ b/back/object/admin.py
@@ -1,9 +1,12 @@
from django.contrib import admin
-from .models import ClickableArea, Element3D, Scene3D
+from .models import ClickableArea, Element3D, Environment, Scene3D
+
class Scene3DAdmin(admin.ModelAdmin):
- filter_horizontal = ('elements',)
+ filter_horizontal = ("elements",)
+
+admin.site.register(Environment)
admin.site.register(Scene3D, Scene3DAdmin)
admin.site.register(Element3D)
-admin.site.register(ClickableArea)
\ No newline at end of file
+admin.site.register(ClickableArea)
diff --git a/back/object/models.py b/back/object/models.py
index b49e3d5..1eadce1 100644
--- a/back/object/models.py
+++ b/back/object/models.py
@@ -2,6 +2,7 @@ from PIL import Image
from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator
from django.core.exceptions import ValidationError
+from colorfield.fields import ColorField
import logging
logger = logging.getLogger("root")
@@ -14,6 +15,21 @@ def group_based_upload_to(instance, filename):
)
+class Environment(models.Model):
+ env_displacementmap = models.FileField(
+ upload_to=group_based_upload_to, blank=True, null=True
+ )
+ env_normalmap = models.FileField(
+ upload_to=group_based_upload_to, blank=True, null=True
+ )
+ clear_color = ColorField(blank=True, null=True)
+ hdr_gainmap = models.FileField(
+ upload_to=group_based_upload_to, blank=True, null=True
+ )
+ hdr_json = models.FileField(upload_to=group_based_upload_to, blank=True, null=True)
+ hdr_webp = models.FileField(upload_to=group_based_upload_to, blank=True, null=True)
+
+
class Element3D(models.Model):
parent = models.ForeignKey("self", on_delete=models.PROTECT, blank=True, null=True)
model_file = models.FileField(upload_to=group_based_upload_to)
@@ -27,27 +43,19 @@ class Element3D(models.Model):
class Scene3D(models.Model):
- filter_horizontal = ("elements",)
- name = models.CharField(
- max_length=120,
- )
+ name = models.CharField(max_length=120)
elements = models.ManyToManyField(Element3D)
+ env = models.ForeignKey(Environment, models.RESTRICT, blank=True, null=True)
min_distance = models.IntegerField(
- validators=[MinValueValidator(1), MaxValueValidator(600)], blank=True, null=True
+ default=10,
+ validators=[MinValueValidator(1), MaxValueValidator(600)],
)
max_distance = models.IntegerField(
+ default=20,
validators=[MinValueValidator(2), MaxValueValidator(1000)],
- blank=True,
- null=True,
)
- hdr_gainmap = models.FileField(
- upload_to=group_based_upload_to, blank=True, null=True
- )
- hdr_json = models.FileField(upload_to=group_based_upload_to, blank=True, null=True)
- hdr_webp = models.FileField(upload_to=group_based_upload_to, blank=True, null=True)
-
def __str__(self):
return self.name
diff --git a/back/object/serializers.py b/back/object/serializers.py
index c9e2e1f..ec50e36 100644
--- a/back/object/serializers.py
+++ b/back/object/serializers.py
@@ -1,5 +1,17 @@
from rest_framework import serializers
-from .models import Scene3D, Element3D, ClickableArea
+from .models import Scene3D, Element3D, ClickableArea, Environment
+
+
+class EnvironmentSerializer(serializers.ModelSerializer):
+ hdr_gainmap = serializers.FileField(use_url=False)
+ hdr_json = serializers.FileField(use_url=False)
+ hdr_webp = serializers.FileField(use_url=False)
+ env_displacementmap = serializers.FileField(use_url=False)
+ env_normalmap = serializers.FileField(use_url=False)
+
+ class Meta:
+ model = Environment
+ fields = "__all__"
class Element3DSerializer(serializers.ModelSerializer):
@@ -12,9 +24,7 @@ class Element3DSerializer(serializers.ModelSerializer):
class Scene3DSerializer(serializers.ModelSerializer):
elements = Element3DSerializer(many=True)
- hdr_gainmap = serializers.FileField(use_url=False)
- hdr_json = serializers.FileField(use_url=False)
- hdr_webp = serializers.FileField(use_url=False)
+ env = EnvironmentSerializer()
class Meta:
model = Scene3D
diff --git a/back/requirements.txt b/back/requirements.txt
index 719a572..7cbd2ab 100644
--- a/back/requirements.txt
+++ b/back/requirements.txt
@@ -1,6 +1,7 @@
asgiref==3.8.1 ; python_version >= "3.10" and python_version < "4.0"
colorama==0.4.6 ; python_version >= "3.10" and python_version < "4.0"
crispy-bootstrap4==2024.1 ; python_version >= "3.10" and python_version < "4.0"
+django-colorfield==0.11.0 ; python_version >= "3.10" and python_version < "4.0"
django-cors-headers==4.3.1 ; python_version >= "3.10" and python_version < "4.0"
django-crispy-forms==2.2 ; python_version >= "3.10" and python_version < "4.0"
django-extensions==3.2.3 ; python_version >= "3.10" and python_version < "4.0"
diff --git a/front/public/download.png b/front/public/download.png
new file mode 100644
index 0000000..5f806d8
Binary files /dev/null and b/front/public/download.png differ
diff --git a/front/public/ground_displacement.jpg b/front/public/ground_displacement.jpg
new file mode 100644
index 0000000..a99db5f
Binary files /dev/null and b/front/public/ground_displacement.jpg differ
diff --git a/front/public/picture_02.jpg b/front/public/picture_02.jpg
new file mode 100644
index 0000000..af42be2
Binary files /dev/null and b/front/public/picture_02.jpg differ
diff --git a/front/src/components/Promo/env.vue b/front/src/components/Promo/env.vue
index 90d9ebf..df3e8d8 100644
--- a/front/src/components/Promo/env.vue
+++ b/front/src/components/Promo/env.vue
@@ -1,35 +1,53 @@
\ No newline at end of file
diff --git a/front/src/components/Promo/load_models.vue b/front/src/components/Promo/load_models.vue
index 8c2ea1f..7077fd1 100644
--- a/front/src/components/Promo/load_models.vue
+++ b/front/src/components/Promo/load_models.vue
@@ -1,21 +1,22 @@
-
+
+
-
+
-
-
-
-
-
diff --git a/front/src/components/Promo/post_pocessing.vue b/front/src/components/Promo/post_pocessing.vue
index a5d5c45..1314378 100644
--- a/front/src/components/Promo/post_pocessing.vue
+++ b/front/src/components/Promo/post_pocessing.vue
@@ -8,53 +8,39 @@ import { OutputPass } from 'three/addons/postprocessing/OutputPass.js';
import { useTresContext, useLoop } from '@tresjs/core';
import { watch } from 'vue';
-import { Fog, FogExp2 } from 'three';
+import { Color, Fog } from 'three';
const { renderer, camera, scene } = useTresContext()
const composer = new EffectComposer(renderer.value);
-const props = defineProps(['tiltShift', 'clearColor'])
-const k = { start: 0.25, end: 3 }
+const props = defineProps(['tiltShift'])
+const k = { start: 0.5, end: 2.5 }
-if (camera.value) {
- const renderPass = new RenderPass(scene.value, camera.value);
+const makePostProcess = () => {
+ if (camera.value) {
+ const renderPass = new RenderPass(scene.value, camera.value);
- const bokehPass = new BokehPass(scene.value, camera.value, {
- focus: props.tiltShift.focus,
- aperture: (props.tiltShift.aperture) * 0.00001,
- maxblur: (props.tiltShift.maxblur) * 0.01
- });
+ const bokehPass = new BokehPass(scene.value, camera.value, {
+ focus: props.tiltShift.focus,
+ aperture: (props.tiltShift.aperture) * 0.00001,
+ maxblur: (props.tiltShift.maxblur) * 0.01
+ });
+ const outputPass = new OutputPass();
+ // composer.addPass(renderPass);
+ // composer.addPass(bokehPass);
+ // composer.addPass(outputPass);
- const outputPass = new OutputPass();
- composer.addPass(renderPass);
- composer.addPass(bokehPass);
- composer.addPass(outputPass);
-
- // scene.value.fog = new FogExp2(0xff0000, 0.005)
- scene.value.fog = new Fog(props.clearColor, props.tiltShift.focus * k.start, props.tiltShift.focus * k.end)
+ const c = new Color()
+ renderer.value.getClearColor(c)
+ scene.value.fog = new Fog(c, props.tiltShift.focus * k.start, props.tiltShift.focus * k.end)
+ }
}
+makePostProcess()
const { onAfterRender } = useLoop()
onAfterRender(() => {
- composer.render()
+ // composer.render()
})
-watch(props.tiltShift, () => {
- if (camera.value) {
- const args = {
- focus: props.tiltShift.focus,
- aperture: props.tiltShift.aperture * 0.00001,
- maxblur: props.tiltShift.maxblur * 0.01
- }
- const bokehPass = new BokehPass(scene.value, camera.value, args);
- composer.passes = []
- const renderPass = new RenderPass(scene.value, camera.value);
- const outputPass = new OutputPass();
- composer.addPass(renderPass);
- composer.addPass(bokehPass);
- composer.addPass(outputPass);
-
- scene.value.fog = new Fog(props.clearColor, props.tiltShift.focus * k.start, props.tiltShift.focus * k.end)
- }
-}, { deep: true })
+watch(props.tiltShift, makePostProcess, { deep: true })
\ No newline at end of file
diff --git a/front/src/constants.ts b/front/src/constants.ts
index 66ca418..8ab2172 100644
--- a/front/src/constants.ts
+++ b/front/src/constants.ts
@@ -1,2 +1,4 @@
export const SERVER_URL = import.meta.env.VITE_SERVER_URL ?? window.location.origin
-export const IMAGE_URL = import.meta.env.VITE_IMAGE_URL ?? window.location.origin
\ No newline at end of file
+export const IMAGE_URL = import.meta.env.VITE_IMAGE_URL ?? window.location.origin
+
+export const PROMOBG='#ccc'
\ No newline at end of file
diff --git a/front/src/index.d.ts b/front/src/index.d.ts
index 54b8533..3630fd5 100644
--- a/front/src/index.d.ts
+++ b/front/src/index.d.ts
@@ -14,10 +14,15 @@ interface scene3D {
name: string
min_distance: number
max_distance: number
- hdr_gainmap?: string
- hdr_json?: string
- hdr_webp?: string
elements: element3DType[]
+ env: {
+ hdr_gainmap?: string
+ hdr_json?: string
+ hdr_webp?: string
+ env_displacementmap?: string
+ env_normalmap?: string
+ clear_color?: string
+ }
}
interface element3DType {
id: number
diff --git a/poetry.lock b/poetry.lock
index 17abaf2..d609394 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -63,6 +63,20 @@ tzdata = {version = "*", markers = "sys_platform == \"win32\""}
argon2 = ["argon2-cffi (>=19.1.0)"]
bcrypt = ["bcrypt"]
+[[package]]
+name = "django-colorfield"
+version = "0.11.0"
+description = "color field for django models with a nice color-picker in the admin."
+optional = false
+python-versions = "*"
+files = [
+ {file = "django-colorfield-0.11.0.tar.gz", hash = "sha256:05c38c8eb2a94938b810a19b2011846391a4ce71d1c92e88a35974fbcc8fc62e"},
+ {file = "django_colorfield-0.11.0-py3-none-any.whl", hash = "sha256:460f40e6123b6ae0fb51a4eb86fc258fcdc0ea28f75102b685e8209b1eae9ec3"},
+]
+
+[package.dependencies]
+Pillow = ">=9.0.0"
+
[[package]]
name = "django-cors-headers"
version = "4.3.1"
@@ -449,4 +463,4 @@ files = [
[metadata]
lock-version = "2.0"
python-versions = "^3.10"
-content-hash = "be85620e01baf8ceb925bd6fe9283c50da4fc1a97d9f572b92266adb0f44c124"
+content-hash = "6b760d833dfd807526e05ba86e0e6cddb82ee47ec315f4a51d469aecfd1534e4"
diff --git a/pyproject.toml b/pyproject.toml
index 6e5be20..80cdd9d 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -21,6 +21,7 @@ django-filter = "^24.2"
django-crispy-forms = "^2.2"
crispy-bootstrap4 = "^2024.1"
django-extensions = "^3.2.3"
+django-colorfield = "^0.11.0"
[build-system]