не ищутся объекты в сцене m_scenes.get_object_by_name("object_target");
18 февраля 2018 02:56
Доброго времени суток..
разбил сцену на разные JSON чтоб грузить и заменять ее частями вроде все было ок, но
как загрузку сделал последовательную обнаружил, что переменные для объектов не получают значение.. уж было подумал, что асинхронно грузятся сцены и промазывает, проверил; да асинхронно, поставил флаг "ждать загрузки данных", но ничего не изменилось
все как обычно грузит в "перемешку все сцены":
ну и конечно target пустой оказывается во время попытки использовать его свойства по кнопкам итд.. да и в отладчике и консоли ругань на пустую переменную по время присвоения и конечно get_object_by_name не возвращает объект, хотя он точно есть в сцене и в json итд.. не первый раз обычным способом все работало..
ВОПРОС: почему же не ищутся объекты?
вопрос2: почему не отрабатывает ожидание полной загрузки?
load(path, loaded_cb(opt), stageload_cb(opt), wait_complete_loading(opt), load_hidden(opt)) → {number}
разбил сцену на разные JSON чтоб грузить и заменять ее частями вроде все было ок, но
как загрузку сделал последовательную обнаружил, что переменные для объектов не получают значение.. уж было подумал, что асинхронно грузятся сцены и промазывает, проверил; да асинхронно, поставил флаг "ждать загрузки данных", но ничего не изменилось
все как обычно грузит в "перемешку все сцены":
function init_cb ( canvas_elem, success)
{//....... обычный код
var target;
m_data.load( APP_ASSETS_PATH+"scena1.json", load_cb, preloader_cb, true, false);
m_data.load( APP_ASSETS_PATH+"scena2.json", load_cb, preloader_cb, true, false);
m_data.load( APP_ASSETS_PATH+"scena3.json", load_cb, preloader_cb, true, false);
}
function load_cb(data_id, success)
{//..... обычный код
m_app.enable_camera_controls();
target = m_scenes.get_object_by_name("target");
}
$("#target ").click(function() {
//m_scenes.show_object(target);
m_scenes.hide_object(target)
});
ну и конечно target пустой оказывается во время попытки использовать его свойства по кнопкам итд.. да и в отладчике и консоли ругань на пустую переменную по время присвоения и конечно get_object_by_name не возвращает объект, хотя он точно есть в сцене и в json итд.. не первый раз обычным способом все работало..
ВОПРОС: почему же не ищутся объекты?
вопрос2: почему не отрабатывает ожидание полной загрузки?
load(path, loaded_cb(opt), stageload_cb(opt), wait_complete_loading(opt), load_hidden(opt)) → {number}
Денис
19 февраля 2018 12:12
Здравствуйте!
ВОПРОС: почему же не ищутся объекты?У вас один и тот же load_cb на все сцены. Он будет вызываться три раза, каждый раз когда загрузится одна из трех сцен. Скорее всего при первом вызове загрузилась сцена, в которой еще нет нужного объекта. Лучше создать отдельный коллбэк для каждого случая, чтобы точно знать, какие данные были только что загружены.
вопрос2: почему не отрабатывает ожидание полной загрузки?Каким образом это проявляется? wait_complete_loading говорит движку загрузить все, не исключая определенные этапы, которые могут быть догружены позже (они объявлены внутри движка). Это относится к данным, связанным с json, указанным конкретно в этом вызове load в параметре path и никак не связано с остальными json-файлами.
load(path, loaded_cb(opt), stageload_cb(opt), wait_complete_loading(opt), load_hidden(opt)) → {number}
Александр (команда Blend4Web)
twitter
19 февраля 2018 12:47
Ответ на сообщение пользователя Александр Романов
…..
У вас один и тот же load_cb на все сцены…….какие данные были только что загружены…..
Да все верно план был минимизировать код и унифицировать подгрузну нужных объектов, а их передачу в переменные планировалось сделать после загрузки всех нужных частей сцены например.
можно и с разными калбеками, но подумалось, что не нуждно этого…
так как присвоить в переменную объект из таким образом загруженных данных после всех вывзовов, обычный метод не срабатывает!
Ответ на сообщение пользователя Александр Романов
Каким образом это проявляется? wait_complete_loading ………
лог пишет в кадом калбеке сообщение в консоль номер в data_id это возвращенный номер сцены
похоже что все методы запускаются ассинхронно, кроме того я вывожу еще в лог сообщение после всех load
так вот оно появляется СРАЗУ ! еще до первого ответа из калбека
data_id= 2 loaded 15% load_time sec=0.598
data_id= 3 loaded 3% load_time sec=0.586
data_id= 2 loaded 17% load_time sec=0.662
data_id= 1 loaded 32% load_time sec=0.886
data_id= 3 loaded 6% load_time sec=1.174
data_id= 1 loaded 35% load_time sec=1.232
data_id= 1 loaded 38% load_time sec=1.278
Денис
19 февраля 2018 14:15
Если у вас что-то вроде:
То, действительно, сначала выведется "hello", а потом все остальное. Такова природа асинхронности в Javascript: при вызове m_data.load происходит "добавление задачи в очередь" и передается управление следующей инструкции. Эта очередь частично "разгребается" на новой итерации асинхронного выполнения. wait_complete_loading ни в коем случае не превращает m_data.load из асинхронной в синхронную. Эта опция, как я уже сказал, позволяет вызвать load_cb раньше чем загрузятся все ресурсы. Ресурсы также загружаются асинхронно. Если бы функция m_data.load была синхронной, то страница просто зависала бы на момент загрузки больших сцен и браузер сообщал бы, что страница не отвечает. Асинхронность использована для того, чтобы загружать данные частями.
Тем не менее, в движке есть недоработка, связанная с тем, что при параллельной загрузке могут возникать конфликты. Поэтому рекомендуется вызывать m_data.load после того, как предыдущие данные были загружены, например по цепочке, в каждом load_cb. Прикрепляю пример.
m_data.load( APP_ASSETS_PATH+"scena1.json", load_cb, preloader_cb, true, false);
m_data.load( APP_ASSETS_PATH+"scena2.json", load_cb, preloader_cb, true, false);
m_data.load( APP_ASSETS_PATH+"scena3.json", load_cb, preloader_cb, true, false);
console.log("hello")
То, действительно, сначала выведется "hello", а потом все остальное. Такова природа асинхронности в Javascript: при вызове m_data.load происходит "добавление задачи в очередь" и передается управление следующей инструкции. Эта очередь частично "разгребается" на новой итерации асинхронного выполнения. wait_complete_loading ни в коем случае не превращает m_data.load из асинхронной в синхронную. Эта опция, как я уже сказал, позволяет вызвать load_cb раньше чем загрузятся все ресурсы. Ресурсы также загружаются асинхронно. Если бы функция m_data.load была синхронной, то страница просто зависала бы на момент загрузки больших сцен и браузер сообщал бы, что страница не отвечает. Асинхронность использована для того, чтобы загружать данные частями.
Тем не менее, в движке есть недоработка, связанная с тем, что при параллельной загрузке могут возникать конфликты. Поэтому рекомендуется вызывать m_data.load после того, как предыдущие данные были загружены, например по цепочке, в каждом load_cb. Прикрепляю пример.
Александр (команда Blend4Web)
twitter
19 февраля 2018 14:15
лог пишет в кадом калбеке сообщение в консоль номер в data_id это возвращенный номер сцены
похоже что все методы запускаются ассинхронно, кроме того я вывожу еще в лог сообщение после всех load
так вот оно появляется СРАЗУ ! еще до первого ответа из калбека
Это JavaScript =)
Вам стоит подучить теорию ,что такое асинхронная загрузка. Понять зачем нужный коллбеки.
Также вы неверно поняли что делает флаг ожидания полной загрузки. Он при включении ждёт загрузки доп ресурсов (текстур, данных материалов) и только после этого отрабатывает.
Для вашей цели (ожидание загрузки всего что только может) вам нужно использовать промисы. Но, боюсь, если у вас возникло удивление, почему лог после лоадов выводится сразу, а ответы колбеков потом, то тема с промисами окажется очень сложной…
19 февраля 2018 14:49
вам нужно использовать промисы
про ассинхронность вызовов JS оно понятно.. про промисы тоже , все это было сказано уже вследствие не понимания почему все же объекты не ищутся по ГЕТ … это основной вопрос даже если в калбеке успешной загрузкипрописаны..
попробую еще раз разделить сейчас на разные калбеки последовательные, хотелось избезать этого и понадеялся, что все загрузятся и из последнего.
Денис
19 февраля 2018 16:30
Поэтому рекомендуется вызывать m_data.load после того, как предыдущие данные были загружены, например по цепочке, в каждом load_cb. Прикрепляю
Обновлю… да действительно при последовательной загрузке одно из другого заработало..
при чем обязательно указать на data_id при поиске элемента в сцене, а как же искать все объекты во всех сценах?
https://www.blend4web.com/api_doc/module-scenes.html#.get_object_by_name
в связи с тем что ИД указан как опционально и я предположил, по аналогии с очисткой сцены, что искать будет во всех загруженных сценах, но оказывается что так не работает, хотя в дебаге я посмотрел, что он находит объект и перебирает и эту сцену тоже… но на выход не возвращает его…
возможно есть другой метод искать объекты во всех загруженных в данный момент данных?
Денис
20 февраля 2018 10:49
а как же искать все объекты во всех сценах
Для этого нужно воспользоваться немного другим методом:
var m_obj_intern = require("__objects");
m_obj_intern.get_all_objects("ALL", m_obj_intern.DATA_ID_ALL);
Но скажу сразу, функция эта для внутренних процессов. Я лично её не использую, т.к. не составляет труда еще на этапе постзагрузки контролировать ВСЕ объекты в каждой подгружаемой сцене.
20 февраля 2018 13:43
не составляет труда еще на этапе постзагрузки контролировать ВСЕ объекты в каждой подгружаемой сцене.
спасибо, а в описани API она есть?
про присвоения на этапе загрузки это не всегда удобно и возможно, как раз хотелось сделать такой "универсальный" кусок кода.. т.к. сцены(части сцен) разные могут быть , а вот не получается … от этого и все эти вопросы.
Денис
20 февраля 2018 15:01
Постзагрузкой я называю колбэк метод у функции load.
Да, сцены разные, именно поэтому все они загружаются и сразу после загрузки обрабатываются специальным модулем (в апи его нет), который выполняет необходимую логику в зависимости от того ,какие объекты нашёл. Он раскладывает всё по полкам, и далее я уже работаю с этими полками.
Да, сцены разные, именно поэтому все они загружаются и сразу после загрузки обрабатываются специальным модулем (в апи его нет), который выполняет необходимую логику в зависимости от того ,какие объекты нашёл. Он раскладывает всё по полкам, и далее я уже работаю с этими полками.