Upload 212 files
Browse files- .gitattributes +3 -0
- backend/logs/app.log +105 -0
- backend/routers/__pycache__/catalog.cpython-312.pyc +0 -0
- backend/routers/catalog.py +19 -0
- backend/services/__pycache__/texture_service.cpython-312.pyc +0 -0
- backend/services/texture_service.py +14 -51
- backend/texturas/Texture_WPC_DECK/DECK_gris.png +3 -0
- backend/texturas/Texture_WPC_DECK/DECK_madera.png +3 -0
- backend/texturas/Texture_WPC_DECK/DECK_madera_oscuro.png +3 -0
- frontend/src/version.ts +1 -1
.gitattributes
CHANGED
|
@@ -153,3 +153,6 @@ backend/texturas/Texture_WPC_EXTERIOR_INTERIOR/WPC_madera_claro.png filter=lfs d
|
|
| 153 |
backend/texturas/Texture_WPC_EXTERIOR_INTERIOR/WPC_madera_gris.png filter=lfs diff=lfs merge=lfs -text
|
| 154 |
backend/texturas/Texture_WPC_EXTERIOR_INTERIOR/WPC_madera_oscuro.png filter=lfs diff=lfs merge=lfs -text
|
| 155 |
backend/texturas/Texture_WPC_EXTERIOR_INTERIOR/WPC_negro.png filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
| 153 |
backend/texturas/Texture_WPC_EXTERIOR_INTERIOR/WPC_madera_gris.png filter=lfs diff=lfs merge=lfs -text
|
| 154 |
backend/texturas/Texture_WPC_EXTERIOR_INTERIOR/WPC_madera_oscuro.png filter=lfs diff=lfs merge=lfs -text
|
| 155 |
backend/texturas/Texture_WPC_EXTERIOR_INTERIOR/WPC_negro.png filter=lfs diff=lfs merge=lfs -text
|
| 156 |
+
backend/texturas/Texture_WPC_DECK/DECK_gris.png filter=lfs diff=lfs merge=lfs -text
|
| 157 |
+
backend/texturas/Texture_WPC_DECK/DECK_madera_oscuro.png filter=lfs diff=lfs merge=lfs -text
|
| 158 |
+
backend/texturas/Texture_WPC_DECK/DECK_madera.png filter=lfs diff=lfs merge=lfs -text
|
backend/logs/app.log
CHANGED
|
@@ -2510,3 +2510,108 @@ RuntimeError: Both Gradio Spaces failed.
|
|
| 2510 |
2026-05-07 18:23:19,455 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.535s at 2026-05-08T00:23:19.455089+00:00
|
| 2511 |
2026-05-07 18:23:32,434 INFO pymongo.serverSelection: {"message": "Waiting for suitable server to become available", "selector": "Primary()", "operation": "find", "topologyDescription": "<TopologyDescription id: 69fd2d0461ddd2197e4f4ad4, topology_type: ReplicaSetNoPrimary, servers: [<ServerDescription ('ac-tynjizz-shard-00-00.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>, <ServerDescription ('ac-tynjizz-shard-00-01.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>, <ServerDescription ('ac-tynjizz-shard-00-02.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>]>", "clientId": {"$oid": "69fd2d0461ddd2197e4f4ad4"}, "remainingTimeMS": 30}
|
| 2512 |
2026-05-07 18:23:32,438 INFO pymongo.serverSelection: {"message": "Waiting for suitable server to become available", "selector": "Primary()", "operation": "find", "topologyDescription": "<TopologyDescription id: 69fd2d0461ddd2197e4f4ad4, topology_type: ReplicaSetNoPrimary, servers: [<ServerDescription ('ac-tynjizz-shard-00-00.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>, <ServerDescription ('ac-tynjizz-shard-00-01.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>, <ServerDescription ('ac-tynjizz-shard-00-02.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>]>", "clientId": {"$oid": "69fd2d0461ddd2197e4f4ad4"}, "remainingTimeMS": 30}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2510 |
2026-05-07 18:23:19,455 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.535s at 2026-05-08T00:23:19.455089+00:00
|
| 2511 |
2026-05-07 18:23:32,434 INFO pymongo.serverSelection: {"message": "Waiting for suitable server to become available", "selector": "Primary()", "operation": "find", "topologyDescription": "<TopologyDescription id: 69fd2d0461ddd2197e4f4ad4, topology_type: ReplicaSetNoPrimary, servers: [<ServerDescription ('ac-tynjizz-shard-00-00.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>, <ServerDescription ('ac-tynjizz-shard-00-01.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>, <ServerDescription ('ac-tynjizz-shard-00-02.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>]>", "clientId": {"$oid": "69fd2d0461ddd2197e4f4ad4"}, "remainingTimeMS": 30}
|
| 2512 |
2026-05-07 18:23:32,438 INFO pymongo.serverSelection: {"message": "Waiting for suitable server to become available", "selector": "Primary()", "operation": "find", "topologyDescription": "<TopologyDescription id: 69fd2d0461ddd2197e4f4ad4, topology_type: ReplicaSetNoPrimary, servers: [<ServerDescription ('ac-tynjizz-shard-00-00.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>, <ServerDescription ('ac-tynjizz-shard-00-01.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>, <ServerDescription ('ac-tynjizz-shard-00-02.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>]>", "clientId": {"$oid": "69fd2d0461ddd2197e4f4ad4"}, "remainingTimeMS": 30}
|
| 2513 |
+
2026-05-08 08:43:50,985 INFO backend.segmentation: [STARTUP] GRADIO_SPACE_URL=https://eduardo4547-hyper-reality-sam2-gpu.hf.space
|
| 2514 |
+
2026-05-08 08:43:51,012 INFO backend.segmentation: [LIFESPAN] GRADIO_SPACE_URL set — skipping local SAM2 load.
|
| 2515 |
+
2026-05-08 08:51:57,553 INFO backend.segmentation: [STARTUP] GRADIO_SPACE_URL=https://eduardo4547-hyper-reality-sam2-gpu.hf.space
|
| 2516 |
+
2026-05-08 08:51:57,570 INFO backend.segmentation: [LIFESPAN] GRADIO_SPACE_URL set — skipping local SAM2 load.
|
| 2517 |
+
2026-05-08 08:52:05,523 INFO pymongo.serverSelection: {"message": "Waiting for suitable server to become available", "selector": "Primary()", "operation": "find", "topologyDescription": "<TopologyDescription id: 69fdf8956fe8a54546e7c788, topology_type: ReplicaSetNoPrimary, servers: [<ServerDescription ('ac-tynjizz-shard-00-00.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>, <ServerDescription ('ac-tynjizz-shard-00-01.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>, <ServerDescription ('ac-tynjizz-shard-00-02.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>]>", "clientId": {"$oid": "69fdf8956fe8a54546e7c788"}, "remainingTimeMS": 30}
|
| 2518 |
+
2026-05-08 08:52:28,781 INFO backend.segmentation: [UPLOAD_BG] START at 2026-05-08T14:52:28.781286+00:00
|
| 2519 |
+
2026-05-08 08:52:28,783 INFO backend.segmentation: [JOB c4b00bfba3cd41d8a99b995eb5a3f820] preparing_image progress=12
|
| 2520 |
+
2026-05-08 08:52:28,924 INFO backend.segmentation: [JOB c4b00bfba3cd41d8a99b995eb5a3f820] segmenting_with_sam2 progress=30 estimated_seconds=58.39104
|
| 2521 |
+
2026-05-08 08:52:28,925 INFO services.gradio_client_service: Calling GPU Gradio Space: https://eduardo4547-hyper-reality-sam2-gpu.hf.space
|
| 2522 |
+
2026-05-08 08:52:31,787 INFO httpx: HTTP Request: GET https://eduardo4547-hyper-reality-sam2-gpu.hf.space/config "HTTP/1.1 200 OK"
|
| 2523 |
+
2026-05-08 08:52:32,342 INFO httpx: HTTP Request: GET https://eduardo4547-hyper-reality-sam2-gpu.hf.space/gradio_api/info?serialize=False "HTTP/1.1 200 OK"
|
| 2524 |
+
2026-05-08 08:52:32,963 INFO httpx: HTTP Request: HEAD https://huggingface.co/api/telemetry/py_client/initiated "HTTP/1.1 200 OK"
|
| 2525 |
+
2026-05-08 08:52:33,084 INFO httpx: HTTP Request: GET https://eduardo4547-hyper-reality-sam2-gpu.hf.space/gradio_api/heartbeat/10657327-6236-4afa-91e1-25f259cc9a15 "HTTP/1.1 200 OK"
|
| 2526 |
+
2026-05-08 08:52:33,241 INFO httpx: HTTP Request: POST https://eduardo4547-hyper-reality-sam2-gpu.hf.space/gradio_api/upload "HTTP/1.1 200 OK"
|
| 2527 |
+
2026-05-08 08:52:33,773 INFO httpx: HTTP Request: POST https://eduardo4547-hyper-reality-sam2-gpu.hf.space/gradio_api/queue/join "HTTP/1.1 200 OK"
|
| 2528 |
+
2026-05-08 08:52:34,439 INFO httpx: HTTP Request: GET https://eduardo4547-hyper-reality-sam2-gpu.hf.space/gradio_api/queue/data?session_hash=10657327-6236-4afa-91e1-25f259cc9a15 "HTTP/1.1 200 OK"
|
| 2529 |
+
2026-05-08 08:52:53,788 INFO httpx: HTTP Request: GET https://eduardo4547-hyper-reality-sam2-gpu.hf.space/gradio_api/file=/tmp/gradio/1ee1c9088fcbba7f467623e6851741770894d9f669f8b560de748311e8fd868e/image.webp "HTTP/1.1 200 OK"
|
| 2530 |
+
2026-05-08 08:52:53,901 INFO services.gradio_client_service: Gradio Space segmentation: entorno=gpu motor=SAM Auto (GPU - ZeroGPU) mask_count=63
|
| 2531 |
+
2026-05-08 08:52:53,901 INFO backend.segmentation: [JOB c4b00bfba3cd41d8a99b995eb5a3f820] saving_masks progress=92
|
| 2532 |
+
2026-05-08 08:52:54,078 INFO backend.segmentation: [JOB c4b00bfba3cd41d8a99b995eb5a3f820] segments_meta saved (63 segments)
|
| 2533 |
+
2026-05-08 08:52:54,078 INFO backend.segmentation: [JOB c4b00bfba3cd41d8a99b995eb5a3f820] done mask_count=63
|
| 2534 |
+
2026-05-08 08:52:54,079 INFO backend.segmentation: [UPLOAD_BG] DONE 25.297s at 2026-05-08T14:52:54.079206+00:00
|
| 2535 |
+
2026-05-08 08:52:54,079 INFO backend.segmentation: Releasing resources (full_unload=False)
|
| 2536 |
+
2026-05-08 08:52:56,515 INFO pymongo.serverSelection: {"message": "Waiting for suitable server to become available", "selector": "Primary()", "operation": "find", "topologyDescription": "<TopologyDescription id: 69fdf8c86fe8a54546e7c789, topology_type: ReplicaSetNoPrimary, servers: [<ServerDescription ('ac-tynjizz-shard-00-00.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>, <ServerDescription ('ac-tynjizz-shard-00-01.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>, <ServerDescription ('ac-tynjizz-shard-00-02.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>]>", "clientId": {"$oid": "69fdf8c86fe8a54546e7c789"}, "remainingTimeMS": 30}
|
| 2537 |
+
2026-05-08 08:53:03,328 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T14:53:03.328974+00:00
|
| 2538 |
+
2026-05-08 08:53:03,423 INFO backend.segmentation: [APPLY_TEXTURE] perspective wall tiling applied (w_ratio=2.27, h_ratio=1.02)
|
| 2539 |
+
2026-05-08 08:53:03,443 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2540 |
+
2026-05-08 08:53:03,763 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.435s at 2026-05-08T14:53:03.763882+00:00
|
| 2541 |
+
2026-05-08 08:54:39,084 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T14:54:39.084466+00:00
|
| 2542 |
+
2026-05-08 08:54:39,183 INFO backend.segmentation: [APPLY_TEXTURE] perspective wall tiling applied (w_ratio=1.39, h_ratio=1.19)
|
| 2543 |
+
2026-05-08 08:54:39,211 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2544 |
+
2026-05-08 08:54:39,457 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.373s at 2026-05-08T14:54:39.457395+00:00
|
| 2545 |
+
2026-05-08 08:59:40,007 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T14:59:40.007652+00:00
|
| 2546 |
+
2026-05-08 08:59:40,151 INFO backend.segmentation: [APPLY_TEXTURE] perspective wall tiling applied (w_ratio=2.27, h_ratio=1.02)
|
| 2547 |
+
2026-05-08 08:59:40,169 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2548 |
+
2026-05-08 08:59:40,385 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.378s at 2026-05-08T14:59:40.385462+00:00
|
| 2549 |
+
2026-05-08 08:59:42,685 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T14:59:42.685637+00:00
|
| 2550 |
+
2026-05-08 08:59:42,813 INFO backend.segmentation: [APPLY_TEXTURE] perspective wall tiling applied (w_ratio=2.27, h_ratio=1.02)
|
| 2551 |
+
2026-05-08 08:59:42,832 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2552 |
+
2026-05-08 08:59:43,046 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.361s at 2026-05-08T14:59:43.046868+00:00
|
| 2553 |
+
2026-05-08 08:59:49,536 INFO backend.segmentation: [STARTUP] GRADIO_SPACE_URL=https://eduardo4547-hyper-reality-sam2-gpu.hf.space
|
| 2554 |
+
2026-05-08 08:59:49,552 INFO backend.segmentation: [LIFESPAN] GRADIO_SPACE_URL set — skipping local SAM2 load.
|
| 2555 |
+
2026-05-08 08:59:50,331 INFO backend.segmentation: [STARTUP] GRADIO_SPACE_URL=https://eduardo4547-hyper-reality-sam2-gpu.hf.space
|
| 2556 |
+
2026-05-08 08:59:50,348 INFO backend.segmentation: [LIFESPAN] GRADIO_SPACE_URL set — skipping local SAM2 load.
|
| 2557 |
+
2026-05-08 09:00:00,500 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T15:00:00.500104+00:00
|
| 2558 |
+
2026-05-08 09:00:00,618 INFO backend.segmentation: [APPLY_TEXTURE] perspective wall tiling applied (w_ratio=1.39, h_ratio=1.19)
|
| 2559 |
+
2026-05-08 09:00:00,637 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2560 |
+
2026-05-08 09:00:00,990 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.490s at 2026-05-08T15:00:00.990494+00:00
|
| 2561 |
+
2026-05-08 09:00:03,599 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T15:00:03.599883+00:00
|
| 2562 |
+
2026-05-08 09:00:03,681 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2563 |
+
2026-05-08 09:00:03,924 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.324s at 2026-05-08T15:00:03.924300+00:00
|
| 2564 |
+
2026-05-08 09:00:06,073 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T15:00:06.073364+00:00
|
| 2565 |
+
2026-05-08 09:00:06,149 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2566 |
+
2026-05-08 09:00:06,389 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.317s at 2026-05-08T15:00:06.389848+00:00
|
| 2567 |
+
2026-05-08 09:00:08,614 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T15:00:08.614656+00:00
|
| 2568 |
+
2026-05-08 09:00:08,694 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2569 |
+
2026-05-08 09:00:08,933 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.319s at 2026-05-08T15:00:08.933579+00:00
|
| 2570 |
+
2026-05-08 09:00:15,087 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T15:00:15.087928+00:00
|
| 2571 |
+
2026-05-08 09:00:15,193 INFO backend.segmentation: [APPLY_TEXTURE] perspective wall tiling applied (w_ratio=2.27, h_ratio=1.02)
|
| 2572 |
+
2026-05-08 09:00:15,214 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2573 |
+
2026-05-08 09:00:15,452 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.364s at 2026-05-08T15:00:15.452128+00:00
|
| 2574 |
+
2026-05-08 09:00:19,768 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T15:00:19.768251+00:00
|
| 2575 |
+
2026-05-08 09:00:20,270 INFO backend.segmentation: [APPLY_TEXTURE] perspective wall tiling applied (w_ratio=2.27, h_ratio=1.02)
|
| 2576 |
+
2026-05-08 09:00:20,289 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2577 |
+
2026-05-08 09:00:20,508 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.740s at 2026-05-08T15:00:20.508968+00:00
|
| 2578 |
+
2026-05-08 09:01:38,338 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T15:01:38.338166+00:00
|
| 2579 |
+
2026-05-08 09:01:38,895 INFO backend.segmentation: [APPLY_TEXTURE] perspective wall tiling applied (w_ratio=1.39, h_ratio=1.19)
|
| 2580 |
+
2026-05-08 09:01:38,915 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2581 |
+
2026-05-08 09:01:39,112 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.774s at 2026-05-08T15:01:39.112500+00:00
|
| 2582 |
+
2026-05-08 09:01:42,636 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T15:01:42.636107+00:00
|
| 2583 |
+
2026-05-08 09:01:42,973 INFO backend.segmentation: [APPLY_TEXTURE] perspective wall tiling applied (w_ratio=2.27, h_ratio=1.02)
|
| 2584 |
+
2026-05-08 09:01:42,992 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2585 |
+
2026-05-08 09:01:43,212 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.577s at 2026-05-08T15:01:43.212843+00:00
|
| 2586 |
+
2026-05-08 09:01:45,698 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T15:01:45.698783+00:00
|
| 2587 |
+
2026-05-08 09:01:46,444 INFO backend.segmentation: [APPLY_TEXTURE] perspective wall tiling applied (w_ratio=2.27, h_ratio=1.02)
|
| 2588 |
+
2026-05-08 09:01:46,465 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2589 |
+
2026-05-08 09:01:46,680 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.982s at 2026-05-08T15:01:46.680378+00:00
|
| 2590 |
+
2026-05-08 09:01:50,327 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T15:01:50.326916+00:00
|
| 2591 |
+
2026-05-08 09:01:50,647 INFO backend.segmentation: [APPLY_TEXTURE] perspective wall tiling applied (w_ratio=2.27, h_ratio=1.02)
|
| 2592 |
+
2026-05-08 09:01:50,666 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2593 |
+
2026-05-08 09:01:50,880 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.552s at 2026-05-08T15:01:50.879093+00:00
|
| 2594 |
+
2026-05-08 09:01:57,091 INFO backend.segmentation: [STARTUP] GRADIO_SPACE_URL=https://eduardo4547-hyper-reality-sam2-gpu.hf.space
|
| 2595 |
+
2026-05-08 09:01:57,117 INFO backend.segmentation: [LIFESPAN] GRADIO_SPACE_URL set — skipping local SAM2 load.
|
| 2596 |
+
2026-05-08 09:01:57,294 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T15:01:57.294276+00:00
|
| 2597 |
+
2026-05-08 09:01:57,340 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2598 |
+
2026-05-08 09:01:57,569 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.275s at 2026-05-08T15:01:57.569889+00:00
|
| 2599 |
+
2026-05-08 09:02:01,866 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T15:02:01.866951+00:00
|
| 2600 |
+
2026-05-08 09:02:01,933 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2601 |
+
2026-05-08 09:02:02,153 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.287s at 2026-05-08T15:02:02.153188+00:00
|
| 2602 |
+
2026-05-08 09:02:04,075 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T15:02:04.075842+00:00
|
| 2603 |
+
2026-05-08 09:02:04,140 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2604 |
+
2026-05-08 09:02:04,356 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.280s at 2026-05-08T15:02:04.356528+00:00
|
| 2605 |
+
2026-05-08 09:02:07,755 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T15:02:07.755321+00:00
|
| 2606 |
+
2026-05-08 09:02:07,822 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2607 |
+
2026-05-08 09:02:08,037 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.282s at 2026-05-08T15:02:08.037106+00:00
|
| 2608 |
+
2026-05-08 09:02:11,723 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T15:02:11.723542+00:00
|
| 2609 |
+
2026-05-08 09:02:11,786 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2610 |
+
2026-05-08 09:02:12,003 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.280s at 2026-05-08T15:02:12.003104+00:00
|
| 2611 |
+
2026-05-08 09:02:13,461 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T15:02:13.461067+00:00
|
| 2612 |
+
2026-05-08 09:02:13,526 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2613 |
+
2026-05-08 09:02:13,743 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.283s at 2026-05-08T15:02:13.743819+00:00
|
| 2614 |
+
2026-05-08 09:02:17,645 INFO backend.segmentation: [APPLY_TEXTURE] START at 2026-05-08T15:02:17.645808+00:00
|
| 2615 |
+
2026-05-08 09:02:17,709 INFO backend.segmentation: [APPLY_TEXTURE] cleared mask from original source: C:\Users\alane\OneDrive\Escritorio\Trabajo\Prueba-PoC\backend\uploads\WhatsApp Image 2026-05-06 at 18.47.21.jpg
|
| 2616 |
+
2026-05-08 09:02:17,928 INFO backend.segmentation: [APPLY_TEXTURE] DONE 0.283s at 2026-05-08T15:02:17.928622+00:00
|
| 2617 |
+
2026-05-08 09:02:22,278 INFO pymongo.serverSelection: {"message": "Waiting for suitable server to become available", "selector": "Primary()", "operation": "find", "topologyDescription": "<TopologyDescription id: 69fdfafe6c3fdb5646f67bd7, topology_type: ReplicaSetNoPrimary, servers: [<ServerDescription ('ac-tynjizz-shard-00-00.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>, <ServerDescription ('ac-tynjizz-shard-00-01.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>, <ServerDescription ('ac-tynjizz-shard-00-02.n9htwoa.mongodb.net', 27017) server_type: Unknown, rtt: None>]>", "clientId": {"$oid": "69fdfafe6c3fdb5646f67bd7"}, "remainingTimeMS": 30}
|
backend/routers/__pycache__/catalog.cpython-312.pyc
CHANGED
|
Binary files a/backend/routers/__pycache__/catalog.cpython-312.pyc and b/backend/routers/__pycache__/catalog.cpython-312.pyc differ
|
|
|
backend/routers/catalog.py
CHANGED
|
@@ -81,6 +81,25 @@ _SEED = [
|
|
| 81 |
],
|
| 82 |
"created_at": "2026-05-07T00:00:00Z",
|
| 83 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
]
|
| 85 |
|
| 86 |
|
|
|
|
| 81 |
],
|
| 82 |
"created_at": "2026-05-07T00:00:00Z",
|
| 83 |
},
|
| 84 |
+
{
|
| 85 |
+
"_id": "wpc_deck",
|
| 86 |
+
"nombre": "WPC Deck",
|
| 87 |
+
"tipo": "suelos",
|
| 88 |
+
"descripcion": "Deck de WPC para exteriores e interiores. Ideal para terrazas, jardines, bordes de piscina y espacios al aire libre.",
|
| 89 |
+
"especificaciones": [
|
| 90 |
+
"Resistencia a la intemperie.",
|
| 91 |
+
"Bajo mantenimiento.",
|
| 92 |
+
"Respetuosa con el medio ambiente.",
|
| 93 |
+
"Esteticamente agradable.",
|
| 94 |
+
],
|
| 95 |
+
"url_detalle": "https://heyzine.com/flip-book/447fe3eb8e.html#page/38",
|
| 96 |
+
"productos": [
|
| 97 |
+
{"id": "DECK_madera", "nombre": "Deck Madera", "textura": "Texture_wpc_deck/DECK_madera.png", "url_preview": "/seg/texture-preview/Texture_wpc_deck/DECK_madera.png", "dimensiones": ["2.90x0.14"]},
|
| 98 |
+
{"id": "DECK_madera_oscuro", "nombre": "Deck Madera Oscuro", "textura": "Texture_wpc_deck/DECK_madera_oscuro.png", "url_preview": "/seg/texture-preview/Texture_wpc_deck/DECK_madera_oscuro.png", "dimensiones": ["2.90x0.14"]},
|
| 99 |
+
{"id": "DECK_gris", "nombre": "Deck Gris", "textura": "Texture_wpc_deck/DECK_gris.png", "url_preview": "/seg/texture-preview/Texture_wpc_deck/DECK_gris.png", "dimensiones": ["2.90x0.14"]},
|
| 100 |
+
],
|
| 101 |
+
"created_at": "2026-05-08T00:00:00Z",
|
| 102 |
+
},
|
| 103 |
]
|
| 104 |
|
| 105 |
|
backend/services/__pycache__/texture_service.cpython-312.pyc
CHANGED
|
Binary files a/backend/services/__pycache__/texture_service.cpython-312.pyc and b/backend/services/__pycache__/texture_service.cpython-312.pyc differ
|
|
|
backend/services/texture_service.py
CHANGED
|
@@ -302,9 +302,11 @@ def _tile_texture_perspective(
|
|
| 302 |
|
| 303 |
def classify_texture_material(texture_name: str) -> str:
|
| 304 |
texture_key = texture_name.lower()
|
|
|
|
|
|
|
| 305 |
if "acm" in texture_key or "wpc" in texture_key:
|
| 306 |
return "acm"
|
| 307 |
-
if any(hint in texture_key for hint in ("
|
| 308 |
return "wood"
|
| 309 |
if any(hint in texture_key for hint in ("marble", "granite", "tile", "brick", "cobblestone", "stone", "cartago", "riverbed")):
|
| 310 |
return "stone"
|
|
@@ -349,11 +351,11 @@ def infer_surface_type_and_direction(
|
|
| 349 |
blend_alpha = 0.58
|
| 350 |
tile_width = max(128, image_width // 5)
|
| 351 |
elif is_floor:
|
| 352 |
-
if material
|
| 353 |
surface_type = "deck"
|
| 354 |
-
angle =
|
| 355 |
blend_alpha = 0.82
|
| 356 |
-
tile_width = max(
|
| 357 |
else:
|
| 358 |
surface_type = "floor"
|
| 359 |
angle = 0.0
|
|
@@ -381,8 +383,8 @@ def infer_surface_type_and_direction(
|
|
| 381 |
|
| 382 |
|
| 383 |
def choose_auto_texture_settings(material: str, surface_type: str) -> tuple[float, float, float]:
|
| 384 |
-
strength_map = {"acm": 0.98, "stone": 0.96, "wood": 0.88, "metal": 0.91, "generic": 0.9}
|
| 385 |
-
intensity_map = {"acm": 0.08, "stone": 0.36, "wood": 0.3, "metal": 0.34, "generic": 0.32}
|
| 386 |
|
| 387 |
strength = float(strength_map.get(material, 0.9))
|
| 388 |
intensity = float(intensity_map.get(material, 0.32))
|
|
@@ -429,7 +431,7 @@ def build_texture_relief_map(tex_rgb: np.ndarray, material: str = "generic") ->
|
|
| 429 |
tex_gray = cv2.cvtColor(tex_u8, cv2.COLOR_RGB2GRAY).astype(np.float32) / 255.0
|
| 430 |
micro_relief = tex_gray - cv2.GaussianBlur(tex_gray, (0, 0), sigmaX=3.0, sigmaY=3.0)
|
| 431 |
|
| 432 |
-
relief_scale = {"acm": 0.35, "stone": 2.8, "wood": 2.2, "metal": 1.8}.get(material, 2.0)
|
| 433 |
return np.clip(micro_relief * relief_scale, -1.0, 1.0)
|
| 434 |
|
| 435 |
|
|
@@ -445,7 +447,7 @@ def build_directional_light_map(
|
|
| 445 |
grad_x = cv2.Sobel(height_map, cv2.CV_32F, 1, 0, ksize=3)
|
| 446 |
grad_y = cv2.Sobel(height_map, cv2.CV_32F, 0, 1, ksize=3)
|
| 447 |
|
| 448 |
-
relief_scale = {"acm": 0.45, "stone": 3.0, "wood": 2.4, "metal": 1.6}.get(material, 2.0)
|
| 449 |
|
| 450 |
nx = -grad_x * relief_scale
|
| 451 |
ny = -grad_y * relief_scale
|
|
@@ -468,6 +470,8 @@ def build_directional_light_map(
|
|
| 468 |
strength = float(np.clip(light_intensity, 0.0, 1.0))
|
| 469 |
if material == "acm":
|
| 470 |
return np.clip(0.97 + (diffuse * (0.03 + (0.12 * strength))), 0.95, 1.12)
|
|
|
|
|
|
|
| 471 |
return np.clip(0.86 + (diffuse * (0.14 + (0.60 * strength))), 0.72, 1.35)
|
| 472 |
|
| 473 |
|
|
@@ -546,7 +550,7 @@ def blend_texture_preserve_shading(
|
|
| 546 |
mixed_lab[:, :, 0] = (0.30 * orig_lab[:, :, 0]) + (0.70 * tex_lab[:, :, 0])
|
| 547 |
mixed_lab[:, :, 1] = (0.97 * tex_lab[:, :, 1]) + (0.03 * orig_lab[:, :, 1])
|
| 548 |
mixed_lab[:, :, 2] = (0.97 * tex_lab[:, :, 2]) + (0.03 * orig_lab[:, :, 2])
|
| 549 |
-
elif material
|
| 550 |
mixed_lab[:, :, 0] = (0.78 * orig_lab[:, :, 0]) + (0.22 * tex_lab[:, :, 0])
|
| 551 |
mixed_lab[:, :, 1] = (0.9 * tex_lab[:, :, 1]) + (0.1 * orig_lab[:, :, 1])
|
| 552 |
mixed_lab[:, :, 2] = (0.9 * tex_lab[:, :, 2]) + (0.1 * orig_lab[:, :, 2])
|
|
@@ -561,7 +565,7 @@ def blend_texture_preserve_shading(
|
|
| 561 |
mixed_lab[:, :, 2] = (0.8 * tex_lab[:, :, 2]) + (0.2 * orig_lab[:, :, 2])
|
| 562 |
|
| 563 |
shaded_tex = cv2.cvtColor(np.clip(mixed_lab, 0, 255).astype(np.uint8), cv2.COLOR_LAB2RGB).astype(np.float32)
|
| 564 |
-
if material
|
| 565 |
tex_gray = cv2.cvtColor(tex_u8, cv2.COLOR_RGB2GRAY).astype(np.float32)
|
| 566 |
tex_base = cv2.GaussianBlur(tex_gray, (0, 0), sigmaX=9.0, sigmaY=9.0)
|
| 567 |
tex_detail = np.clip((tex_gray - tex_base) / 255.0, -0.35, 0.35)
|
|
@@ -679,47 +683,6 @@ def apply_local_texture_sync(payload: ApplyTextureRequest) -> dict[str, Any]:
|
|
| 679 |
|
| 680 |
tiled: Image.Image | None = None
|
| 681 |
|
| 682 |
-
# Floor surfaces: perspective tiling solo cuando la perspectiva es fuerte.
|
| 683 |
-
# Para pisos de dormitorio/habitación (perspectiva suave) el quad aproximado
|
| 684 |
-
# no cubre bien el mask irregular → produce negro. Se usa tiling regular en esos casos.
|
| 685 |
-
if surface_type == "floor" and direction_mode in {"auto", "none"}:
|
| 686 |
-
ys_m, xs_m = np.where(binary_mask > 0)
|
| 687 |
-
if ys_m.size > 0:
|
| 688 |
-
min_y_m, max_y_m = int(ys_m.min()), int(ys_m.max())
|
| 689 |
-
bbox_h_m = max(1, max_y_m - min_y_m + 1)
|
| 690 |
-
trap_score = _compute_trapezoid_score_from_mask(
|
| 691 |
-
binary_mask, ys_m, xs_m, min_y_m, max_y_m, bbox_h_m
|
| 692 |
-
)
|
| 693 |
-
if trap_score > 0.35:
|
| 694 |
-
quad = _extract_mask_quad(binary_mask)
|
| 695 |
-
if quad is not None:
|
| 696 |
-
tiled = _tile_texture_perspective(tex_pil, quad, width, height)
|
| 697 |
-
if tiled is not None:
|
| 698 |
-
logger.info(f"[APPLY_TEXTURE] perspective floor tiling applied (trap={trap_score:.2f})")
|
| 699 |
-
else:
|
| 700 |
-
logger.info(f"[APPLY_TEXTURE] flat floor tiling (trap={trap_score:.2f} < 0.35, skip perspective)")
|
| 701 |
-
|
| 702 |
-
# Wall / ceiling surfaces: perspective tiling cuando el quad es significativamente
|
| 703 |
-
# no-rectangular (pared fotografiada en ángulo). Un ratio > 1.20 entre lado mayor
|
| 704 |
-
# y lado menor indica distorsión perspectiva visible.
|
| 705 |
-
if surface_type in {"wall", "ceiling"} and tiled is None and direction_mode in {"auto", "none"}:
|
| 706 |
-
quad = _extract_mask_quad(binary_mask)
|
| 707 |
-
if quad is not None:
|
| 708 |
-
tl, tr, br, bl = quad
|
| 709 |
-
top_w = float(np.linalg.norm(tr.astype(float) - tl.astype(float)))
|
| 710 |
-
bot_w = float(np.linalg.norm(br.astype(float) - bl.astype(float)))
|
| 711 |
-
left_h = float(np.linalg.norm(bl.astype(float) - tl.astype(float)))
|
| 712 |
-
right_h = float(np.linalg.norm(br.astype(float) - tr.astype(float)))
|
| 713 |
-
w_ratio = max(top_w, bot_w) / max(1.0, min(top_w, bot_w))
|
| 714 |
-
h_ratio = max(left_h, right_h) / max(1.0, min(left_h, right_h))
|
| 715 |
-
if w_ratio > 1.20 or h_ratio > 1.20:
|
| 716 |
-
tiled = _tile_texture_perspective(tex_pil, quad, width, height)
|
| 717 |
-
if tiled is not None:
|
| 718 |
-
logger.info(
|
| 719 |
-
f"[APPLY_TEXTURE] perspective wall tiling applied "
|
| 720 |
-
f"(w_ratio={w_ratio:.2f}, h_ratio={h_ratio:.2f})"
|
| 721 |
-
)
|
| 722 |
-
|
| 723 |
if tiled is None:
|
| 724 |
if abs(applied_angle) > 0.01:
|
| 725 |
# Tile on a large canvas first, then rotate the full canvas to avoid black corners
|
|
|
|
| 302 |
|
| 303 |
def classify_texture_material(texture_name: str) -> str:
|
| 304 |
texture_key = texture_name.lower()
|
| 305 |
+
if "deck" in texture_key:
|
| 306 |
+
return "deck"
|
| 307 |
if "acm" in texture_key or "wpc" in texture_key:
|
| 308 |
return "acm"
|
| 309 |
+
if any(hint in texture_key for hint in ("wood", "plank", "laminate", "floor")):
|
| 310 |
return "wood"
|
| 311 |
if any(hint in texture_key for hint in ("marble", "granite", "tile", "brick", "cobblestone", "stone", "cartago", "riverbed")):
|
| 312 |
return "stone"
|
|
|
|
| 351 |
blend_alpha = 0.58
|
| 352 |
tile_width = max(128, image_width // 5)
|
| 353 |
elif is_floor:
|
| 354 |
+
if material in ("deck", "wood"):
|
| 355 |
surface_type = "deck"
|
| 356 |
+
angle = 0.0 # Always straight, no perspective distortion for deck
|
| 357 |
blend_alpha = 0.82
|
| 358 |
+
tile_width = max(240, int(bbox_w * 0.55), image_width // 3)
|
| 359 |
else:
|
| 360 |
surface_type = "floor"
|
| 361 |
angle = 0.0
|
|
|
|
| 383 |
|
| 384 |
|
| 385 |
def choose_auto_texture_settings(material: str, surface_type: str) -> tuple[float, float, float]:
|
| 386 |
+
strength_map = {"acm": 0.98, "stone": 0.96, "wood": 0.88, "deck": 0.88, "metal": 0.91, "generic": 0.9}
|
| 387 |
+
intensity_map = {"acm": 0.08, "stone": 0.36, "wood": 0.3, "deck": 0.3, "metal": 0.34, "generic": 0.32}
|
| 388 |
|
| 389 |
strength = float(strength_map.get(material, 0.9))
|
| 390 |
intensity = float(intensity_map.get(material, 0.32))
|
|
|
|
| 431 |
tex_gray = cv2.cvtColor(tex_u8, cv2.COLOR_RGB2GRAY).astype(np.float32) / 255.0
|
| 432 |
micro_relief = tex_gray - cv2.GaussianBlur(tex_gray, (0, 0), sigmaX=3.0, sigmaY=3.0)
|
| 433 |
|
| 434 |
+
relief_scale = {"acm": 0.35, "stone": 2.8, "wood": 2.2, "deck": 2.2, "metal": 1.8}.get(material, 2.0)
|
| 435 |
return np.clip(micro_relief * relief_scale, -1.0, 1.0)
|
| 436 |
|
| 437 |
|
|
|
|
| 447 |
grad_x = cv2.Sobel(height_map, cv2.CV_32F, 1, 0, ksize=3)
|
| 448 |
grad_y = cv2.Sobel(height_map, cv2.CV_32F, 0, 1, ksize=3)
|
| 449 |
|
| 450 |
+
relief_scale = {"acm": 0.45, "stone": 3.0, "wood": 2.4, "deck": 2.4, "metal": 1.6}.get(material, 2.0)
|
| 451 |
|
| 452 |
nx = -grad_x * relief_scale
|
| 453 |
ny = -grad_y * relief_scale
|
|
|
|
| 470 |
strength = float(np.clip(light_intensity, 0.0, 1.0))
|
| 471 |
if material == "acm":
|
| 472 |
return np.clip(0.97 + (diffuse * (0.03 + (0.12 * strength))), 0.95, 1.12)
|
| 473 |
+
if material == "deck":
|
| 474 |
+
return np.clip(0.88 + (diffuse * (0.12 + (0.50 * strength))), 0.76, 1.28)
|
| 475 |
return np.clip(0.86 + (diffuse * (0.14 + (0.60 * strength))), 0.72, 1.35)
|
| 476 |
|
| 477 |
|
|
|
|
| 550 |
mixed_lab[:, :, 0] = (0.30 * orig_lab[:, :, 0]) + (0.70 * tex_lab[:, :, 0])
|
| 551 |
mixed_lab[:, :, 1] = (0.97 * tex_lab[:, :, 1]) + (0.03 * orig_lab[:, :, 1])
|
| 552 |
mixed_lab[:, :, 2] = (0.97 * tex_lab[:, :, 2]) + (0.03 * orig_lab[:, :, 2])
|
| 553 |
+
elif material in ("wood", "deck"):
|
| 554 |
mixed_lab[:, :, 0] = (0.78 * orig_lab[:, :, 0]) + (0.22 * tex_lab[:, :, 0])
|
| 555 |
mixed_lab[:, :, 1] = (0.9 * tex_lab[:, :, 1]) + (0.1 * orig_lab[:, :, 1])
|
| 556 |
mixed_lab[:, :, 2] = (0.9 * tex_lab[:, :, 2]) + (0.1 * orig_lab[:, :, 2])
|
|
|
|
| 565 |
mixed_lab[:, :, 2] = (0.8 * tex_lab[:, :, 2]) + (0.2 * orig_lab[:, :, 2])
|
| 566 |
|
| 567 |
shaded_tex = cv2.cvtColor(np.clip(mixed_lab, 0, 255).astype(np.uint8), cv2.COLOR_LAB2RGB).astype(np.float32)
|
| 568 |
+
if material in ("wood", "deck"):
|
| 569 |
tex_gray = cv2.cvtColor(tex_u8, cv2.COLOR_RGB2GRAY).astype(np.float32)
|
| 570 |
tex_base = cv2.GaussianBlur(tex_gray, (0, 0), sigmaX=9.0, sigmaY=9.0)
|
| 571 |
tex_detail = np.clip((tex_gray - tex_base) / 255.0, -0.35, 0.35)
|
|
|
|
| 683 |
|
| 684 |
tiled: Image.Image | None = None
|
| 685 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 686 |
if tiled is None:
|
| 687 |
if abs(applied_angle) > 0.01:
|
| 688 |
# Tile on a large canvas first, then rotate the full canvas to avoid black corners
|
backend/texturas/Texture_WPC_DECK/DECK_gris.png
ADDED
|
Git LFS Details
|
backend/texturas/Texture_WPC_DECK/DECK_madera.png
ADDED
|
Git LFS Details
|
backend/texturas/Texture_WPC_DECK/DECK_madera_oscuro.png
ADDED
|
Git LFS Details
|
frontend/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
| 1 |
-
export const appVersion = "0.1.0-dev.
|
|
|
|
| 1 |
+
export const appVersion = "0.1.0-dev.20260508T144158";
|