не ищутся объекты в сцене m_scenes.get_object_by_name("object_target");

21 февраля 2018 19:00
Оставил пока все как последовательный вызов "посткалбеков " и в последнем инициализирую все элементы по ИД сцен получеными на этапе загрузки.. вроде все ок.

Но тут новая странность, с заменой текстуры:
пробую в ФФоксе и в Хроме .
в ФФоксе текстура не меняется и ошибок нет в консоли ( дебаг режим включен)
в Хроме текстура не меняется, но ошибки в консоли есть:

(картинка есть по этой ссылке, элемент работает, меши все загружаются.. но замена текстуры не срабатывает и старый ваниант уже не работает "b4w.js:202 B4W ERROR: change_image() is deprecated, use replace_image() instead." )
https://www.blend4web.com/api_doc/module-textures.html#.replace_image


LOG image.src = http://myapp.com/app//assets/var/v1/L1.jpg
LOG image = [object HTMLImageElement]

b4w.js:27228 WebGL: INVALID_VALUE: texImage2D: no image

update_texture @ b4w.js:27228
Int_textures.exports.change_image @ b4w.js:28142
Textures.exports.replace_image @ b4w.js:115902
(anonymous) @ myapp.js:385
dispatch @ jquery.min.js:2
y.handle @ jquery.min.js:2

myapp.php?:1 [.Offscreen-For-WebGL-0000022FA5691490]GL ERROR :GL_INVALID_OPERATION : glGenerateMipmap: Can not generate mips

….. итд… там уже целый список

Код почти такой как в описани АПИ

var image = new Image();
var text_name = 'ao';
image.src = APP_ASSETS_PATH+"L1.jpg"; 
m_tex.replace_image(l1, text_name, image);


что может быть то?


ДОПОЛНЮ:

вываливается тут

else if (!cfg_def.webgl2 && (__WEBPACK_IMPORTED_MODULE_9__util_js__["L" /* check_npot */](texture.width) 
                    || __WEBPACK_IMPORTED_MODULE_9__util_js__["L" /* check_npot */](texture.height))) {
                draw_resized_image(texture, draw_data, width, height, false);
                texture.need_resize = true;

            } else
                _gl.texImage2D(w_target, 0, _gl.RGBA, _gl.RGBA, _gl.UNSIGNED_BYTE, draw_data);


как раз в ЭЛЬСЕ последнем :
b4w.js:27228 WebGL: INVALID_VALUE: texImage2D: no image
Денис
22 февраля 2018 05:39
обнаружил две перекликающихся темы на форуме :

https://www.blend4web.com/ru/forums/topic/23/?page=2#post-20783
и вторая про "много картинок в загрузке для замены" ..
и примеры кода , в котором используется старый метод замены картинки!!!
https://www.blend4web.com/apps/code_snippets/code_snippets.html?scene=change_image

создал измененный код , добавив простой колбек с флагом ожидания загрузки картинки .
и пробовал так же его использовать с "replace_image(obj, text_name, image, callback)"
- но как я и сказал выше новый метод полностью игнорирует вывод в колбек !

задействовал старый метод, и колбек заработал "change_image(obj, text_name, image_path, callbackopt)"
, но картина все равно не заменяется .. хотя и загрузка картинки происходит и метод отрабатывает..
уже не знаю куда и копать измененный кусок кода:
function change_img_cb() {
	console.log("_wait_for_image_loading = "+_wait_for_image_loading );
	_wait_for_image_loading = false;
	}
										
var _flag = false;

..........
 _wait_for_image_loading = true;
											
		if (_flag) {
			  //m_tex.replace_image(obj, text_name, image1, change_img_cb);
			 m_tex.change_image(obj, text_name, image1.src, change_img_cb);
		 } else {
			//m_tex.replace_image(obj, text_name, image2, change_img_cb);
			m_tex.change_image(obj, text_name, image2.src, change_img_cb);
			 }
			_flag = !_flag;
........


картинка все так же не заменяется …
самое неприятное, что ошибок напрмер в ФФ в консоли нет ! да и в Хроме ошибка(ки) исчезли,
кроме конечно этого "B4W ERROR: change_image() is deprecated, use replace_image() instead."
но и в примере так, но работает пока. кроме того внутри в движке то так старый метод и используется поверх нового!

Денис
23 февраля 2018 12:58
ОБНОВЛЕНИЕ:
задействовал старый метод, и колбек заработал "change_image(obj, text_name, image_path, callbackopt)"
, но картина все равно не заменяется .. хотя и загрузка картинки происходит и метод отрабатывает..
уже не знаю куда и копать измененный кусок кода:

Ура! текстуры наконец заменяются, и все же - метод с "вызовом калбека для ожидания картинки" оказался самым рабочим.
обнаружил, что в материале были такие настройки, которые не позволили увидеть изменения. - Это в ПЛЮСЕ
А вот что в минусе, и по прежнему нуждается в объяснении:

Пришлось использовать "устаревший" метод "change_image" вместо документированного "replace_image" (с руганью в консоли) … т.к. последний ни при каких обстоятельствах не посещает свой калбек и все эти ошибки были как раз по его поводу.
Денис
25 февраля 2018 13:39
Пришлось использовать "устаревший" метод "change_image" вместо документированного "replace_image" (с руганью в консоли) … т.к. последний ни при каких обстоятельствах не посещает свой калбек и все эти ошибки были как раз по его поводу.

Хорошо, что у вас получилось. Посмотрим, в чем проблема.
Александр (команда Blend4Web)
twitter
25 февраля 2018 13:49
Ответ на сообщение пользователя Александр Романов
Хорошо, что у вас получилось. Посмотрим, в чем проблема.

до релиза успеете?
Денис
26 февраля 2018 14:40
Действительно колбэк при replace image не работает. Это баг.
Скорее всего replace_image у вас не срабатывал потому что элемент созданный при помощи "new Image()" еще не инициализировал картинку. Чтобы удостовериться в том, что картинка загружена, необходимо переопределить метод onload. В итоге коллбэк у replace_image не имеет смысла. Скорее всего удалим этот параметр т.к. от него невозможно добиться необходимого поведения. Метод onload должен быть переопределен до того как произойдет загрузка.
Вот обновленный код для change_image.js из кодсниппетов:
import b4w from "blend4web";

var m_data = b4w.data;
var m_app = b4w.app;
var m_cfg = b4w.config;
var m_cont = b4w.container;
var m_mouse = b4w.mouse;
var m_tex = b4w.textures;
var m_scenes = b4w.scenes;
var m_version = b4w.version;

var DEBUG = (m_version.type() === "DEBUG");

var APP_ASSETS_PATH = m_cfg.get_assets_path("change_image");
var TEX_ASSETS_PATH = APP_ASSETS_PATH + "textures/";

var tex_names = ["1_b.png", "2_b.png", "table_napkin_1.png","table_napkin_1_normal.png",
"table_napkin_2.png", "table_napkin_2_normal.png"];

var _textures = [];
var _all_tex_loaded = false;
var _loaded_tex_count = 0;
function texture_load_cb() {
_loaded_tex_count++;
if (_loaded_tex_count == tex_names.length)
_all_tex_loaded = true;
}
for (var i = 0; i < tex_names.length; i++) {
var tex = new Image();
tex.src = TEX_ASSETS_PATH + tex_names[i];
tex.onload = texture_load_cb;
_textures.push(tex)
}

var _world = null;
var _wait_for_image_loading = false;
var _napkin_flag = false;
var _stand_1 = null;
var _stand_2 = null;

export function init() {
m_app.init({
canvas_container_id: "main_canvas_container",
callback: init_cb,
physics_enabled: false,
alpha: true,
show_fps: true,
autoresize: true,
assets_dds_available: !DEBUG,
assets_min50_available: !DEBUG,
console_verbose: true
});
}

function init_cb(canvas_elem, success) {

if (!success) {
console.log("b4w init failure");
return;
}
load();
}

function load() {
m_data.load(APP_ASSETS_PATH + "change_image.json", load_cb);
}

function load_cb(data_id) {
m_app.enable_camera_controls(false, false, false, null, true);
var container = m_cont.get_canvas();
_world = m_scenes.get_world_by_name("World");
_stand_1 = m_scenes.get_object_by_name("stand");
_stand_2 = m_scenes.get_object_by_name("stand_2");
container.addEventListener("mousedown", main_canvas_clicked_cb, false);
}

function main_canvas_clicked_cb(e) {

var x = m_mouse.get_coords_x(e);
var y = m_mouse.get_coords_y(e);

var obj = m_scenes.pick_object(x, y);
if (obj && _all_tex_loaded) {
switch(m_scenes.get_object_name(obj)) {
case "Sphere_button_2":
m_tex.replace_image(_world, "lightmap", _textures[0])
m_tex.replace_image(_stand_1, "cubemap_slot", _textures[0]);
break;
case "Sphere_button_1":
m_tex.replace_image(_world, "lightmap", _textures[1])
m_tex.replace_image(_stand_1, "cubemap_slot", _textures[1]);
break;
case "table_napkin":
if (_napkin_flag) {
m_tex.replace_image(obj, "table_napkin", _textures[2]);
m_tex.replace_image(obj, "table_napkin_normal", _textures[3]);
} else {
m_tex.replace_image(obj, "table_napkin", _textures[4]);
m_tex.replace_image(obj, "table_napkin_normal", _textures[5]);
}
_napkin_flag = !_napkin_flag;
break;
default:
return;
}
}
}
init();
Александр (команда Blend4Web)
twitter
26 февраля 2018 15:21
Действительно колбэк при replace image не работает. Это баг.

ну значит, что я все верно подметил , жаль, что времени много потерялось.

про ваш пример: это пример удобен, когда заранее все текстуры, которые нужны, известны и они уже есть. А например в моем случае - текстура нужная определяется в момент работы с приложением и нужно ее поднимать и менять в процессе работы сцены, состоящей ни разных частей догружаемых позже.
В данный момент старый метод "change_image" с ожиданием через калбэк работает ( он вроде как в устаревших уже числится… может его стоит оставить ? ) кроме того, тот ваш новый метод лишь навеска над старым и как я понимаю, Возможно его стоит переделать от начала и до конца заново. Я детально не смотрел, что там делается в коде, но не увидел тех самых "промисов" о которых говорили выше и вполне вероятно калбек тот все же нужен для внешнего контроля подгрузки или сделать это контроль внутри метода.
Денис
26 февраля 2018 16:14
про ваш пример: это пример удобен, когда заранее все текстуры, которые нужны, известны и они уже есть. А например в моем случае - текстура нужная определяется в момент работы с приложением и нужно ее поднимать и менять в процессе работы сцены, состоящей ни разных частей догружаемых позже.

При использовании replace_image вы точно так же используете коллбэк но передаете его не в функцию, а вешаете на созданный элемент и браузер сам подгружает картинку. В случае change_image картинка подгружается собственной реализоцией загрузчика ассетов, который потом вызывает переданный в эту функцию коллбэк. Так что использовать replace_image можно и в вашем случае.

В данный момент старый метод "change_image" с ожиданием через калбэк работает ( он вроде как в устаревших уже числится… может его стоит оставить ? ) кроме того, тот ваш новый метод лишь навеска над старым и как я понимаю, Возможно его стоит переделать от начала и до конца заново
Эта функция помечена как устаревшая, поскольку она загружает картинку каждый раз без кэширования. Взамен пользователю предлагается использовать Image в качестве некоего кеша, над которым пользователь имеет полный контроль.

Я детально не смотрел, что там делается в коде, но не увидел тех самых "промисов" о которых говорили выше и вполне вероятно калбек тот все же нужен для внешнего контроля подгрузки или сделать это контроль внутри метода.
Промисы сейчас не используются, пока что используются более низкоуровневые функции JS.
Насчет коллбэка решим.
Александр (команда Blend4Web)
twitter
26 февраля 2018 16:38
Эта функция помечена как устаревшая, поскольку она загружает картинку каждый раз без кэширования. Взамен пользователю предлагается использовать Image в качестве некоего кеша, над которым пользователь имеет полный контроль.

….
Промисы сейчас не используются, пока что используются более низкоуровневые функции JS.
Насчет коллбэка решим.

И про кеш и про замену картинки без ожидания было бы очень хорошо.. т.к. представьте загрузку 100 мб картинок пред мешем ))) а потом опять и так сколкьо угодно раз.. картинки то могут повторяться а могут и нет.. и кеш тут не помешает сейчас рабоатет не всегда быстро как хотелось бы.
______________________________

Вчера обнаружен еше один "99% баг" : при загрузке данных в сцену несколькими этапами (объектов) и у этих объектов есть свойсво "render_above_all" включено то объекты не из первой загрузки просто не отображаются в сцене ни при каких условиях ! демонстрацию пока сделать тяжело т.к. надо выкусить из кода именно это место ..

возможно вы знаете о этой проблеме ?
Денис
02 марта 2018 03:26
Вопрос по "get_meta_tags(obj)"

а кроме как тут(ссылка) есть еще где то примеры и описание ?
https://www.blend4web.com/api_doc/module-objects.html#.get_meta_tags
и https://www.blend4web.com/api_doc/module-objects.html#~ObjectMetaTags


PS все работает.. но если есть доп инфа будет полезно.
Денис
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.