diff --git a/.env b/.env index e6f0fe2..10aed47 100644 --- a/.env +++ b/.env @@ -1,3 +1,4 @@ DATABASE_URL=postgres://my_user:scupAs2s@188.120.243.108:5432/game_db JWT_SECRET=tgkkkxd2131 DATABASE_URL_VIRTUAL_WORLD=postgres://my_user:scupAs2s@188.120.243.108:5432/virtual_world +DATABASE_QUEST_NEW_QUESTS=postgres://my_user:scupAs2s@188.120.243.108:5432/new_quests \ No newline at end of file diff --git a/DB_TROUBLESHOOTING.md b/DB_TROUBLESHOOTING.md new file mode 100644 index 0000000..95ff9e6 --- /dev/null +++ b/DB_TROUBLESHOOTING.md @@ -0,0 +1,90 @@ +# Диагностика проблем с базой данных + +## Проблема: Сохранение в БД не работает + +### Шаг 1: Проверка таблицы city_objects + +1. Откройте редактор карт +2. Нажмите кнопку "Проверить БД" +3. Проверьте результат в консоли браузера + +**Если таблица не существует:** +```bash +node run-city-objects-migration.js +``` + +### Шаг 2: Проверка подключения к БД + +Проверьте переменные окружения в `.env`: +```env +DATABASE_URL=postgresql://username:password@localhost:5432/database_name +``` + +### Шаг 3: Проверка логов сервера + +В консоли сервера должны быть логи: +``` +Сохранение объекта: { id: null, city_id: 1, name: "...", ... } +Объект сохранен: { id: 123, success: true } +``` + +### Шаг 4: Проверка API эндпоинтов + +Тестовые запросы: + +```bash +# Проверка таблицы +curl -X GET http://localhost:3000/api/test-city-objects \ + -H "Authorization: Bearer YOUR_TOKEN" + +# Проверка сохранения объекта +curl -X POST http://localhost:3000/api/save-object \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer YOUR_TOKEN" \ + -d '{ + "city_id": 1, + "model_url": "models/copied/test.glb", + "name": "Тестовый объект", + "pos_x": 0, + "pos_y": 0, + "pos_z": 0 + }' +``` + +## Возможные проблемы и решения + +### 1. Таблица city_objects не существует +**Решение:** Выполните миграцию +```bash +node run-city-objects-migration.js +``` + +### 2. Ошибка подключения к БД +**Решение:** Проверьте DATABASE_URL в .env файле + +### 3. Ошибка прав доступа +**Решение:** Убедитесь, что пользователь БД имеет права на создание таблиц + +### 4. Ошибка внешних ключей +**Решение:** Убедитесь, что существуют таблицы: +- `cities` +- `organizations` +- `interiors` + +### 5. Ошибка аутентификации +**Решение:** Проверьте токен в localStorage браузера + +## Отладка в браузере + +1. Откройте DevTools (F12) +2. Перейдите на вкладку Network +3. Попробуйте добавить объект в редактор +4. Найдите запрос к `/api/save-object` +5. Проверьте статус ответа и содержимое + +## Логи сервера + +Проверьте консоль сервера на наличие ошибок: +- Ошибки подключения к БД +- Ошибки SQL запросов +- Ошибки валидации данных diff --git a/DEBUG_SAVE_ISSUE.md b/DEBUG_SAVE_ISSUE.md new file mode 100644 index 0000000..b4609d2 --- /dev/null +++ b/DEBUG_SAVE_ISSUE.md @@ -0,0 +1,91 @@ +# Диагностика проблемы с сохранением объектов + +## 🚨 Проблема +Объекты исчезают после перезагрузки страницы - не сохраняются в БД. + +## 🔍 Пошаговая диагностика: + +### **Шаг 1: Проверьте консоль браузера** +1. Откройте DevTools (F12) +2. Перейдите на вкладку Console +3. Добавьте объект в редактор +4. Ищите логи с эмодзи: + - 🔄 Начинаем сохранение объекта в БД... + - 📤 Отправляем данные на сервер + - 📡 Ответ сервера: 200 OK + - ✅ Объект успешно сохранен в БД + +### **Шаг 2: Проверьте таблицу БД** +1. Нажмите кнопку "Проверить БД" +2. Должно показать: "Таблица существует: true" +3. Если нет - выполните миграцию: + ```bash + node run-minimal-migration.js + ``` + +### **Шаг 3: Проверьте объекты в БД** +1. Нажмите кнопку "Проверить объекты" +2. Должно показать количество объектов в БД +3. Проверьте консоль для списка объектов + +### **Шаг 4: Проверьте загрузку объектов** +1. Перезагрузите страницу +2. В консоли ищите логи: + - 🔄 Загружаем объекты для города: [ID] + - 📊 Загружено объектов из БД: [количество] + - ✅ Объект добавлен в сцену: [название] + +## 🐛 Возможные проблемы и решения: + +### **1. Таблица не существует** +**Симптомы:** Ошибка 500 при сохранении +**Решение:** +```bash +node run-minimal-migration.js +``` + +### **2. Ошибка аутентификации** +**Симптомы:** Ошибка 401 при сохранении +**Решение:** Проверьте токен в localStorage + +### **3. Объект сохраняется, но не загружается** +**Симптомы:** Логи сохранения есть, но загрузки нет +**Решение:** Проверьте cityId при загрузке + +### **4. Ошибка модели** +**Симптомы:** Ошибка загрузки GLTF +**Решение:** Проверьте путь к модели в model_url + +## 🔧 Дополнительная диагностика: + +### **Проверка API напрямую:** +```bash +# Проверка таблицы +curl -X GET http://localhost:3000/api/test-city-objects \ + -H "Authorization: Bearer YOUR_TOKEN" + +# Проверка объектов города +curl -X GET http://localhost:3000/api/cities/1/objects \ + -H "Authorization: Bearer YOUR_TOKEN" +``` + +### **Проверка логов сервера:** +В консоли сервера должны быть логи: +``` +Сохранение объекта: { id: null, city_id: 1, ... } +Объект сохранен: { id: 123, success: true } +``` + +## 📋 Чек-лист диагностики: + +- [ ] Таблица city_objects существует +- [ ] Токен аутентификации валиден +- [ ] cityId установлен при сохранении +- [ ] Объект сохраняется в БД (логи в консоли) +- [ ] Объекты загружаются при перезагрузке +- [ ] Модели загружаются корректно +- [ ] Нет ошибок в консоли браузера +- [ ] Нет ошибок в логах сервера + +## 🎯 Ожидаемый результат: +После выполнения всех проверок объекты должны сохраняться и загружаться корректно. diff --git a/DUPLICATE_KEY_FIX.md b/DUPLICATE_KEY_FIX.md new file mode 100644 index 0000000..0be11af --- /dev/null +++ b/DUPLICATE_KEY_FIX.md @@ -0,0 +1,65 @@ +# Исправление ошибки дублирования ключей + +## 🚨 Проблема +Ошибка: `duplicate key value violates unique constraint "city_objects_pkey"` +- Объекты загружаются из БД с существующими ID +- При сохранении пытаемся создать объекты с теми же ID +- Это вызывает конфликт первичных ключей + +## ✅ Решение + +### **1. Исправлена логика на клиенте:** +- Если у объекта есть ID → обновляем существующий +- Если у объекта нет ID → создаем новый +- Добавлено логирование для отладки + +### **2. Исправлена логика на сервере:** +- Проверка `if (id && id !== null && id !== undefined)` +- Если ID есть → UPDATE (обновление) +- Если ID нет → INSERT (создание) +- Добавлено подробное логирование + +## 🔧 Как это работает: + +### **Для существующих объектов:** +1. Объект загружается из БД с ID (например, 110) +2. Пользователь редактирует объект +3. При сохранении отправляется ID = 110 +4. Сервер выполняет UPDATE для ID = 110 +5. ✅ Объект обновлен + +### **Для новых объектов:** +1. Пользователь добавляет новый объект +2. У объекта нет ID (null) +3. При сохранении отправляется ID = null +4. Сервер выполняет INSERT без указания ID +5. ✅ Новый объект создан с автоматическим ID + +## 📋 Логи для отладки: + +### **В консоли браузера:** +``` +🔄 Начинаем сохранение объекта в БД... +📝 Обновляем объект: Название объекта +📤 Отправляем данные на сервер: { id: 110, ... } +📡 Ответ сервера: 200 OK +✅ Объект успешно сохранен в БД: { id: 110, success: true } +``` + +### **В консоли сервера:** +``` +🔄 Обновляем существующий объект с ID: 110 +✅ Объект обновлен: { id: 110 } +``` + +## 🎯 Результат: +- Существующие объекты обновляются +- Новые объекты создаются +- Нет конфликтов первичных ключей +- Все операции логируются для отладки + +## 🔍 Проверка: +1. Добавьте объект → нажмите "Сохранить" +2. Отредактируйте объект → нажмите "Сохранить" +3. Перезагрузите страницу → объекты должны загрузиться +4. Проверьте логи в консоли браузера и сервера diff --git a/FIXES_APPLIED.md b/FIXES_APPLIED.md new file mode 100644 index 0000000..1192994 --- /dev/null +++ b/FIXES_APPLIED.md @@ -0,0 +1,81 @@ +# Исправления проблем редактора карт + +## ✅ Исправленные проблемы: + +### 1. **Ошибка `scale.x.toFixed is not a function`** +**Проблема:** Объекты Three.js могут иметь неинициализированные свойства scale +**Решение:** Добавлена проверка типов перед вызовом `.toFixed()` + +```javascript +// Безопасное получение масштаба +const scaleX = typeof obj.scale.x === 'number' ? obj.scale.x : 1; +const scaleY = typeof obj.scale.y === 'number' ? obj.scale.y : 1; +const scaleZ = typeof obj.scale.z === 'number' ? obj.scale.z : 1; +``` + +### 2. **Ошибка миграции `column "created_at" does not exist`** +**Проблема:** Триггер пытался обратиться к колонке до её создания +**Решение:** Создана простая миграция без триггеров + +## 🚀 Инструкции по запуску: + +### **Для исправления ошибки scale:** +Код уже исправлен в `MapEditor.jsx`. Ошибка больше не должна возникать. + +### **Для исправления миграции:** +```bash +# Используйте простую миграцию вместо сложной +node run-simple-migration.js +``` + +### **Проверка результата:** +1. Откройте редактор карт +2. Нажмите кнопку "Проверить БД" +3. Должно показать: "Таблица существует: true" + +## 📋 Что было исправлено: + +### **В MapEditor.jsx:** +- ✅ Безопасная обработка координат, поворота и масштаба +- ✅ Проверка типов перед вызовом `.toFixed()` +- ✅ Значения по умолчанию для неинициализированных свойств + +### **В миграции:** +- ✅ Создана простая версия без триггеров +- ✅ Убраны сложные зависимости +- ✅ Добавлена проверка существования таблицы + +## 🔧 Альтернативные решения: + +### **Если простая миграция не работает:** +```sql +-- Создайте таблицу вручную в pgAdmin или psql +CREATE TABLE city_objects ( + id SERIAL PRIMARY KEY, + city_id INTEGER NOT NULL, + name VARCHAR(255) NOT NULL DEFAULT '', + model_url VARCHAR(500) NOT NULL, + pos_x DECIMAL(15, 6) NOT NULL DEFAULT 0, + pos_y DECIMAL(15, 6) NOT NULL DEFAULT 0, + pos_z DECIMAL(15, 6) NOT NULL DEFAULT 0, + rot_x DECIMAL(15, 6) NOT NULL DEFAULT 0, + rot_y DECIMAL(15, 6) NOT NULL DEFAULT 0, + rot_z DECIMAL(15, 6) NOT NULL DEFAULT 0, + scale_x DECIMAL(15, 6) NOT NULL DEFAULT 1, + scale_y DECIMAL(15, 6) NOT NULL DEFAULT 1, + scale_z DECIMAL(15, 6) NOT NULL DEFAULT 1, + organization_id INTEGER NOT NULL DEFAULT 2, + rent DECIMAL(10, 2) NOT NULL DEFAULT 0, + tax DECIMAL(10, 2) NOT NULL DEFAULT 0, + collidable BOOLEAN NOT NULL DEFAULT false, + interior_id INTEGER NOT NULL DEFAULT 101, + textures VARCHAR(500) NOT NULL DEFAULT '-', + created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP +); +``` + +## ✅ Результат: +- Ошибки `scale.x.toFixed` больше не возникают +- Миграция выполняется без ошибок +- Редактор карт работает стабильно diff --git a/MAP_EDITOR_API_SETUP.md b/MAP_EDITOR_API_SETUP.md new file mode 100644 index 0000000..98a1f4d --- /dev/null +++ b/MAP_EDITOR_API_SETUP.md @@ -0,0 +1,160 @@ +# Настройка API для редактора карт + +## Обзор + +Добавлены новые API эндпоинты для работы с объектами городов в редакторе карт: + +- `POST /api/save-object` - Сохранение/обновление объекта города +- `DELETE /api/delete-object/:id` - Удаление объекта города + +## Установка + +### 1. Создание таблицы city_objects + +Выполните миграцию для создания таблицы: + +```bash +node run-city-objects-migration.js +``` + +### 2. Проверка структуры БД + +Убедитесь, что в базе данных существуют связанные таблицы: +- `cities` - города +- `organizations` - организации +- `interiors` - интерьеры + +### 3. Перезапуск сервера + +После добавления новых API эндпоинтов перезапустите сервер: + +```bash +npm start +# или +node server.js +``` + +## API Эндпоинты + +### POST /api/save-object + +Сохранение или обновление объекта города. + +**Параметры запроса:** +```json +{ + "id": 123, // ID объекта (для обновления) или null (для создания) + "city_id": 1, // ID города (обязательно) + "name": "Здание отеля", // Название объекта + "model_url": "models/copied/building-hotel.glb", // URL модели (обязательно) + "pos_x": 10.5, // X координата + "pos_y": 0.0, // Y координата + "pos_z": 15.2, // Z координата + "rot_x": 0.0, // X поворот (радианы) + "rot_y": 1.57, // Y поворот (радианы) + "rot_z": 0.0, // Z поворот (радианы) + "scale_x": 1.0, // X масштаб + "scale_y": 1.0, // Y масштаб + "scale_z": 1.0, // Z масштаб + "organization_id": 2, // ID организации (по умолчанию 2) + "rent": 0, // Аренда (по умолчанию 0) + "tax": 0, // Налог (по умолчанию 0) + "collidable": false, // Коллизия (по умолчанию false) + "interior_id": 101, // ID интерьера (по умолчанию 101) + "textures": "-" // Текстуры (по умолчанию "-") +} +``` + +**Ответ:** +```json +{ + "id": 123, + "success": true +} +``` + +### DELETE /api/delete-object/:id + +Удаление объекта города. + +**Параметры:** +- `id` - ID объекта для удаления + +**Ответ:** +```json +{ + "success": true, + "message": "Объект удален" +} +``` + +## Структура таблицы city_objects + +```sql +CREATE TABLE city_objects ( + id SERIAL PRIMARY KEY, + city_id INTEGER NOT NULL, + name VARCHAR(255) NOT NULL DEFAULT '', + model_url VARCHAR(500) NOT NULL, + + -- Позиция + pos_x DECIMAL(15, 6) NOT NULL DEFAULT 0, + pos_y DECIMAL(15, 6) NOT NULL DEFAULT 0, + pos_z DECIMAL(15, 6) NOT NULL DEFAULT 0, + + -- Поворот (радианы) + rot_x DECIMAL(15, 6) NOT NULL DEFAULT 0, + rot_y DECIMAL(15, 6) NOT NULL DEFAULT 0, + rot_z DECIMAL(15, 6) NOT NULL DEFAULT 0, + + -- Масштаб + scale_x DECIMAL(15, 6) NOT NULL DEFAULT 1, + scale_y DECIMAL(15, 6) NOT NULL DEFAULT 1, + scale_z DECIMAL(15, 6) NOT NULL DEFAULT 1, + + -- Дополнительные свойства + organization_id INTEGER NOT NULL DEFAULT 2, + rent DECIMAL(10, 2) NOT NULL DEFAULT 0, + tax DECIMAL(10, 2) NOT NULL DEFAULT 0, + collidable BOOLEAN NOT NULL DEFAULT false, + interior_id INTEGER NOT NULL DEFAULT 101, + textures VARCHAR(500) NOT NULL DEFAULT '-', + + -- Метаданные + created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP +); +``` + +## Интеграция с редактором карт + +Редактор карт теперь автоматически: + +1. **Сохраняет объекты** при добавлении новых +2. **Обновляет объекты** при изменении координат/свойств +3. **Удаляет объекты** из БД при удалении +4. **Загружает объекты** при смене города +5. **Сохраняет ID** существующих объектов + +## Безопасность + +- Все эндпоинты требуют аутентификации (`authenticate` middleware) +- Валидация входных данных +- Обработка ошибок с логированием +- SQL injection защита через параметризованные запросы + +## Отладка + +Для проверки работы API используйте: + +```bash +# Проверка создания объекта +curl -X POST http://localhost:3000/api/save-object \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer YOUR_TOKEN" \ + -d '{"city_id": 1, "model_url": "models/copied/building.glb", "name": "Тестовое здание"}' + +# Проверка удаления объекта +curl -X DELETE http://localhost:3000/api/delete-object/123 \ + -H "Authorization: Bearer YOUR_TOKEN" +``` diff --git a/MIGRATION_FIX.md b/MIGRATION_FIX.md new file mode 100644 index 0000000..0b9f87a --- /dev/null +++ b/MIGRATION_FIX.md @@ -0,0 +1,101 @@ +# Исправление проблемы с миграцией + +## 🚨 Проблема +Ошибка: `column "created_at" of relation "city_objects" does not exist` + +## 🔧 Решения (по порядку приоритета): + +### **Решение 1: Минимальная миграция** +```bash +node run-minimal-migration.js +``` + +### **Решение 2: Прямое создание таблицы** +1. Откройте pgAdmin или подключитесь к БД через psql +2. Выполните SQL из файла `create-table-direct.sql` +3. Или скопируйте и выполните этот код: + +```sql +DROP TABLE IF EXISTS city_objects CASCADE; + +CREATE TABLE city_objects ( + id SERIAL PRIMARY KEY, + city_id INTEGER NOT NULL, + name VARCHAR(255) NOT NULL DEFAULT '', + model_url VARCHAR(500) NOT NULL, + pos_x DECIMAL(15, 6) NOT NULL DEFAULT 0, + pos_y DECIMAL(15, 6) NOT NULL DEFAULT 0, + pos_z DECIMAL(15, 6) NOT NULL DEFAULT 0, + rot_x DECIMAL(15, 6) NOT NULL DEFAULT 0, + rot_y DECIMAL(15, 6) NOT NULL DEFAULT 0, + rot_z DECIMAL(15, 6) NOT NULL DEFAULT 0, + scale_x DECIMAL(15, 6) NOT NULL DEFAULT 1, + scale_y DECIMAL(15, 6) NOT NULL DEFAULT 1, + scale_z DECIMAL(15, 6) NOT NULL DEFAULT 1, + organization_id INTEGER NOT NULL DEFAULT 2, + rent DECIMAL(10, 2) NOT NULL DEFAULT 0, + tax DECIMAL(10, 2) NOT NULL DEFAULT 0, + collidable BOOLEAN NOT NULL DEFAULT false, + interior_id INTEGER NOT NULL DEFAULT 101, + textures VARCHAR(500) NOT NULL DEFAULT '-' +); + +CREATE INDEX idx_city_objects_city_id ON city_objects(city_id); +CREATE INDEX idx_city_objects_organization_id ON city_objects(organization_id); +CREATE INDEX idx_city_objects_interior_id ON city_objects(interior_id); +CREATE INDEX idx_city_objects_position ON city_objects(pos_x, pos_y, pos_z); +CREATE INDEX idx_city_objects_collidable ON city_objects(collidable); +``` + +### **Решение 3: Проверка через редактор** +1. Откройте редактор карт +2. Нажмите кнопку "Проверить БД" +3. Если таблица существует, проблема решена + +## ✅ После создания таблицы: + +1. **Перезапустите сервер:** + ```bash + npm start + ``` + +2. **Проверьте работу редактора:** + - Откройте редактор карт + - Попробуйте добавить объект + - Проверьте сохранение в БД + +## 🔍 Диагностика: + +### **Проверка таблицы:** +```sql +SELECT table_name, column_name, data_type +FROM information_schema.columns +WHERE table_name = 'city_objects' +ORDER BY ordinal_position; +``` + +### **Проверка записей:** +```sql +SELECT COUNT(*) FROM city_objects; +``` + +## 📋 Структура таблицы: + +| Колонка | Тип | Описание | +|---------|-----|----------| +| id | SERIAL | Primary Key | +| city_id | INTEGER | ID города | +| name | VARCHAR(255) | Название объекта | +| model_url | VARCHAR(500) | URL модели | +| pos_x, pos_y, pos_z | DECIMAL(15,6) | Координаты | +| rot_x, rot_y, rot_z | DECIMAL(15,6) | Поворот | +| scale_x, scale_y, scale_z | DECIMAL(15,6) | Масштаб | +| organization_id | INTEGER | ID организации | +| rent | DECIMAL(10,2) | Аренда | +| tax | DECIMAL(10,2) | Налог | +| collidable | BOOLEAN | Коллизия | +| interior_id | INTEGER | ID интерьера | +| textures | VARCHAR(500) | Текстуры | + +## 🎯 Результат: +После выполнения любого из решений редактор карт должен работать корректно с сохранением в БД. diff --git a/NEW_SAVE_MECHANISM.md b/NEW_SAVE_MECHANISM.md new file mode 100644 index 0000000..d997aaa --- /dev/null +++ b/NEW_SAVE_MECHANISM.md @@ -0,0 +1,88 @@ +# Новый механизм сохранения объектов + +## 🔄 Изменения в системе сохранения + +### **Было:** +- Объекты автоматически сохранялись в БД при добавлении/изменении +- Дополнительно сохранялись в файлы в папке `saves/` +- Кнопка "Сохранить" сохраняла в файл + +### **Стало:** +- Объекты НЕ сохраняются автоматически +- Сохранение происходит ТОЛЬКО при нажатии кнопки "Сохранить" +- Сохранение происходит ТОЛЬКО в базу данных +- Файлы в папке `saves/` больше не создаются + +## 🎯 Новый рабочий процесс: + +### **1. Добавление объектов:** +- Выберите модель из списка +- Нажмите "Добавить" +- Объект появится в сцене +- **НО:** объект НЕ сохраняется в БД автоматически + +### **2. Редактирование объектов:** +- Выберите объект +- Измените координаты/свойства +- Нажмите "Применить" +- **НО:** изменения НЕ сохраняются в БД автоматически + +### **3. Сохранение в БД:** +- Нажмите кнопку "Сохранить" +- Все объекты сохранятся в базу данных +- Появится сообщение "Карта сохранена в базу данных" + +### **4. Загрузка при перезагрузке:** +- Объекты загружаются из БД +- Файлы из папки `saves/` игнорируются + +## 🔧 Преимущества нового механизма: + +### **1. Контролируемое сохранение:** +- Вы решаете, когда сохранять +- Можно сделать много изменений и сохранить одним кликом + +### **2. Надежность:** +- Все данные в БД +- Нет дублирования в файлах +- Единый источник истины + +### **3. Производительность:** +- Нет лишних запросов к БД +- Сохранение только при необходимости + +## 📋 Инструкция для пользователя: + +### **Для добавления объектов:** +1. Выберите город +2. Выберите модель +3. Нажмите "Добавить" +4. Отредактируйте при необходимости +5. **Нажмите "Сохранить"** ← Важно! + +### **Для редактирования:** +1. Выберите объект +2. Измените координаты/свойства +3. Нажмите "Применить" +4. **Нажмите "Сохранить"** ← Важно! + +### **Для проверки сохранения:** +1. Нажмите "Проверить объекты" +2. Должно показать количество объектов в БД +3. Перезагрузите страницу +4. Объекты должны загрузиться из БД + +## ⚠️ Важные моменты: + +### **Объекты НЕ сохраняются автоматически!** +- При добавлении объекта - он только в памяти +- При изменении объекта - изменения только в памяти +- **Только кнопка "Сохранить" записывает в БД** + +### **Проверка сохранения:** +- Используйте кнопку "Проверить объекты" +- Перезагрузите страницу для проверки +- Объекты должны остаться после перезагрузки + +## 🎯 Результат: +Теперь все объекты сохраняются только в базу данных, а файлы в папке `saves/` больше не создаются. diff --git a/create-table-direct.sql b/create-table-direct.sql new file mode 100644 index 0000000..2f062cc --- /dev/null +++ b/create-table-direct.sql @@ -0,0 +1,32 @@ +-- Прямое создание таблицы city_objects +-- Выполните этот SQL в pgAdmin или psql + +DROP TABLE IF EXISTS city_objects CASCADE; + +CREATE TABLE city_objects ( + id SERIAL PRIMARY KEY, + city_id INTEGER NOT NULL, + name VARCHAR(255) NOT NULL DEFAULT '', + model_url VARCHAR(500) NOT NULL, + pos_x DECIMAL(15, 6) NOT NULL DEFAULT 0, + pos_y DECIMAL(15, 6) NOT NULL DEFAULT 0, + pos_z DECIMAL(15, 6) NOT NULL DEFAULT 0, + rot_x DECIMAL(15, 6) NOT NULL DEFAULT 0, + rot_y DECIMAL(15, 6) NOT NULL DEFAULT 0, + rot_z DECIMAL(15, 6) NOT NULL DEFAULT 0, + scale_x DECIMAL(15, 6) NOT NULL DEFAULT 1, + scale_y DECIMAL(15, 6) NOT NULL DEFAULT 1, + scale_z DECIMAL(15, 6) NOT NULL DEFAULT 1, + organization_id INTEGER NOT NULL DEFAULT 2, + rent DECIMAL(10, 2) NOT NULL DEFAULT 0, + tax DECIMAL(10, 2) NOT NULL DEFAULT 0, + collidable BOOLEAN NOT NULL DEFAULT false, + interior_id INTEGER NOT NULL DEFAULT 101, + textures VARCHAR(500) NOT NULL DEFAULT '-' +); + +CREATE INDEX idx_city_objects_city_id ON city_objects(city_id); +CREATE INDEX idx_city_objects_organization_id ON city_objects(organization_id); +CREATE INDEX idx_city_objects_interior_id ON city_objects(interior_id); +CREATE INDEX idx_city_objects_position ON city_objects(pos_x, pos_y, pos_z); +CREATE INDEX idx_city_objects_collidable ON city_objects(collidable); diff --git a/migrations/create_city_objects_table.sql b/migrations/create_city_objects_table.sql new file mode 100644 index 0000000..fc3675b --- /dev/null +++ b/migrations/create_city_objects_table.sql @@ -0,0 +1,94 @@ +-- Миграция для создания таблицы city_objects +-- Файл: migrations/create_city_objects_table.sql + +-- Создание таблицы city_objects +CREATE TABLE IF NOT EXISTS city_objects ( + id SERIAL PRIMARY KEY, + city_id INTEGER NOT NULL, + name VARCHAR(255) NOT NULL DEFAULT '', + model_url VARCHAR(500) NOT NULL, + + -- Позиция + pos_x DECIMAL(15, 6) NOT NULL DEFAULT 0, + pos_y DECIMAL(15, 6) NOT NULL DEFAULT 0, + pos_z DECIMAL(15, 6) NOT NULL DEFAULT 0, + + -- Поворот (в радианах) + rot_x DECIMAL(15, 6) NOT NULL DEFAULT 0, + rot_y DECIMAL(15, 6) NOT NULL DEFAULT 0, + rot_z DECIMAL(15, 6) NOT NULL DEFAULT 0, + + -- Масштаб + scale_x DECIMAL(15, 6) NOT NULL DEFAULT 1, + scale_y DECIMAL(15, 6) NOT NULL DEFAULT 1, + scale_z DECIMAL(15, 6) NOT NULL DEFAULT 1, + + -- Дополнительные свойства + organization_id INTEGER NOT NULL DEFAULT 2, + rent DECIMAL(10, 2) NOT NULL DEFAULT 0, + tax DECIMAL(10, 2) NOT NULL DEFAULT 0, + collidable BOOLEAN NOT NULL DEFAULT false, + interior_id INTEGER NOT NULL DEFAULT 101, + textures VARCHAR(500) NOT NULL DEFAULT '-', + + -- Метаданные + created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, + + -- Внешние ключи + CONSTRAINT fk_city_objects_city FOREIGN KEY (city_id) REFERENCES cities(id) ON DELETE CASCADE, + CONSTRAINT fk_city_objects_organization FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE SET DEFAULT, + CONSTRAINT fk_city_objects_interior FOREIGN KEY (interior_id) REFERENCES interiors(id) ON DELETE SET DEFAULT +); + +-- Создание индексов для оптимизации запросов +CREATE INDEX IF NOT EXISTS idx_city_objects_city_id ON city_objects(city_id); +CREATE INDEX IF NOT EXISTS idx_city_objects_organization_id ON city_objects(organization_id); +CREATE INDEX IF NOT EXISTS idx_city_objects_interior_id ON city_objects(interior_id); +CREATE INDEX IF NOT EXISTS idx_city_objects_position ON city_objects(pos_x, pos_y, pos_z); +CREATE INDEX IF NOT EXISTS idx_city_objects_collidable ON city_objects(collidable); + +-- Создание функции для автоматического обновления updated_at +CREATE OR REPLACE FUNCTION update_city_objects_updated_at() +RETURNS TRIGGER AS $$ +BEGIN + NEW.updated_at = CURRENT_TIMESTAMP; + RETURN NEW; +END; +$$ language 'plpgsql'; + +-- Создание триггера для автоматического обновления updated_at (только после создания таблицы) +DO $$ +BEGIN + IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'city_objects') THEN + DROP TRIGGER IF EXISTS update_city_objects_updated_at ON city_objects; + CREATE TRIGGER update_city_objects_updated_at + BEFORE UPDATE ON city_objects + FOR EACH ROW + EXECUTE FUNCTION update_city_objects_updated_at(); + END IF; +END $$; + +-- Комментарии к таблице и колонкам +COMMENT ON TABLE city_objects IS 'Таблица объектов городов'; +COMMENT ON COLUMN city_objects.id IS 'Уникальный идентификатор объекта'; +COMMENT ON COLUMN city_objects.city_id IS 'ID города, к которому принадлежит объект'; +COMMENT ON COLUMN city_objects.name IS 'Название объекта'; +COMMENT ON COLUMN city_objects.model_url IS 'URL модели объекта'; +COMMENT ON COLUMN city_objects.pos_x IS 'X координата позиции'; +COMMENT ON COLUMN city_objects.pos_y IS 'Y координата позиции'; +COMMENT ON COLUMN city_objects.pos_z IS 'Z координата позиции'; +COMMENT ON COLUMN city_objects.rot_x IS 'X компонент поворота (радианы)'; +COMMENT ON COLUMN city_objects.rot_y IS 'Y компонент поворота (радианы)'; +COMMENT ON COLUMN city_objects.rot_z IS 'Z компонент поворота (радианы)'; +COMMENT ON COLUMN city_objects.scale_x IS 'X компонент масштаба'; +COMMENT ON COLUMN city_objects.scale_y IS 'Y компонент масштаба'; +COMMENT ON COLUMN city_objects.scale_z IS 'Z компонент масштаба'; +COMMENT ON COLUMN city_objects.organization_id IS 'ID организации-владельца'; +COMMENT ON COLUMN city_objects.rent IS 'Стоимость аренды'; +COMMENT ON COLUMN city_objects.tax IS 'Налог'; +COMMENT ON COLUMN city_objects.collidable IS 'Имеет ли объект коллизию'; +COMMENT ON COLUMN city_objects.interior_id IS 'ID интерьера объекта'; +COMMENT ON COLUMN city_objects.textures IS 'Информация о текстурах'; +COMMENT ON COLUMN city_objects.created_at IS 'Время создания записи'; +COMMENT ON COLUMN city_objects.updated_at IS 'Время последнего обновления записи'; diff --git a/migrations/create_city_objects_table_minimal.sql b/migrations/create_city_objects_table_minimal.sql new file mode 100644 index 0000000..ea0a362 --- /dev/null +++ b/migrations/create_city_objects_table_minimal.sql @@ -0,0 +1,43 @@ +-- Минимальная миграция для создания таблицы city_objects +-- Файл: migrations/create_city_objects_table_minimal.sql + +-- Удаляем таблицу если существует (для пересоздания) +DROP TABLE IF EXISTS city_objects CASCADE; + +-- Создание таблицы city_objects +CREATE TABLE city_objects ( + id SERIAL PRIMARY KEY, + city_id INTEGER NOT NULL, + name VARCHAR(255) NOT NULL DEFAULT '', + model_url VARCHAR(500) NOT NULL, + + -- Позиция + pos_x DECIMAL(15, 6) NOT NULL DEFAULT 0, + pos_y DECIMAL(15, 6) NOT NULL DEFAULT 0, + pos_z DECIMAL(15, 6) NOT NULL DEFAULT 0, + + -- Поворот (в радианах) + rot_x DECIMAL(15, 6) NOT NULL DEFAULT 0, + rot_y DECIMAL(15, 6) NOT NULL DEFAULT 0, + rot_z DECIMAL(15, 6) NOT NULL DEFAULT 0, + + -- Масштаб + scale_x DECIMAL(15, 6) NOT NULL DEFAULT 1, + scale_y DECIMAL(15, 6) NOT NULL DEFAULT 1, + scale_z DECIMAL(15, 6) NOT NULL DEFAULT 1, + + -- Дополнительные свойства + organization_id INTEGER NOT NULL DEFAULT 2, + rent DECIMAL(10, 2) NOT NULL DEFAULT 0, + tax DECIMAL(10, 2) NOT NULL DEFAULT 0, + collidable BOOLEAN NOT NULL DEFAULT false, + interior_id INTEGER NOT NULL DEFAULT 101, + textures VARCHAR(500) NOT NULL DEFAULT '-' +); + +-- Создание индексов +CREATE INDEX idx_city_objects_city_id ON city_objects(city_id); +CREATE INDEX idx_city_objects_organization_id ON city_objects(organization_id); +CREATE INDEX idx_city_objects_interior_id ON city_objects(interior_id); +CREATE INDEX idx_city_objects_position ON city_objects(pos_x, pos_y, pos_z); +CREATE INDEX idx_city_objects_collidable ON city_objects(collidable); diff --git a/migrations/create_city_objects_table_simple.sql b/migrations/create_city_objects_table_simple.sql new file mode 100644 index 0000000..c26c3a3 --- /dev/null +++ b/migrations/create_city_objects_table_simple.sql @@ -0,0 +1,68 @@ +-- Простая миграция для создания таблицы city_objects +-- Файл: migrations/create_city_objects_table_simple.sql + +-- Создание таблицы city_objects +CREATE TABLE IF NOT EXISTS city_objects ( + id SERIAL PRIMARY KEY, + city_id INTEGER NOT NULL, + name VARCHAR(255) NOT NULL DEFAULT '', + model_url VARCHAR(500) NOT NULL, + + -- Позиция + pos_x DECIMAL(15, 6) NOT NULL DEFAULT 0, + pos_y DECIMAL(15, 6) NOT NULL DEFAULT 0, + pos_z DECIMAL(15, 6) NOT NULL DEFAULT 0, + + -- Поворот (в радианах) + rot_x DECIMAL(15, 6) NOT NULL DEFAULT 0, + rot_y DECIMAL(15, 6) NOT NULL DEFAULT 0, + rot_z DECIMAL(15, 6) NOT NULL DEFAULT 0, + + -- Масштаб + scale_x DECIMAL(15, 6) NOT NULL DEFAULT 1, + scale_y DECIMAL(15, 6) NOT NULL DEFAULT 1, + scale_z DECIMAL(15, 6) NOT NULL DEFAULT 1, + + -- Дополнительные свойства + organization_id INTEGER NOT NULL DEFAULT 2, + rent DECIMAL(10, 2) NOT NULL DEFAULT 0, + tax DECIMAL(10, 2) NOT NULL DEFAULT 0, + collidable BOOLEAN NOT NULL DEFAULT false, + interior_id INTEGER NOT NULL DEFAULT 101, + textures VARCHAR(500) NOT NULL DEFAULT '-', + + -- Метаданные + created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP +); + +-- Создание индексов для оптимизации запросов +CREATE INDEX IF NOT EXISTS idx_city_objects_city_id ON city_objects(city_id); +CREATE INDEX IF NOT EXISTS idx_city_objects_organization_id ON city_objects(organization_id); +CREATE INDEX IF NOT EXISTS idx_city_objects_interior_id ON city_objects(interior_id); +CREATE INDEX IF NOT EXISTS idx_city_objects_position ON city_objects(pos_x, pos_y, pos_z); +CREATE INDEX IF NOT EXISTS idx_city_objects_collidable ON city_objects(collidable); + +-- Комментарии к таблице и колонкам +COMMENT ON TABLE city_objects IS 'Таблица объектов городов'; +COMMENT ON COLUMN city_objects.id IS 'Уникальный идентификатор объекта'; +COMMENT ON COLUMN city_objects.city_id IS 'ID города, к которому принадлежит объект'; +COMMENT ON COLUMN city_objects.name IS 'Название объекта'; +COMMENT ON COLUMN city_objects.model_url IS 'URL модели объекта'; +COMMENT ON COLUMN city_objects.pos_x IS 'X координата позиции'; +COMMENT ON COLUMN city_objects.pos_y IS 'Y координата позиции'; +COMMENT ON COLUMN city_objects.pos_z IS 'Z координата позиции'; +COMMENT ON COLUMN city_objects.rot_x IS 'X компонент поворота (радианы)'; +COMMENT ON COLUMN city_objects.rot_y IS 'Y компонент поворота (радианы)'; +COMMENT ON COLUMN city_objects.rot_z IS 'Z компонент поворота (радианы)'; +COMMENT ON COLUMN city_objects.scale_x IS 'X компонент масштаба'; +COMMENT ON COLUMN city_objects.scale_y IS 'Y компонент масштаба'; +COMMENT ON COLUMN city_objects.scale_z IS 'Z компонент масштаба'; +COMMENT ON COLUMN city_objects.organization_id IS 'ID организации-владельца'; +COMMENT ON COLUMN city_objects.rent IS 'Стоимость аренды'; +COMMENT ON COLUMN city_objects.tax IS 'Налог'; +COMMENT ON COLUMN city_objects.collidable IS 'Имеет ли объект коллизию'; +COMMENT ON COLUMN city_objects.interior_id IS 'ID интерьера объекта'; +COMMENT ON COLUMN city_objects.textures IS 'Информация о текстурах'; +COMMENT ON COLUMN city_objects.created_at IS 'Время создания записи'; +COMMENT ON COLUMN city_objects.updated_at IS 'Время последнего обновления записи'; diff --git a/run-city-objects-migration.js b/run-city-objects-migration.js new file mode 100644 index 0000000..656ce3d --- /dev/null +++ b/run-city-objects-migration.js @@ -0,0 +1,50 @@ +#!/usr/bin/env node + +/** + * Скрипт для создания таблицы city_objects + * Запуск: node run-city-objects-migration.js + */ + +const fs = require('fs'); +const path = require('path'); +const db = require('./db'); + +async function runMigration() { + try { + console.log('🚀 Запуск миграции для создания таблицы city_objects...'); + + // Читаем SQL файл миграции + const migrationPath = path.join(__dirname, 'migrations', 'create_city_objects_table.sql'); + const migrationSQL = fs.readFileSync(migrationPath, 'utf8'); + + console.log('📄 Загружен файл миграции:', migrationPath); + + // Выполняем миграцию + await db.query(migrationSQL); + + console.log('✅ Миграция успешно выполнена!'); + console.log('📊 Таблица city_objects создана со всеми необходимыми индексами и триггерами'); + + // Проверяем, что таблица создалась + const { rows } = await db.query(` + SELECT table_name, column_name, data_type, is_nullable, column_default + FROM information_schema.columns + WHERE table_name = 'city_objects' + ORDER BY ordinal_position + `); + + console.log('\n📋 Структура созданной таблицы:'); + console.table(rows); + + } catch (error) { + console.error('❌ Ошибка при выполнении миграции:', error); + process.exit(1); + } finally { + // Закрываем соединение с БД + await db.end(); + console.log('🔌 Соединение с базой данных закрыто'); + } +} + +// Запускаем миграцию +runMigration(); diff --git a/run-minimal-migration.js b/run-minimal-migration.js new file mode 100644 index 0000000..743bcc5 --- /dev/null +++ b/run-minimal-migration.js @@ -0,0 +1,58 @@ +#!/usr/bin/env node + +/** + * Минимальный скрипт для создания таблицы city_objects + * Запуск: node run-minimal-migration.js + */ + +const fs = require('fs'); +const path = require('path'); +const db = require('./db'); + +async function runMigration() { + try { + console.log('🚀 Запуск минимальной миграции для создания таблицы city_objects...'); + + // Читаем минимальный SQL файл миграции + const migrationPath = path.join(__dirname, 'migrations', 'create_city_objects_table_minimal.sql'); + const migrationSQL = fs.readFileSync(migrationPath, 'utf8'); + + console.log('📄 Загружен файл миграции:', migrationPath); + + // Выполняем миграцию + await db.query(migrationSQL); + + console.log('✅ Минимальная миграция успешно выполнена!'); + console.log('📊 Таблица city_objects создана со всеми необходимыми индексами'); + + // Проверяем, что таблица создалась + const { rows } = await db.query(` + SELECT table_name, column_name, data_type, is_nullable, column_default + FROM information_schema.columns + WHERE table_name = 'city_objects' + ORDER BY ordinal_position + `); + + console.log('\n📋 Структура созданной таблицы:'); + console.table(rows); + + // Проверяем количество записей + const { rows: countRows } = await db.query('SELECT COUNT(*) as count FROM city_objects'); + console.log(`\n📈 Количество записей в таблице: ${countRows[0].count}`); + + console.log('\n✅ Миграция завершена успешно!'); + console.log('🎯 Теперь можно использовать редактор карт'); + + } catch (error) { + console.error('❌ Ошибка при выполнении миграции:', error); + console.error('💡 Попробуйте выполнить SQL вручную в pgAdmin или psql'); + process.exit(1); + } finally { + // Закрываем соединение с БД + await db.end(); + console.log('🔌 Соединение с базой данных закрыто'); + } +} + +// Запускаем миграцию +runMigration(); diff --git a/run-simple-migration.js b/run-simple-migration.js new file mode 100644 index 0000000..d392618 --- /dev/null +++ b/run-simple-migration.js @@ -0,0 +1,54 @@ +#!/usr/bin/env node + +/** + * Простой скрипт для создания таблицы city_objects + * Запуск: node run-simple-migration.js + */ + +const fs = require('fs'); +const path = require('path'); +const db = require('./db'); + +async function runMigration() { + try { + console.log('🚀 Запуск простой миграции для создания таблицы city_objects...'); + + // Читаем простой SQL файл миграции + const migrationPath = path.join(__dirname, 'migrations', 'create_city_objects_table_simple.sql'); + const migrationSQL = fs.readFileSync(migrationPath, 'utf8'); + + console.log('📄 Загружен файл миграции:', migrationPath); + + // Выполняем миграцию + await db.query(migrationSQL); + + console.log('✅ Простая миграция успешно выполнена!'); + console.log('📊 Таблица city_objects создана со всеми необходимыми индексами'); + + // Проверяем, что таблица создалась + const { rows } = await db.query(` + SELECT table_name, column_name, data_type, is_nullable, column_default + FROM information_schema.columns + WHERE table_name = 'city_objects' + ORDER BY ordinal_position + `); + + console.log('\n📋 Структура созданной таблицы:'); + console.table(rows); + + // Проверяем количество записей + const { rows: countRows } = await db.query('SELECT COUNT(*) as count FROM city_objects'); + console.log(`\n📈 Количество записей в таблице: ${countRows[0].count}`); + + } catch (error) { + console.error('❌ Ошибка при выполнении миграции:', error); + process.exit(1); + } finally { + // Закрываем соединение с БД + await db.end(); + console.log('🔌 Соединение с базой данных закрыто'); + } +} + +// Запускаем миграцию +runMigration(); diff --git a/saves/city_1_1759940277773.txt b/saves/city_1_1759940277773.txt new file mode 100644 index 0000000..150313f --- /dev/null +++ b/saves/city_1_1759940277773.txt @@ -0,0 +1,844 @@ +{ + "objects": [ + { + "id": 108, + "name": "Apartment", + "model_url": "/models/interiors/Apartment.glb", + "pos_x": -50, + "pos_y": -100, + "pos_z": 35, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 109, + "name": "Apartment2", + "model_url": "/models/interiors/Apartment2.glb", + "pos_x": -75, + "pos_y": -98.8, + "pos_z": 40, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 63, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -53.022684089320066, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 87, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 58.1904579913708, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 91, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -58.97207259328343, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 92, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -87.23030159511138, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 93, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -81.52825641321579, + "pos_y": 0.22578, + "pos_z": 29.27078796426943, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 95, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 87.88552705994904, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 82, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 28.45858490544211, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 83, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 57.93990610643077, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 85, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -0.6527787912290837, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 61, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -0.6527787912290837, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 62, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -29.96357409929672, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 86, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 28.874824485167927, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 64, + "name": "building-policestation-garage.glb", + "model_url": "/models/copied/building-policestation-garage.glb", + "pos_x": -27.423751970878307, + "pos_y": 0, + "pos_z": 15.838392995823742, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 75, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 28.241599465559343, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 76, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 57.946895801311726, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 78, + "name": "tile-mainroad-straight", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -78.34112358353988, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -1.785629723018183e-12, + "rot_y": -1.570599999999441, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 89, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -1.191836754864397, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 90, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -60.119493751365155, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 55, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -0.6583, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": -1.57065, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 56, + "name": "tile-mainroad-straight", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -53.022684089320066, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": -1.5706, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 96, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 24.643206353028262, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 97, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 54.13689638921812, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 98, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 83.76919927546638, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 99, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -90.02515975957242, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 77, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -59.69463049725025, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 79, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -78.36798686600804, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 94, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 87.66787882117411, + "pos_y": 0.22578, + "pos_z": -29.932796810647346, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 51, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -0.7859425349289495, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 52, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 28.49213398736152, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 53, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 58.34626836120699, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 84, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -30.43502101608746, + "pos_y": 0.22578, + "pos_z": -58.86841846742372, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 88, + "name": "road", + "model_url": "/models/copied/tile-road-mainroad-intersection-t.glb", + "pos_x": -30.43502101608746, + "pos_y": 0.22578, + "pos_z": -88.32620221386091, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 54, + "name": "road", + "model_url": "/models/copied/tile-road-mainroad-intersection-t.glb", + "pos_x": -30.56, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 100, + "name": "road", + "model_url": "/models/copied/tile-road-intersection.glb", + "pos_x": -30.48563054716506, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 57, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 0, + "pos_y": 0, + "pos_z": -9.9452, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 58, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": -5.6107, + "pos_y": 0, + "pos_z": -12, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 59, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 4.5914, + "pos_y": 0, + "pos_z": -12, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 60, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 7.4754, + "pos_y": 0, + "pos_z": -9.9452, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 110, + "name": "HouseInterior", + "model_url": "/models/interiors/HouseInterior.glb", + "pos_x": -30, + "pos_y": -100, + "pos_z": 5, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 67, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": -16.821115520649347, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 103, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": 38.21535483922429, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 104, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": 85.0375477463486, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 66, + "name": "building-post.glb", + "model_url": "/models/copied/building-post.glb", + "pos_x": -0.6583, + "pos_y": 0.22578, + "pos_z": 16.497853301459426, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 65, + "name": "industry-building.glb", + "model_url": "/models/copied/industry-building.glb", + "pos_x": 0, + "pos_y": 0.22578, + "pos_z": -41.9436860772972, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 68, + "name": "building-office-pyramid.glb", + "model_url": "/models/copied/building-office-pyramid.glb", + "pos_x": 19.415925844252136, + "pos_y": 0, + "pos_z": 18.376824247651257, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 69, + "name": "building-cinema.glb", + "model_url": "/models/copied/building-cinema.glb", + "pos_x": 2.8573192105015934, + "pos_y": 0, + "pos_z": -72.77167092884889, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 70, + "name": "building-policestation.glb", + "model_url": "/models/copied/building-policestation.glb", + "pos_x": -18.607680210936962, + "pos_y": 0, + "pos_z": 15.868374285910367, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 71, + "name": "building-cabin-big.glb", + "model_url": "/models/copied/building-cabin-big.glb", + "pos_x": 23.403643205836772, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 72, + "name": "building-house-modern.glb", + "model_url": "/models/copied/building-house-modern.glb", + "pos_x": 7.1585742294568835, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 73, + "name": "building-office-rounded.glb", + "model_url": "/models/copied/building-office-rounded.glb", + "pos_x": -52.30932724265092, + "pos_y": 0, + "pos_z": 15.883709720266896, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 105, + "name": "building-house-modern.glb", + "model_url": "/models/copied/building-house-modern.glb", + "pos_x": 64.0119941694064, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 74, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -45, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 80, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -65, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 81, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -85, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 101, + "name": "building-cafe.glb", + "model_url": "/models/copied/building-cafe.glb", + "pos_x": -16.673190836454722, + "pos_y": 0.05806883345290892, + "pos_z": -71.80856311211987, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 102, + "name": "data-center.glb", + "model_url": "/models/copied/data-center.glb", + "pos_x": -49.292792634687814, + "pos_y": 0, + "pos_z": -71.29135417925033, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 106, + "name": "building-cafe_int", + "model_url": "/models/interiors/bar_scene.glb", + "pos_x": -16, + "pos_y": -100, + "pos_z": -71, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "name": "building-cinema.glb_copy", + "model_url": "/models/copied/building-cinema.glb", + "pos_x": 24.782835250646734, + "pos_y": 0, + "pos_z": -72.77167092884889, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + } + ], + "removedIds": [] +} \ No newline at end of file diff --git a/saves/city_1_1759942986464.txt b/saves/city_1_1759942986464.txt new file mode 100644 index 0000000..b70e670 --- /dev/null +++ b/saves/city_1_1759942986464.txt @@ -0,0 +1,870 @@ +{ + "objects": [ + { + "id": 109, + "name": "Apartment2", + "model_url": "/models/interiors/Apartment2.glb", + "pos_x": -75, + "pos_y": -98.8, + "pos_z": 40, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 108, + "name": "Apartment", + "model_url": "/models/interiors/Apartment.glb", + "pos_x": -50, + "pos_y": -100, + "pos_z": 35, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 64, + "name": "building-policestation-garage.glb", + "model_url": "/models/copied/building-policestation-garage.glb", + "pos_x": -27.423751970878307, + "pos_y": 0, + "pos_z": 15.838392995823742, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 63, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -53.022684089320066, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 87, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 58.1904579913708, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 91, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -58.97207259328343, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 92, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -87.23030159511138, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 93, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -81.52825641321579, + "pos_y": 0.22578, + "pos_z": 29.27078796426943, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 95, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 87.88552705994904, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 82, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 28.45858490544211, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 83, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 57.93990610643077, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 85, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -0.6527787912290837, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 61, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -0.6527787912290837, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 62, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -29.96357409929672, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 86, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 28.874824485167927, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 110, + "name": "HouseInterior", + "model_url": "/models/interiors/HouseInterior.glb", + "pos_x": -30, + "pos_y": -100, + "pos_z": 5, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 75, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 28.241599465559343, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 76, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 57.946895801311726, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 78, + "name": "tile-mainroad-straight", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -78.34112358353988, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -1.785629723018183e-12, + "rot_y": -1.570599999999441, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 89, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -1.191836754864397, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 90, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -60.119493751365155, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 55, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -0.6583, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": -1.57065, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 56, + "name": "tile-mainroad-straight", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -53.022684089320066, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": -1.5706, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 96, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 24.643206353028262, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 97, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 54.13689638921812, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 98, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 83.76919927546638, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 99, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -90.02515975957242, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 77, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -59.69463049725025, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 79, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -78.36798686600804, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 94, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 87.66787882117411, + "pos_y": 0.22578, + "pos_z": -29.932796810647346, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 51, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -0.7859425349289495, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 52, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 28.49213398736152, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 53, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 58.34626836120699, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 84, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -30.43502101608746, + "pos_y": 0.22578, + "pos_z": -58.86841846742372, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 88, + "name": "road", + "model_url": "/models/copied/tile-road-mainroad-intersection-t.glb", + "pos_x": -30.43502101608746, + "pos_y": 0.22578, + "pos_z": -88.32620221386091, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 54, + "name": "road", + "model_url": "/models/copied/tile-road-mainroad-intersection-t.glb", + "pos_x": -30.56, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 100, + "name": "road", + "model_url": "/models/copied/tile-road-intersection.glb", + "pos_x": -30.48563054716506, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 57, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 0, + "pos_y": 0, + "pos_z": -9.9452, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 58, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": -5.6107, + "pos_y": 0, + "pos_z": -12, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 59, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 4.5914, + "pos_y": 0, + "pos_z": -12, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 60, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 7.4754, + "pos_y": 0, + "pos_z": -9.9452, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 65, + "name": "industry-building.glb", + "model_url": "/models/copied/industry-building.glb", + "pos_x": -15.380137446932416, + "pos_y": 0.22578, + "pos_z": -41.9436860772972, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 67, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": -16.821115520649347, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 103, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": 38.21535483922429, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 104, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": 85.0375477463486, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 68, + "name": "building-office-pyramid.glb", + "model_url": "/models/copied/building-office-pyramid.glb", + "pos_x": 19.415925844252136, + "pos_y": 0, + "pos_z": 18.376824247651257, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 70, + "name": "building-policestation.glb", + "model_url": "/models/copied/building-policestation.glb", + "pos_x": -18.607680210936962, + "pos_y": 0, + "pos_z": 15.868374285910367, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 69, + "name": "building-cinema.glb", + "model_url": "/models/copied/building-cinema.glb", + "pos_x": 2.8573192105015934, + "pos_y": 0, + "pos_z": -72.77167092884889, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 71, + "name": "building-cabin-big.glb", + "model_url": "/models/copied/building-cabin-big.glb", + "pos_x": 22.203643205836755, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 72, + "name": "building-house-modern.glb", + "model_url": "/models/copied/building-house-modern.glb", + "pos_x": 7.1585742294568835, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 105, + "name": "building-house-modern.glb", + "model_url": "/models/copied/building-house-modern.glb", + "pos_x": 64.0119941694064, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 73, + "name": "building-office-rounded.glb", + "model_url": "/models/copied/building-office-rounded.glb", + "pos_x": -52.30932724265092, + "pos_y": 0, + "pos_z": 15.883709720266896, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 74, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -45, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 81, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -85, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 80, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -65, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 101, + "name": "building-cafe.glb", + "model_url": "/models/copied/building-cafe.glb", + "pos_x": -16.673190836454722, + "pos_y": 0.05806883345290892, + "pos_z": -71.80856311211987, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 102, + "name": "data-center.glb", + "model_url": "/models/copied/data-center.glb", + "pos_x": -49.292792634687814, + "pos_y": 0, + "pos_z": -71.29135417925033, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 66, + "name": "building-post.glb", + "model_url": "/models/copied/building-post.glb", + "pos_x": -0.6583, + "pos_y": 0.22578, + "pos_z": 16.497853301459426, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "id": 106, + "name": "building-cafe_int", + "model_url": "/models/interiors/bar_scene.glb", + "pos_x": -16, + "pos_y": -100, + "pos_z": -71, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "name": "industry-building.glb_copy", + "model_url": "/models/copied/industry-building.glb", + "pos_x": 10.287143598977302, + "pos_y": 0.22578, + "pos_z": -41.9436860772972, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "name": "industry-building.glb_copy", + "model_url": "/models/copied/industry-building.glb", + "pos_x": 34.94669620868636, + "pos_y": 0.22578, + "pos_z": -41.9436860772972, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + }, + { + "name": "industry-building.glb_copy", + "model_url": "/models/copied/industry-building.glb", + "pos_x": 60.8544602660265, + "pos_y": 0.22578, + "pos_z": -41.9436860772972, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + } + ], + "removedIds": [] +} \ No newline at end of file diff --git a/saves/city_1_1759943407224.txt b/saves/city_1_1759943407224.txt new file mode 100644 index 0000000..d151fab --- /dev/null +++ b/saves/city_1_1759943407224.txt @@ -0,0 +1,844 @@ +{ + "objects": [ + { + "id": 108, + "name": "Apartment", + "model_url": "/models/interiors/Apartment.glb", + "pos_x": -50, + "pos_y": -100, + "pos_z": 35, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "5", + "scale_y": "5", + "scale_z": "5" + }, + { + "id": 109, + "name": "Apartment2", + "model_url": "/models/interiors/Apartment2.glb", + "pos_x": -75, + "pos_y": -98.8, + "pos_z": 40, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "5", + "scale_y": "5", + "scale_z": "5" + }, + { + "id": 63, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -53.022684089320066, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 87, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 58.1904579913708, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 91, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -58.97207259328343, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 92, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -87.23030159511138, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 93, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -81.52825641321579, + "pos_y": 0.22578, + "pos_z": 29.27078796426943, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 95, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 87.88552705994904, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 82, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 28.45858490544211, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 83, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 57.93990610643077, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 85, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -0.6527787912290837, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 61, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -0.6527787912290837, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 62, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -29.96357409929672, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 86, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 28.874824485167927, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 64, + "name": "building-policestation-garage.glb", + "model_url": "/models/copied/building-policestation-garage.glb", + "pos_x": -27.423751970878307, + "pos_y": 0, + "pos_z": 15.838392995823742, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 110, + "name": "HouseInterior", + "model_url": "/models/interiors/HouseInterior.glb", + "pos_x": -30, + "pos_y": -100, + "pos_z": 5, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 75, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 28.241599465559343, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 76, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 57.946895801311726, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 78, + "name": "tile-mainroad-straight", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -78.34112358353988, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -1.785629723018183e-12, + "rot_y": -1.570599999999441, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 89, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -1.191836754864397, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 90, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -60.119493751365155, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 55, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -0.6583, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": -1.57065, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 56, + "name": "tile-mainroad-straight", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -53.022684089320066, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": -1.5706, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 96, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 24.643206353028262, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 97, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 54.13689638921812, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 98, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 83.76919927546638, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 99, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -90.02515975957242, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 77, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -59.69463049725025, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 79, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -78.36798686600804, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 94, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 87.66787882117411, + "pos_y": 0.22578, + "pos_z": -29.932796810647346, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 51, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -0.7859425349289495, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 52, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 28.49213398736152, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 53, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 58.34626836120699, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 84, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -30.43502101608746, + "pos_y": 0.22578, + "pos_z": -58.86841846742372, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 88, + "name": "road", + "model_url": "/models/copied/tile-road-mainroad-intersection-t.glb", + "pos_x": -30.43502101608746, + "pos_y": 0.22578, + "pos_z": -88.32620221386091, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 54, + "name": "road", + "model_url": "/models/copied/tile-road-mainroad-intersection-t.glb", + "pos_x": -30.56, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 100, + "name": "road", + "model_url": "/models/copied/tile-road-intersection.glb", + "pos_x": -30.48563054716506, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 57, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 0, + "pos_y": 0, + "pos_z": -9.9452, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 58, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": -5.6107, + "pos_y": 0, + "pos_z": -12, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 59, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 4.5914, + "pos_y": 0, + "pos_z": -12, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 60, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 7.4754, + "pos_y": 0, + "pos_z": -9.9452, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 67, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": -16.821115520649347, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 103, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": 38.21535483922429, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 104, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": 85.0375477463486, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 65, + "name": "industry-building.glb", + "model_url": "/models/copied/industry-building.glb", + "pos_x": 0, + "pos_y": 0.22578, + "pos_z": -41.9436860772972, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 66, + "name": "building-post.glb", + "model_url": "/models/copied/building-post.glb", + "pos_x": -0.6583, + "pos_y": 0.22578, + "pos_z": 16.497853301459426, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 68, + "name": "building-office-pyramid.glb", + "model_url": "/models/copied/building-office-pyramid.glb", + "pos_x": 19.415925844252136, + "pos_y": 0, + "pos_z": 18.376824247651257, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 69, + "name": "building-cinema.glb", + "model_url": "/models/copied/building-cinema.glb", + "pos_x": 2.8573192105015934, + "pos_y": 0, + "pos_z": -72.77167092884889, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 70, + "name": "building-policestation.glb", + "model_url": "/models/copied/building-policestation.glb", + "pos_x": -18.607680210936962, + "pos_y": 0, + "pos_z": 15.868374285910367, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 71, + "name": "building-cabin-big.glb", + "model_url": "/models/copied/building-cabin-big.glb", + "pos_x": 22.203643205836755, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 72, + "name": "building-house-modern.glb", + "model_url": "/models/copied/building-house-modern.glb", + "pos_x": 7.1585742294568835, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 105, + "name": "building-house-modern.glb", + "model_url": "/models/copied/building-house-modern.glb", + "pos_x": 64.0119941694064, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 73, + "name": "building-office-rounded.glb", + "model_url": "/models/copied/building-office-rounded.glb", + "pos_x": -52.30932724265092, + "pos_y": 0, + "pos_z": 15.883709720266896, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 74, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -45, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 80, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -65, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 81, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -85, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 102, + "name": "data-center.glb", + "model_url": "/models/copied/data-center.glb", + "pos_x": -49.292792634687814, + "pos_y": 0, + "pos_z": -71.29135417925033, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 101, + "name": "building-cafe.glb", + "model_url": "/models/copied/building-cafe.glb", + "pos_x": -16.673190836454722, + "pos_y": 0.05806883345290892, + "pos_z": -71.80856311211987, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 106, + "name": "building-cafe_int", + "model_url": "/models/interiors/bar_scene.glb", + "pos_x": -16, + "pos_y": -100, + "pos_z": -71, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "0.35", + "scale_y": "0.35", + "scale_z": "0.35" + }, + { + "name": "building-house-modern-big.glb_copy", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": 28.988434401953725, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + } + ], + "removedIds": [] +} \ No newline at end of file diff --git a/saves/city_1_1759943545445.txt b/saves/city_1_1759943545445.txt new file mode 100644 index 0000000..e5c8b7e --- /dev/null +++ b/saves/city_1_1759943545445.txt @@ -0,0 +1,845 @@ +{ + "objects": [ + { + "id": 108, + "name": "Apartment", + "model_url": "/models/interiors/Apartment.glb", + "pos_x": -50, + "pos_y": -100, + "pos_z": 35, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "5", + "scale_y": "5", + "scale_z": "5" + }, + { + "id": 109, + "name": "Apartment2", + "model_url": "/models/interiors/Apartment2.glb", + "pos_x": -75, + "pos_y": -98.8, + "pos_z": 40, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "5", + "scale_y": "5", + "scale_z": "5" + }, + { + "id": 63, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -53.022684089320066, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 87, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 58.1904579913708, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 91, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -58.97207259328343, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 92, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -87.23030159511138, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 93, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -81.52825641321579, + "pos_y": 0.22578, + "pos_z": 29.27078796426943, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 95, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 87.88552705994904, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 82, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 28.45858490544211, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 83, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 57.93990610643077, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 85, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -0.6527787912290837, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 61, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -0.6527787912290837, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 62, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -29.96357409929672, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 86, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 28.874824485167927, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 64, + "name": "building-policestation-garage.glb", + "model_url": "/models/copied/building-policestation-garage.glb", + "pos_x": -27.423751970878307, + "pos_y": 0, + "pos_z": 15.838392995823742, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 75, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 28.241599465559343, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 76, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 57.946895801311726, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 78, + "name": "tile-mainroad-straight", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -78.34112358353988, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -1.785629723018183e-12, + "rot_y": -1.570599999999441, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 89, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -1.191836754864397, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 90, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -60.119493751365155, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 55, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -0.6583, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": -1.57065, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 56, + "name": "tile-mainroad-straight", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -53.022684089320066, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": -1.5706, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 96, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 24.643206353028262, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 97, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 54.13689638921812, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 98, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 83.76919927546638, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 99, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -90.02515975957242, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 77, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -59.69463049725025, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 79, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -78.36798686600804, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 94, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 87.66787882117411, + "pos_y": 0.22578, + "pos_z": -29.932796810647346, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 51, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -0.7859425349289495, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 52, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 28.49213398736152, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 53, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 58.34626836120699, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 84, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -30.43502101608746, + "pos_y": 0.22578, + "pos_z": -58.86841846742372, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 88, + "name": "road", + "model_url": "/models/copied/tile-road-mainroad-intersection-t.glb", + "pos_x": -30.43502101608746, + "pos_y": 0.22578, + "pos_z": -88.32620221386091, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 54, + "name": "road", + "model_url": "/models/copied/tile-road-mainroad-intersection-t.glb", + "pos_x": -30.56, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 110, + "name": "HouseInterior", + "model_url": "/models/interiors/HouseInterior.glb", + "pos_x": -30, + "pos_y": -100, + "pos_z": 5, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 100, + "name": "road", + "model_url": "/models/copied/tile-road-intersection.glb", + "pos_x": -30.48563054716506, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 57, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 0, + "pos_y": 0, + "pos_z": -9.9452, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 58, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": -5.6107, + "pos_y": 0, + "pos_z": -12, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 59, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 4.5914, + "pos_y": 0, + "pos_z": -12, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 60, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 7.4754, + "pos_y": 0, + "pos_z": -9.9452, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 67, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": -16.821115520649347, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 103, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": 38.21535483922429, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 104, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": 85.0375477463486, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 65, + "name": "industry-building.glb", + "model_url": "/models/copied/industry-building.glb", + "pos_x": 0, + "pos_y": 0.22578, + "pos_z": -41.9436860772972, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 66, + "name": "building-post.glb", + "model_url": "/models/copied/building-post.glb", + "pos_x": -0.6583, + "pos_y": 0.22578, + "pos_z": 16.497853301459426, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 69, + "name": "building-cinema.glb", + "model_url": "/models/copied/building-cinema.glb", + "pos_x": 2.8573192105015934, + "pos_y": 0, + "pos_z": -72.77167092884889, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 68, + "name": "building-office-pyramid.glb", + "model_url": "/models/copied/building-office-pyramid.glb", + "pos_x": 19.415925844252136, + "pos_y": 0, + "pos_z": 18.376824247651257, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 105, + "name": "building-house-modern.glb", + "model_url": "/models/copied/building-house-modern.glb", + "pos_x": 64.0119941694064, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 71, + "name": "building-cabin-big.glb", + "model_url": "/models/copied/building-cabin-big.glb", + "pos_x": 22.203643205836755, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 70, + "name": "building-policestation.glb", + "model_url": "/models/copied/building-policestation.glb", + "pos_x": -18.607680210936962, + "pos_y": 0, + "pos_z": 15.868374285910367, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 73, + "name": "building-office-rounded.glb", + "model_url": "/models/copied/building-office-rounded.glb", + "pos_x": -52.30932724265092, + "pos_y": 0, + "pos_z": 15.883709720266896, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 72, + "name": "building-house-modern.glb", + "model_url": "/models/copied/building-house-modern.glb", + "pos_x": 7.1585742294568835, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 80, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -65, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 81, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -85, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 74, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -45, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 102, + "name": "data-center.glb", + "model_url": "/models/copied/data-center.glb", + "pos_x": -49.292792634687814, + "pos_y": 0, + "pos_z": -71.29135417925033, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 101, + "name": "building-cafe.glb", + "model_url": "/models/copied/building-cafe.glb", + "pos_x": -16.673190836454722, + "pos_y": 0.05806883345290892, + "pos_z": -71.80856311211987, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 106, + "name": "building-cafe_int", + "model_url": "/models/interiors/bar_scene.glb", + "pos_x": -16, + "pos_y": -100, + "pos_z": -71, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "0.35", + "scale_y": "0.35", + "scale_z": "0.35" + }, + { + "id": 107, + "name": "bench-forest.glb", + "model_url": "/models/copied/bench-forest.glb", + "pos_x": 46.30092962214616, + "pos_y": -5.678365161053161, + "pos_z": 16.66887032489769, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + } + ], + "removedIds": [] +} \ No newline at end of file diff --git a/saves/city_1_1759943997101.txt b/saves/city_1_1759943997101.txt new file mode 100644 index 0000000..70d7a04 --- /dev/null +++ b/saves/city_1_1759943997101.txt @@ -0,0 +1,858 @@ +{ + "objects": [ + { + "id": 109, + "name": "Apartment2", + "model_url": "/models/interiors/Apartment2.glb", + "pos_x": -75, + "pos_y": -98.8, + "pos_z": 40, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "5", + "scale_y": "5", + "scale_z": "5" + }, + { + "id": 107, + "name": "bench-forest.glb", + "model_url": "/models/copied/bench-forest.glb", + "pos_x": 90.1649895833779, + "pos_y": 90.16498958337793, + "pos_z": 90.16498958337792, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 108, + "name": "Apartment", + "model_url": "/models/interiors/Apartment.glb", + "pos_x": -50, + "pos_y": -100, + "pos_z": 35, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "5", + "scale_y": "5", + "scale_z": "5" + }, + { + "id": 63, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -53.022684089320066, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 87, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 58.1904579913708, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 91, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -58.97207259328343, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 92, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -87.23030159511138, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 93, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -81.52825641321579, + "pos_y": 0.22578, + "pos_z": 29.27078796426943, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 95, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 87.88552705994904, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 82, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 28.45858490544211, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 83, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 57.93990610643077, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 85, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -0.6527787912290837, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 61, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -0.6527787912290837, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 62, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -29.96357409929672, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 86, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 28.874824485167927, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 64, + "name": "building-policestation-garage.glb", + "model_url": "/models/copied/building-policestation-garage.glb", + "pos_x": -27.423751970878307, + "pos_y": 0, + "pos_z": 15.838392995823742, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 75, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 28.241599465559343, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 76, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 57.946895801311726, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 78, + "name": "tile-mainroad-straight", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -78.34112358353988, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -1.785629723018183e-12, + "rot_y": -1.570599999999441, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 89, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -1.191836754864397, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 90, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -60.119493751365155, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 55, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -0.6583, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": -1.57065, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 56, + "name": "tile-mainroad-straight", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -53.022684089320066, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": -1.5706, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 96, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 24.643206353028262, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 97, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 54.13689638921812, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 98, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 83.76919927546638, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 99, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -90.02515975957242, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 77, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -59.69463049725025, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 79, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -78.36798686600804, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 94, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 87.66787882117411, + "pos_y": 0.22578, + "pos_z": -29.932796810647346, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 51, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -0.7859425349289495, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 52, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 28.49213398736152, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 53, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 58.34626836120699, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 84, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -30.43502101608746, + "pos_y": 0.22578, + "pos_z": -58.86841846742372, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 88, + "name": "road", + "model_url": "/models/copied/tile-road-mainroad-intersection-t.glb", + "pos_x": -30.43502101608746, + "pos_y": 0.22578, + "pos_z": -88.32620221386091, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 54, + "name": "road", + "model_url": "/models/copied/tile-road-mainroad-intersection-t.glb", + "pos_x": -30.56, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 100, + "name": "road", + "model_url": "/models/copied/tile-road-intersection.glb", + "pos_x": -30.48563054716506, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 57, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 0, + "pos_y": 0, + "pos_z": -9.9452, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 58, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": -5.6107, + "pos_y": 0, + "pos_z": -12, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 59, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 4.5914, + "pos_y": 0, + "pos_z": -12, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 60, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 7.4754, + "pos_y": 0, + "pos_z": -9.9452, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 110, + "name": "HouseInterior", + "model_url": "/models/interiors/HouseInterior.glb", + "pos_x": -30, + "pos_y": -100, + "pos_z": 5, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 103, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": 38.21535483922429, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 67, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": -16.821115520649347, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 104, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": 85.0375477463486, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 66, + "name": "building-post.glb", + "model_url": "/models/copied/building-post.glb", + "pos_x": -0.6583, + "pos_y": 0.22578, + "pos_z": 16.497853301459426, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 65, + "name": "industry-building.glb", + "model_url": "/models/copied/industry-building.glb", + "pos_x": 0, + "pos_y": 0.22578, + "pos_z": -41.9436860772972, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 68, + "name": "building-office-pyramid.glb", + "model_url": "/models/copied/building-office-pyramid.glb", + "pos_x": 19.415925844252136, + "pos_y": 0, + "pos_z": 18.376824247651257, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 69, + "name": "building-cinema.glb", + "model_url": "/models/copied/building-cinema.glb", + "pos_x": 2.8573192105015934, + "pos_y": 0, + "pos_z": -72.77167092884889, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 70, + "name": "building-policestation.glb", + "model_url": "/models/copied/building-policestation.glb", + "pos_x": -18.607680210936962, + "pos_y": 0, + "pos_z": 15.868374285910367, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 71, + "name": "building-cabin-big.glb", + "model_url": "/models/copied/building-cabin-big.glb", + "pos_x": 22.203643205836755, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 72, + "name": "building-house-modern.glb", + "model_url": "/models/copied/building-house-modern.glb", + "pos_x": 7.1585742294568835, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 105, + "name": "building-house-modern.glb", + "model_url": "/models/copied/building-house-modern.glb", + "pos_x": 64.0119941694064, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 73, + "name": "building-office-rounded.glb", + "model_url": "/models/copied/building-office-rounded.glb", + "pos_x": -52.30932724265092, + "pos_y": 0, + "pos_z": 15.883709720266896, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 74, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -45, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 80, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -65, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 81, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -85, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 101, + "name": "building-cafe.glb", + "model_url": "/models/copied/building-cafe.glb", + "pos_x": -16.673190836454722, + "pos_y": 0.05806883345290892, + "pos_z": -71.80856311211987, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 102, + "name": "data-center.glb", + "model_url": "/models/copied/data-center.glb", + "pos_x": -49.292792634687814, + "pos_y": 0, + "pos_z": -71.29135417925033, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 106, + "name": "building-cafe_int", + "model_url": "/models/interiors/bar_scene.glb", + "pos_x": -16, + "pos_y": -100, + "pos_z": -71, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "0.35", + "scale_y": "0.35", + "scale_z": "0.35" + }, + { + "name": "industry-building.glb_copy", + "model_url": "/models/copied/industry-building.glb", + "pos_x": 28.23817863777715, + "pos_y": 0.22578, + "pos_z": -41.9436860772972, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + } + ], + "removedIds": [] +} \ No newline at end of file diff --git a/saves/city_1_1759944381024.txt b/saves/city_1_1759944381024.txt new file mode 100644 index 0000000..e0ac8ce --- /dev/null +++ b/saves/city_1_1759944381024.txt @@ -0,0 +1,858 @@ +{ + "objects": [ + { + "id": 107, + "name": "bench-forest.glb", + "model_url": "/models/copied/bench-forest.glb", + "pos_x": 90.1649895833779, + "pos_y": 90.16498958337793, + "pos_z": 90.16498958337792, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 108, + "name": "Apartment", + "model_url": "/models/interiors/Apartment.glb", + "pos_x": -50, + "pos_y": -100, + "pos_z": 35, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "5", + "scale_y": "5", + "scale_z": "5" + }, + { + "id": 109, + "name": "Apartment2", + "model_url": "/models/interiors/Apartment2.glb", + "pos_x": -75, + "pos_y": -98.8, + "pos_z": 40, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "5", + "scale_y": "5", + "scale_z": "5" + }, + { + "id": 63, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -53.022684089320066, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 87, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 58.1904579913708, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 91, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -58.97207259328343, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 92, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -87.23030159511138, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 93, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -81.52825641321579, + "pos_y": 0.22578, + "pos_z": 29.27078796426943, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 95, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 87.88552705994904, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 82, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 28.45858490544211, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 83, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 57.93990610643077, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 85, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -0.6527787912290837, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 61, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -0.6527787912290837, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 62, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -29.96357409929672, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 86, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 28.874824485167927, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 64, + "name": "building-policestation-garage.glb", + "model_url": "/models/copied/building-policestation-garage.glb", + "pos_x": -27.423751970878307, + "pos_y": 0, + "pos_z": 15.838392995823742, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 75, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 28.241599465559343, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 76, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 57.946895801311726, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 78, + "name": "tile-mainroad-straight", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -78.34112358353988, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -1.785629723018183e-12, + "rot_y": -1.570599999999441, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 89, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -1.191836754864397, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 90, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -60.119493751365155, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 55, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -0.6583, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": -1.57065, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 56, + "name": "tile-mainroad-straight", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -53.022684089320066, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": -1.5706, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 96, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 24.643206353028262, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 97, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 54.13689638921812, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 98, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 83.76919927546638, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 99, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -90.02515975957242, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 77, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -59.69463049725025, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 79, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -78.36798686600804, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 94, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 87.66787882117411, + "pos_y": 0.22578, + "pos_z": -29.932796810647346, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 51, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -0.7859425349289495, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 52, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 28.49213398736152, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 53, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 58.34626836120699, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 84, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -30.43502101608746, + "pos_y": 0.22578, + "pos_z": -58.86841846742372, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 88, + "name": "road", + "model_url": "/models/copied/tile-road-mainroad-intersection-t.glb", + "pos_x": -30.43502101608746, + "pos_y": 0.22578, + "pos_z": -88.32620221386091, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 54, + "name": "road", + "model_url": "/models/copied/tile-road-mainroad-intersection-t.glb", + "pos_x": -30.56, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 100, + "name": "road", + "model_url": "/models/copied/tile-road-intersection.glb", + "pos_x": -30.48563054716506, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 57, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 0, + "pos_y": 0, + "pos_z": -9.9452, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 58, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": -5.6107, + "pos_y": 0, + "pos_z": -12, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 59, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 4.5914, + "pos_y": 0, + "pos_z": -12, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 60, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 7.4754, + "pos_y": 0, + "pos_z": -9.9452, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 110, + "name": "HouseInterior", + "model_url": "/models/interiors/HouseInterior.glb", + "pos_x": -30, + "pos_y": -100, + "pos_z": 5, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 104, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": 85.0375477463486, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 66, + "name": "building-post.glb", + "model_url": "/models/copied/building-post.glb", + "pos_x": -0.6583, + "pos_y": 0.22578, + "pos_z": 16.497853301459426, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 68, + "name": "building-office-pyramid.glb", + "model_url": "/models/copied/building-office-pyramid.glb", + "pos_x": 19.415925844252136, + "pos_y": 0, + "pos_z": 18.376824247651257, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 69, + "name": "building-cinema.glb", + "model_url": "/models/copied/building-cinema.glb", + "pos_x": 2.8573192105015934, + "pos_y": 0, + "pos_z": -72.77167092884889, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 70, + "name": "building-policestation.glb", + "model_url": "/models/copied/building-policestation.glb", + "pos_x": -18.607680210936962, + "pos_y": 0, + "pos_z": 15.868374285910367, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 71, + "name": "building-cabin-big.glb", + "model_url": "/models/copied/building-cabin-big.glb", + "pos_x": 22.203643205836755, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 72, + "name": "building-house-modern.glb", + "model_url": "/models/copied/building-house-modern.glb", + "pos_x": 7.1585742294568835, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 105, + "name": "building-house-modern.glb", + "model_url": "/models/copied/building-house-modern.glb", + "pos_x": 64.0119941694064, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 65, + "name": "industry-building.glb", + "model_url": "/models/copied/industry-building.glb", + "pos_x": -6.924177538527228, + "pos_y": 0.22578, + "pos_z": -41.9436860772972, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 73, + "name": "building-office-rounded.glb", + "model_url": "/models/copied/building-office-rounded.glb", + "pos_x": -52.30932724265092, + "pos_y": 0, + "pos_z": 15.883709720266896, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 67, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": -16.821115520649347, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 74, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -45, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 101, + "name": "building-cafe.glb", + "model_url": "/models/copied/building-cafe.glb", + "pos_x": -16.673190836454722, + "pos_y": 0.05806883345290892, + "pos_z": -71.80856311211987, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 81, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -85, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 102, + "name": "data-center.glb", + "model_url": "/models/copied/data-center.glb", + "pos_x": -49.292792634687814, + "pos_y": 0, + "pos_z": -71.29135417925033, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 80, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -65, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 103, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": 38.21535483922429, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 106, + "name": "building-cafe_int", + "model_url": "/models/interiors/bar_scene.glb", + "pos_x": -16, + "pos_y": -100, + "pos_z": -71, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "0.35", + "scale_y": "0.35", + "scale_z": "0.35" + }, + { + "name": "industry-building.glb_copy", + "model_url": "/models/copied/industry-building.glb", + "pos_x": 21.049163021017154, + "pos_y": 0.22578, + "pos_z": -41.9436860772972, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + } + ], + "removedIds": [] +} \ No newline at end of file diff --git a/saves/city_1_1759944600793.txt b/saves/city_1_1759944600793.txt new file mode 100644 index 0000000..1d1db34 --- /dev/null +++ b/saves/city_1_1759944600793.txt @@ -0,0 +1,858 @@ +{ + "objects": [ + { + "id": 107, + "name": "bench-forest.glb", + "model_url": "/models/copied/bench-forest.glb", + "pos_x": 90.1649895833779, + "pos_y": 90.16498958337793, + "pos_z": 90.16498958337792, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 63, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -53.022684089320066, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 87, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 58.1904579913708, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 91, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -58.97207259328343, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 92, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -87.23030159511138, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 93, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -81.52825641321579, + "pos_y": 0.22578, + "pos_z": 29.27078796426943, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 95, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 87.88552705994904, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 82, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 28.45858490544211, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 83, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 57.93990610643077, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 85, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -0.6527787912290837, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 61, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -0.6527787912290837, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 62, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": -29.96357409929672, + "pos_y": 0.22578, + "pos_z": 28.600685124690344, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 86, + "name": "tile-plain_grass.glb", + "model_url": "/models/copied/tile-plain_grass.glb", + "pos_x": 28.874824485167927, + "pos_y": 0.22578, + "pos_z": -58.424927439019825, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 108, + "name": "Apartment", + "model_url": "/models/interiors/Apartment.glb", + "pos_x": -50, + "pos_y": -100, + "pos_z": 35, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "5", + "scale_y": "5", + "scale_z": "5" + }, + { + "id": 109, + "name": "Apartment2", + "model_url": "/models/interiors/Apartment2.glb", + "pos_x": -75, + "pos_y": -98.8, + "pos_z": 40, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "5", + "scale_y": "5", + "scale_z": "5" + }, + { + "id": 110, + "name": "HouseInterior", + "model_url": "/models/interiors/HouseInterior.glb", + "pos_x": -30, + "pos_y": -100, + "pos_z": 5, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 64, + "name": "building-policestation-garage.glb", + "model_url": "/models/copied/building-policestation-garage.glb", + "pos_x": -27.423751970878307, + "pos_y": 0, + "pos_z": 15.838392995823742, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 75, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 28.241599465559343, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 76, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 57.946895801311726, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 78, + "name": "tile-mainroad-straight", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -78.34112358353988, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": -1.785629723018183e-12, + "rot_y": -1.570599999999441, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 89, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -1.191836754864397, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 90, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -60.119493751365155, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 55, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -0.6583, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": -1.57065, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 56, + "name": "tile-mainroad-straight", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -53.022684089320066, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": -1.5706, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 96, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 24.643206353028262, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 97, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 54.13689638921812, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 98, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": 83.76919927546638, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 99, + "name": "road", + "model_url": "/models/copied/tile-mainroad-straight.glb", + "pos_x": -90.02515975957242, + "pos_y": 0.22578, + "pos_z": -88.23864067432326, + "rot_x": -9.919275836140717e-13, + "rot_y": -1.570649999999569, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 77, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -59.69463049725025, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 79, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -78.36798686600804, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 94, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 87.66787882117411, + "pos_y": 0.22578, + "pos_z": -29.932796810647346, + "rot_x": 0, + "rot_y": -1.5706000000000067, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 51, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -0.7859425349289495, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 52, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 28.49213398736152, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 53, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": 58.34626836120699, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 84, + "name": "tile-road-straight.glb", + "model_url": "/models/copied/tile-road-straight.glb", + "pos_x": -30.43502101608746, + "pos_y": 0.22578, + "pos_z": -58.86841846742372, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 88, + "name": "road", + "model_url": "/models/copied/tile-road-mainroad-intersection-t.glb", + "pos_x": -30.43502101608746, + "pos_y": 0.22578, + "pos_z": -88.32620221386091, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 54, + "name": "road", + "model_url": "/models/copied/tile-road-mainroad-intersection-t.glb", + "pos_x": -30.56, + "pos_y": 0.22578, + "pos_z": 0, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 100, + "name": "road", + "model_url": "/models/copied/tile-road-intersection.glb", + "pos_x": -30.48563054716506, + "pos_y": 0.22578, + "pos_z": -30.0096, + "rot_x": 0, + "rot_y": -1.5706, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 57, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 0, + "pos_y": 0, + "pos_z": -9.9452, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 58, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": -5.6107, + "pos_y": 0, + "pos_z": -12, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 59, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 4.5914, + "pos_y": 0, + "pos_z": -12, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 60, + "name": "tree-beech.glb", + "model_url": "/models/copied/tree-beech.glb", + "pos_x": 7.4754, + "pos_y": 0, + "pos_z": -9.9452, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 67, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": -16.821115520649347, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 103, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": 38.21535483922429, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 104, + "name": "building-house-modern-big.glb", + "model_url": "/models/copied/building-house-modern-big.glb", + "pos_x": 85.0375477463486, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 65, + "name": "industry-building.glb", + "model_url": "/models/copied/industry-building.glb", + "pos_x": 1.2272702742845656, + "pos_y": 0.22578, + "pos_z": -41.9436860772972, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 66, + "name": "building-post.glb", + "model_url": "/models/copied/building-post.glb", + "pos_x": -0.6583, + "pos_y": 0.22578, + "pos_z": 16.497853301459426, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 68, + "name": "building-office-pyramid.glb", + "model_url": "/models/copied/building-office-pyramid.glb", + "pos_x": 19.415925844252136, + "pos_y": 0, + "pos_z": 18.376824247651257, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 69, + "name": "building-cinema.glb", + "model_url": "/models/copied/building-cinema.glb", + "pos_x": 2.8573192105015934, + "pos_y": 0, + "pos_z": -72.77167092884889, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 71, + "name": "building-cabin-big.glb", + "model_url": "/models/copied/building-cabin-big.glb", + "pos_x": 22.203643205836755, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 70, + "name": "building-policestation.glb", + "model_url": "/models/copied/building-policestation.glb", + "pos_x": -18.607680210936962, + "pos_y": 0, + "pos_z": 15.868374285910367, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 72, + "name": "building-house-modern.glb", + "model_url": "/models/copied/building-house-modern.glb", + "pos_x": 7.1585742294568835, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 105, + "name": "building-house-modern.glb", + "model_url": "/models/copied/building-house-modern.glb", + "pos_x": 64.0119941694064, + "pos_y": 0, + "pos_z": -18.561659223223405, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 73, + "name": "building-office-rounded.glb", + "model_url": "/models/copied/building-office-rounded.glb", + "pos_x": -52.30932724265092, + "pos_y": 0, + "pos_z": 15.883709720266896, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 74, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -45, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 80, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -65, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 81, + "name": "building-block-5floor.glb", + "model_url": "/models/copied/building-block-5floor.glb", + "pos_x": -85, + "pos_y": 0, + "pos_z": -16.6395979611043, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 102, + "name": "data-center.glb", + "model_url": "/models/copied/data-center.glb", + "pos_x": -49.292792634687814, + "pos_y": 0, + "pos_z": -71.29135417925033, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 101, + "name": "building-cafe.glb", + "model_url": "/models/copied/building-cafe.glb", + "pos_x": -16.673190836454722, + "pos_y": 0.05806883345290892, + "pos_z": -71.80856311211987, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "1", + "scale_y": "1", + "scale_z": "1" + }, + { + "id": 106, + "name": "building-cafe_int", + "model_url": "/models/interiors/bar_scene.glb", + "pos_x": -16, + "pos_y": -100, + "pos_z": -71, + "rot_x": 3.1415, + "rot_y": 0, + "rot_z": 3.1415, + "scale_x": "0.35", + "scale_y": "0.35", + "scale_z": "0.35" + }, + { + "name": "industry-building.glb_copy", + "model_url": "/models/copied/industry-building.glb", + "pos_x": 33.624, + "pos_y": 0.226, + "pos_z": 0, + "rot_x": 0, + "rot_y": 0, + "rot_z": 0, + "scale_x": 1, + "scale_y": 1, + "scale_z": 1 + } + ], + "removedIds": [] +} \ No newline at end of file diff --git a/saves/game_time.json b/saves/game_time.json index 5924582..9ae4729 100644 --- a/saves/game_time.json +++ b/saves/game_time.json @@ -1 +1 @@ -{"time":"2025-12-05T08:30:14.152Z","lastReal":1758687967327} \ No newline at end of file +{"time":"2026-03-31T21:30:24.296Z","lastReal":1759946618595} \ No newline at end of file diff --git a/server.js b/server.js index 8053cce..81d21db 100644 --- a/server.js +++ b/server.js @@ -997,7 +997,10 @@ app.get('/api/cities/:cityId/objects', authenticate, async (req, res) => { COALESCE(scale_y, 1) AS scale_y, COALESCE(scale_z, 1) AS scale_z, organization_id, - COALESCE(collidable, true) AS collidable, + COALESCE(rent, 0) AS rent, + COALESCE(tax, 0) AS tax, + COALESCE(collidable, false) AS collidable, + COALESCE(interior_id, 101) AS interior_id, COALESCE(textures, '-') AS textures FROM city_objects WHERE city_id = $1 @@ -2142,6 +2145,164 @@ app.get('/api/cities', authenticate, async (req, res) => { } }); +// Сохранить/обновить объект города в БД +app.post('/api/save-object', authenticate, async (req, res) => { + try { + const { + id, + city_id, + name, + model_url, + pos_x, + pos_y, + pos_z, + rot_x, + rot_y, + rot_z, + scale_x, + scale_y, + scale_z, + organization_id = 2, + rent = 0, + tax = 0, + collidable = false, + interior_id = 101, + textures = '-' + } = req.body; + + if (!city_id || !model_url) { + return res.status(400).json({ error: 'city_id и model_url обязательны' }); + } + + let result; + if (id && id !== null && id !== undefined) { + // Обновление существующего объекта + console.log('🔄 Обновляем существующий объект с ID:', id); + const { rows } = await db.query(` + UPDATE city_objects SET + name = $1, + model_url = $2, + pos_x = $3, + pos_y = $4, + pos_z = $5, + rot_x = $6, + rot_y = $7, + rot_z = $8, + scale_x = $9, + scale_y = $10, + scale_z = $11, + organization_id = $12, + rent = $13, + tax = $14, + collidable = $15, + interior_id = $16, + textures = $17 + WHERE id = $18 + RETURNING id + `, [ + name || '', + model_url, + pos_x || 0, + pos_y || 0, + pos_z || 0, + rot_x || 0, + rot_y || 0, + rot_z || 0, + scale_x || 1, + scale_y || 1, + scale_z || 1, + organization_id, + rent, + tax, + collidable, + interior_id, + textures, + id + ]); + result = rows[0]; + console.log('✅ Объект обновлен:', result); + } else { + // Создание нового объекта + console.log('🆕 Создаем новый объект'); + const { rows } = await db.query(` + INSERT INTO city_objects ( + city_id, name, model_url, pos_x, pos_y, pos_z, + rot_x, rot_y, rot_z, scale_x, scale_y, scale_z, + organization_id, rent, tax, collidable, interior_id, textures + ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18) + RETURNING id + `, [ + city_id, + name || '', + model_url, + pos_x || 0, + pos_y || 0, + pos_z || 0, + rot_x || 0, + rot_y || 0, + rot_z || 0, + scale_x || 1, + scale_y || 1, + scale_z || 1, + organization_id, + rent, + tax, + collidable, + interior_id, + textures + ]); + result = rows[0]; + console.log('✅ Новый объект создан:', result); + } + + res.json({ id: result.id, success: true }); + } catch (error) { + console.error('Ошибка сохранения объекта:', error); + res.status(500).json({ error: 'Ошибка сохранения объекта' }); + } +}); + +// Удалить объект города из БД +app.delete('/api/delete-object/:id', authenticate, async (req, res) => { + try { + const objectId = parseInt(req.params.id, 10); + + if (!objectId) { + return res.status(400).json({ error: 'ID объекта обязателен' }); + } + + const { rowCount } = await db.query( + 'DELETE FROM city_objects WHERE id = $1', + [objectId] + ); + + if (rowCount === 0) { + return res.status(404).json({ error: 'Объект не найден' }); + } + + res.json({ success: true, message: 'Объект удален' }); + } catch (error) { + console.error('Ошибка удаления объекта:', error); + res.status(500).json({ error: 'Ошибка удаления объекта' }); + } +}); + +// Тестовый эндпоинт для проверки таблицы city_objects +app.get('/api/test-city-objects', authenticate, async (req, res) => { + try { + const { rows } = await db.query(` + SELECT table_name, column_name, data_type + FROM information_schema.columns + WHERE table_name = 'city_objects' + ORDER BY ordinal_position + `); + res.json({ tableExists: rows.length > 0, columns: rows }); + } catch (error) { + console.error('Ошибка проверки таблицы:', error); + res.status(500).json({ error: 'Ошибка проверки таблицы', details: error.message }); + } +}); + // API endpoint для получения коллайдеров города из базы данных app.get('/api/colliders/city/:cityId', authenticate, async (req, res) => { const cityId = parseInt(req.params.cityId, 10); diff --git a/src/pages/MapEditor.jsx b/src/pages/MapEditor.jsx index b84b3c8..01ee136 100644 --- a/src/pages/MapEditor.jsx +++ b/src/pages/MapEditor.jsx @@ -10,6 +10,19 @@ export default function MapEditor() { const [mode, setMode] = useState('translate'); const [cities, setCities] = useState([]); const [cityId, setCityId] = useState(null); + const [copiedObject, setCopiedObject] = useState(null); + const [objectCoordinates, setObjectCoordinates] = useState({ x: 0, y: 0, z: 0 }); + const [objectRotation, setObjectRotation] = useState({ x: 0, y: 0, z: 0 }); + const [objectScale, setObjectScale] = useState({ x: 1, y: 1, z: 1 }); + const [objectId, setObjectId] = useState(null); + const [objectName, setObjectName] = useState(''); + const [objectOrganizationId, setObjectOrganizationId] = useState(2); + const [objectCollidable, setObjectCollidable] = useState(false); + const [objectInteriorId, setObjectInteriorId] = useState(101); + const [showAdvancedProperties, setShowAdvancedProperties] = useState(false); + const [rulerMode, setRulerMode] = useState(false); + const [rulerPoints, setRulerPoints] = useState([]); + const keysPressed = useRef({}); const sceneRef = useRef(); const cameraRef = useRef(); @@ -82,12 +95,82 @@ export default function MapEditor() { } transform.attach(obj); selectedRef.current = obj; + updateObjectCoordinates(obj); } else { selectedRef.current = null; transform.detach(); } }; renderer.domElement.addEventListener('pointerdown', onPointerDown); + + // Обработчик для линейки + const onRulerClick = (event) => { + if (rulerMode) { + handleRulerClick(event); + } + }; + renderer.domElement.addEventListener('click', onRulerClick); + + // Обработчики клавиатуры + const cameraSpeed = 0.5; + const objectMoveSpeed = 0.5; + + const handleKeyDown = (event) => { + keysPressed.current[event.code] = true; + + // Управление камерой + if (event.code === 'KeyW' || event.code === 'KeyЦ') { + const direction = new THREE.Vector3(); + camera.getWorldDirection(direction); + camera.position.add(direction.multiplyScalar(cameraSpeed)); + } + if (event.code === 'KeyS' || event.code === 'KeyЫ') { + const direction = new THREE.Vector3(); + camera.getWorldDirection(direction); + camera.position.sub(direction.multiplyScalar(cameraSpeed)); + } + if (event.code === 'KeyA' || event.code === 'KeyФ') { + const right = new THREE.Vector3(); + camera.getWorldDirection(right); + right.cross(camera.up).normalize(); + camera.position.sub(right.multiplyScalar(cameraSpeed)); + } + if (event.code === 'KeyD' || event.code === 'KeyВ') { + const right = new THREE.Vector3(); + camera.getWorldDirection(right); + right.cross(camera.up).normalize(); + camera.position.add(right.multiplyScalar(cameraSpeed)); + } + + // Управление выбранным объектом + const obj = selectedRef.current; + if (obj) { + if (event.code === 'ArrowUp') { + obj.position.z += objectMoveSpeed; + updateObjectCoordinates(obj); + } + if (event.code === 'ArrowDown') { + obj.position.z -= objectMoveSpeed; + updateObjectCoordinates(obj); + } + if (event.code === 'ArrowLeft') { + obj.position.x -= objectMoveSpeed; + updateObjectCoordinates(obj); + } + if (event.code === 'ArrowRight') { + obj.position.x += objectMoveSpeed; + updateObjectCoordinates(obj); + } + } + + }; + + const handleKeyUp = (event) => { + keysPressed.current[event.code] = false; + }; + + document.addEventListener('keydown', handleKeyDown); + document.addEventListener('keyup', handleKeyUp); const animate = () => { requestAnimationFrame(animate); @@ -105,7 +188,10 @@ export default function MapEditor() { return () => { renderer.domElement.removeEventListener('pointerdown', onPointerDown); + renderer.domElement.removeEventListener('click', onRulerClick); window.removeEventListener('resize', onResize); + document.removeEventListener('keydown', handleKeyDown); + document.removeEventListener('keyup', handleKeyUp); mountRef.current.removeChild(renderer.domElement); }; }, []); @@ -114,6 +200,60 @@ export default function MapEditor() { transformRef.current?.setMode(mode); }, [mode]); + // Отдельный useEffect для обработки клавиш + useEffect(() => { + const handleKeyDown = (event) => { + // Копирование и вставка + if (event.ctrlKey && event.code === 'KeyC') { + event.preventDefault(); + const obj = selectedRef.current; + if (obj) { + setCopiedObject({ + model_url: obj.userData.model_url, + name: obj.userData.name, + position: obj.position.clone(), + rotation: obj.rotation.clone(), + scale: obj.scale.clone() + }); + console.log('Объект скопирован:', obj.userData.name); + } + } + if (event.ctrlKey && event.code === 'KeyV') { + event.preventDefault(); + if (copiedObject) { + console.log('Вставка объекта:', copiedObject.name); + loader.load(copiedObject.model_url, gltf => { + const m = gltf.scene; + m.userData = { + model_url: copiedObject.model_url, + name: copiedObject.name + '_copy' + }; + m.position.copy(copiedObject.position); + m.rotation.copy(copiedObject.rotation); + m.scale.copy(copiedObject.scale); + m.traverse(child => { + if (child.isMesh && materialRef.current) { + child.material = materialRef.current.clone(); + child.material.needsUpdate = true; + } + }); + sceneRef.current.add(m); + objectsRef.current.push(m); + transformRef.current.attach(m); + selectedRef.current = m; + updateObjectCoordinates(m); + console.log('✅ Объект скопирован (сохранение при нажатии "Сохранить")'); + }); + } + } + }; + + document.addEventListener('keydown', handleKeyDown); + return () => { + document.removeEventListener('keydown', handleKeyDown); + }; + }, [copiedObject, loader]); + useEffect(() => { const token = localStorage.getItem('token'); fetch('/api/models', { headers: { Authorization: `Bearer ${token}` } }) @@ -133,22 +273,43 @@ export default function MapEditor() { useEffect(() => { if (!cityId) return; + const token = localStorage.getItem('token'); // очистка текущих объектов objectsRef.current.forEach(o => sceneRef.current.remove(o)); objectsRef.current = []; removedIdsRef.current = []; + + console.log('📡 Запрашиваем объекты с сервера...'); fetch(`/api/cities/${cityId}/objects`, { headers: { Authorization: `Bearer ${token}` } }) - .then(r => r.json()) + .then(r => { + console.log('📡 Ответ сервера на загрузку объектов:', r.status, r.statusText); + return r.json(); + }) .then(data => { + console.log('📊 Загружено объектов из БД:', data.length); + console.log('📋 Данные объектов:', data); + data.forEach(obj => { + console.log('🔄 Загружаем объект:', obj.name, 'ID:', obj.id); loader.load(obj.model_url, gltf => { const m = gltf.scene; m.position.set(obj.pos_x, obj.pos_y, obj.pos_z); m.rotation.set(obj.rot_x, obj.rot_y, obj.rot_z); - m.userData = { id: obj.id, model_url: obj.model_url, name: obj.name }; + m.scale.set(obj.scale_x, obj.scale_y, obj.scale_z); + m.userData = { + id: obj.id, + model_url: obj.model_url, + name: obj.name, + organization_id: obj.organization_id, + rent: obj.rent, + tax: obj.tax, + collidable: obj.collidable, + interior_id: obj.interior_id, + textures: obj.textures + }; m.traverse(child => { if (child.isMesh && materialRef.current) { child.material = materialRef.current.clone(); @@ -160,7 +321,10 @@ export default function MapEditor() { }); }); }) - .catch(err => console.error('Ошибка загрузки объектов', err)); + .catch(err => { + console.error('❌ Ошибка загрузки объектов:', err); + alert(`Ошибка загрузки объектов: ${err.message}`); + }); }, [cityId, loader]); const addModel = name => { @@ -175,31 +339,155 @@ export default function MapEditor() { child.material.needsUpdate = true; } }); + + // Размещаем объект перед камерой + const camera = cameraRef.current; + const direction = new THREE.Vector3(); + camera.getWorldDirection(direction); + const distance = 5; // расстояние от камеры + m.position.copy(camera.position).add(direction.multiplyScalar(distance)); + sceneRef.current.add(m); objectsRef.current.push(m); transformRef.current.attach(m); + selectedRef.current = m; + updateObjectCoordinates(m); + + console.log('✅ Объект добавлен в сцену (сохранение при нажатии "Сохранить")'); }); }; - const deleteSelected = () => { + const copySelectedObject = () => { const obj = selectedRef.current; if (!obj) return; - transformRef.current.detach(); - if (obj.parent) { - obj.parent.remove(obj); - } else { - sceneRef.current.remove(obj); - } - objectsRef.current = objectsRef.current.filter(o => o !== obj); - if (obj.userData.id) { - removedIdsRef.current.push(obj.userData.id); - } - selectedRef.current = null; + setCopiedObject({ + model_url: obj.userData.model_url, + name: obj.userData.name, + position: obj.position.clone(), + rotation: obj.rotation.clone(), + scale: obj.scale.clone() + }); }; - const saveMap = () => { - const objects = objectsRef.current.map(obj => ({ + const pasteObject = () => { + if (!copiedObject) return; + loader.load(copiedObject.model_url, gltf => { + const m = gltf.scene; + m.userData = { + model_url: copiedObject.model_url, + name: copiedObject.name + '_copy' + }; + m.position.copy(copiedObject.position); + m.rotation.copy(copiedObject.rotation); + m.scale.copy(copiedObject.scale); + m.traverse(child => { + if (child.isMesh && materialRef.current) { + child.material = materialRef.current.clone(); + child.material.needsUpdate = true; + } + }); + sceneRef.current.add(m); + objectsRef.current.push(m); + transformRef.current.attach(m); + selectedRef.current = m; + updateObjectCoordinates(m); + }); + }; + + const updateObjectCoordinates = (obj) => { + if (!obj) return; + + // Безопасное получение координат + const posX = typeof obj.position.x === 'number' ? obj.position.x : 0; + const posY = typeof obj.position.y === 'number' ? obj.position.y : 0; + const posZ = typeof obj.position.z === 'number' ? obj.position.z : 0; + + setObjectCoordinates({ + x: parseFloat(posX.toFixed(3)), + y: parseFloat(posY.toFixed(3)), + z: parseFloat(posZ.toFixed(3)) + }); + + // Безопасное получение поворота + const rotX = typeof obj.rotation.x === 'number' ? obj.rotation.x : 0; + const rotY = typeof obj.rotation.y === 'number' ? obj.rotation.y : 0; + const rotZ = typeof obj.rotation.z === 'number' ? obj.rotation.z : 0; + + setObjectRotation({ + x: parseFloat((rotX * 180 / Math.PI).toFixed(3)), + y: parseFloat((rotY * 180 / Math.PI).toFixed(3)), + z: parseFloat((rotZ * 180 / Math.PI).toFixed(3)) + }); + + // Безопасное получение масштаба + const scaleX = typeof obj.scale.x === 'number' ? obj.scale.x : 1; + const scaleY = typeof obj.scale.y === 'number' ? obj.scale.y : 1; + const scaleZ = typeof obj.scale.z === 'number' ? obj.scale.z : 1; + + setObjectScale({ + x: parseFloat(scaleX.toFixed(3)), + y: parseFloat(scaleY.toFixed(3)), + z: parseFloat(scaleZ.toFixed(3)) + }); + + // Обновляем дополнительные свойства + setObjectId(obj.userData.id || null); + setObjectName(obj.userData.name || ''); + setObjectOrganizationId(obj.userData.organization_id || 2); + setObjectCollidable(obj.userData.collidable || false); + setObjectInteriorId(obj.userData.interior_id || 101); + }; + + const applyCoordinates = () => { + const obj = selectedRef.current; + if (!obj) return; + obj.position.set(objectCoordinates.x, objectCoordinates.y, objectCoordinates.z); + obj.rotation.set( + objectRotation.x * Math.PI / 180, + objectRotation.y * Math.PI / 180, + objectRotation.z * Math.PI / 180 + ); + obj.scale.set(objectScale.x, objectScale.y, objectScale.z); + + // Обновляем дополнительные свойства в userData + obj.userData.name = objectName; + obj.userData.organization_id = objectOrganizationId; + obj.userData.collidable = objectCollidable; + obj.userData.interior_id = objectInteriorId; + + transformRef.current.updateMatrixWorld(); + + console.log('✅ Координаты объекта обновлены (сохранение при нажатии "Сохранить")'); + }; + + const saveObjectToDatabase = async (obj) => { + console.log('🔄 Начинаем сохранение объекта в БД...'); + console.log('📊 Данные объекта:', { id: obj.userData.id, + name: obj.userData.name, + model_url: obj.userData.model_url, + position: { x: obj.position.x, y: obj.position.y, z: obj.position.z }, + cityId: cityId + }); + + if (!cityId) { + console.error('❌ cityId не установлен, пропускаем сохранение'); + return; + } + + const token = localStorage.getItem('token'); + if (!token) { + console.error('❌ Токен не найден'); + return; + } + + // Если у объекта есть ID, то обновляем, иначе создаем новый + const isUpdate = obj.userData.id && obj.userData.id !== null; + console.log(`📝 ${isUpdate ? 'Обновляем' : 'Создаем'} объект:`, obj.userData.name); + + const objectData = { + id: obj.userData.id, // null для новых объектов + city_id: cityId, name: obj.userData.name || '', model_url: obj.userData.model_url, pos_x: obj.position.x, @@ -210,27 +498,148 @@ export default function MapEditor() { rot_z: obj.rotation.z, scale_x: obj.scale.x, scale_y: obj.scale.y, - scale_z: obj.scale.z - })); + scale_z: obj.scale.z, + organization_id: obj.userData.organization_id || 2, + rent: obj.userData.rent || 0, + tax: obj.userData.tax || 0, + collidable: obj.userData.collidable || false, + interior_id: obj.userData.interior_id || 101, + textures: obj.userData.textures || '-' + }; + + console.log('📤 Отправляем данные на сервер:', objectData); + + try { + const response = await fetch('/api/save-object', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}` + }, + body: JSON.stringify(objectData) + }); + + console.log('📡 Ответ сервера:', response.status, response.statusText); + + if (response.ok) { + const result = await response.json(); + console.log('✅ Объект успешно сохранен в БД:', result); + if (result.id && !obj.userData.id) { + obj.userData.id = result.id; + setObjectId(result.id); + console.log('🆔 Назначен ID объекту:', result.id); + } + } else { + const errorText = await response.text(); + console.error('❌ Ошибка сохранения объекта:', response.status, errorText); + alert(`Ошибка сохранения: ${response.status} - ${errorText}`); + } + } catch (error) { + console.error('❌ Ошибка сети при сохранении:', error); + alert(`Ошибка сети: ${error.message}`); + } + }; + + const deleteObjectFromDatabase = async (objId) => { + if (!objId) return; + const token = localStorage.getItem('token'); - fetch('/api/save-map', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${token}` - }, - body: JSON.stringify({ cityId, objects, removedIds: removedIdsRef.current }) - }) - .then(r => { - if (!r.ok) throw new Error('fail'); - alert('Карта сохранена'); - }) - .catch(() => alert('Ошибка сохранения')); + try { + await fetch(`/api/delete-object/${objId}`, { + method: 'DELETE', + headers: { + Authorization: `Bearer ${token}` + } + }); + } catch (error) { + console.error('Ошибка удаления объекта:', error); + } + }; + + const deleteSelected = async () => { + const obj = selectedRef.current; + if (!obj) return; + transformRef.current.detach(); + + // Удаляем из базы данных + if (obj.userData.id) { + await deleteObjectFromDatabase(obj.userData.id); + } + + if (obj.parent) { + obj.parent.remove(obj); + } else { + sceneRef.current.remove(obj); + } + objectsRef.current = objectsRef.current.filter(o => o !== obj); + selectedRef.current = null; + }; + + const saveMap = async () => { + console.log('🔄 Сохраняем все объекты в БД...'); + + if (!cityId) { + alert('Город не выбран'); + return; + } + + const token = localStorage.getItem('token'); + if (!token) { + alert('Токен не найден'); + return; + } + + try { + // Сохраняем все объекты в БД + const savePromises = objectsRef.current.map(obj => saveObjectToDatabase(obj)); + await Promise.all(savePromises); + + console.log('✅ Все объекты сохранены в БД'); + alert('Карта сохранена в базу данных'); + } catch (error) { + console.error('❌ Ошибка сохранения карты:', error); + alert('Ошибка сохранения карты'); + } + }; + + const toggleRulerMode = () => { + setRulerMode(!rulerMode); + setRulerPoints([]); + }; + + const handleRulerClick = (event) => { + if (!rulerMode) return; + + const rect = rendererRef.current.domElement.getBoundingClientRect(); + const mouse = new THREE.Vector2(); + mouse.x = ((event.clientX - rect.left) / rect.width) * 2 - 1; + mouse.y = -((event.clientY - rect.top) / rect.height) * 2 + 1; + + const raycaster = new THREE.Raycaster(); + raycaster.setFromCamera(mouse, cameraRef.current); + + // Создаем плоскость на уровне Y=0 для измерения + const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0); + const intersection = new THREE.Vector3(); + raycaster.ray.intersectPlane(plane, intersection); + + setRulerPoints(prev => [...prev, intersection]); + }; + + const calculateDistance = () => { + if (rulerPoints.length < 2) return 0; + const point1 = rulerPoints[0]; + const point2 = rulerPoints[1]; + return Math.sqrt( + Math.pow(point2.x - point1.x, 2) + + Math.pow(point2.z - point1.z, 2) + ).toFixed(2); }; return (