Форум

Сообщения, созданные пользователем ДЕНИС
05 августа 2016 02:27
Ответ на сообщение пользователя Кирилл
Попрошу пример в студию, где проявляется проблема.

P.S. метод append_loop_cb() можно сразу же отключить после первого срабатывания , но в вашем случае не вижу в этом практической пользы.

основной кусок кода прошу глянуть постарался убрать всякое дополнительное не относящееся к проблеме….. черновик так скзать может конечно чтото намудрил то поправьте плиз

"use strict";

b4w.register("simple_app", function(exports, require) {

// import modules used by the app
var m_main     = require("main");
//var m_anim      = require("animation");
var m_app       = require("app");
var m_data      = require("data");
//var m_mouse     = require("mouse");

//var m_obj      = require("objects");
//var m_scenes    = require("scenes");
var m_scs      = require("scenes");
var m_trans    = require("transform");
var m_cfg = require("config");
var m_cons = require("constraints");
//var m_lights   = require("lights");
//var m_main = b4w.require("main");

var m_preloader = require("preloader");
//v ar _previous_selected_obj = null;
var m_input  = require("input");

var gyro_device = null;
//m_input.get_device_by_type(m_input.DEVICE_GYRO);

var lamp= null;
 
var now = new getDate(); 
var l= null;
var h= null; 
var m= null; 
var s= null; 
var d= null;
var b= null;
var battCharging = false;
var battLevel = 50;
var ambMode= false;
var signAngleLast= 0;
var signAngleNew= 0;
var signX= 0;
var signY= 0;
var cfaceAMB= new Image();

var rotatedPoint={ x:0, y:3, z:0, r:2, a:0};
cfaceAMB.src = 'cfaceAMB.png';

/**
 * export the method to initialize the app (called at the bottom of this file)
 * P_LOW P_HIGH P_ULTRA
 */
exports.init = function() {
    m_app.init({
        canvas_container_id: "main_canvas_container",
        quality: m_cfg.P_LOW,
        //P_LOW(нет теней) P_HIGH ( среднее с тенями)  P_ULTRA  (тормоз), P_CUSTOM enums - НЕ срабатывает)
        callback: init_cb, 
        //show_fps: true,
        show_fps: false,
        fps_elem_id:"idFPS",
        console_verbose: true,
        autoresize: false, //Automatically resize canvas to match the size of container element.
        pause_invisible: true, //Pause engine simulation if page is not visible (in other tab or minimized).
        antialiasing: true,
        alpha: false,
        physics_enabled: false  
    }); 
    //m_cfg.set("shadows", false);
    //m_cfg.set("shadows", true);
    //exports.set = m_cfg.set;
};


function get_angle(center, point){
	var x = point.x - center.x;
	var y = point.y - center.y;
	if(x===0){ return ((y > 0) ? 180 : 0);}
	var a = Math.atan(y/x)*180/Math.PI;
	a = (x > 0) ? a+90 : a+270;
	return Math.round(a);
	}


function onBatteryUpdate(a) {
    battCharging = a.isCharging;
    battLevel = 100 * a.level;
}


/**
 * callback executed when the app is initizalized 
 */
function init_cb(canvas_elem, success) {

    if (!success) {
        //console.log("b4w init failure");
        return;
    }
    
    m_preloader.create_preloader(); //TODO LW Preloader !!!  
    // ВСЕ ЭВЕНТ ЛИСТЕНЕРЫ ТУТ ! 
    document.addEventListener('tizenhwkey', function(e) {
        if (e.keyName === "back") {
            try {tizen.application.getCurrentApplication().exit();} catch (ignore) {alert("exit tizenhwkey not work!");}
        }});
   
    document.addEventListener("ambientmodechanged", function(ev) {
        var mode = ev.detail.ambientMode;
        if (mode) {
            ambMode = true;
        } else {
            ambMode = false;
        }
        if (!ambMode) {

            document.getElementById("main_canvas_container").style.display = "inline";
            document.getElementById("canvasAMB").style.display = "none";
        	m_main.resume();
        } 
        if (ambMode) {

         	m_main.pause();  
        	document.getElementById("main_canvas_container").style.display = "none";
        	document.getElementById("canvasAMB").style.display = "inline";
        } 
        
    });
   
    
    document.addEventListener("visibilitychange", function() {
        if (!document.hidden) {
            
        	if (!ambMode) {
        		m_cfg.set("max_fps", 60);
        		m_main.resume();
        		//m_cfg.set("max_fps", 1);
        		
            }
            
        }
      
    });    
    
    try {
    	window.addEventListener("devicemotion", function(e) {

        if (e.interval > 100) {  
        	if (!ambMode) { 
        		signX=-Math.round(e.accelerationIncludingGravity.x);
        	    signY=Math.round(e.accelerationIncludingGravity.y);
        	    signAngleNew=get_angle({x:0,y:0},{x:signX,y:signY});
        	  }}
        }, true); 
    } catch (ignore) {alert("DevMot not init!");}
    
    try {
        tizen.systeminfo.getPropertyValue("BATTERY", onBatteryUpdate, null);
    } catch (ignore) {alert("BATT prz not init!");}

    try {
        tizen.systeminfo.addPropertyValueChangeListener("BATTERY", onBatteryUpdate);
    } catch (ignore) {alert("BATT Ste not init!");}
    m_cfg.set("shadows", true);
    m_cfg.set("antialiasing", true);
    //m_cfg.set("shadows", false);
    load();
}

function preloader_cb(percentage) {
    m_preloader.update_preloader(percentage);
}

/**
 * load the scene data
 */
function load() {
     m_data.load("testshdw-t3d.json", load_cb, preloader_cb);
}


function frame_cb(){
    m_cfg.set("max_fps", 1);
}


/**
 * callback executed when the scene is loaded
 */
function load_cb() {

   m_cfg.set("max_fps", 1);
   setInterval(checkTime, 500);
   
   m_main.append_loop_cb(frame_cb);

}

function getDate() {
    var dateget;
    try {
        dateget = tizen.time.getCurrentDateTime();
    } catch (err) {

        dateget = new Date();
    }

    return dateget;
}



function checkTime() {

	now = getDate();
	d = now.getDate();
	h = now.getHours();
	m = now.getMinutes();
	s = now.getSeconds();
	h = h % 12;
	
	b = (battLevel)*Math.PI/180; // 100 grad = 100%  0=0%	
	d = (d * 11.612903225806451612903225806452)*(Math.PI/180);
	
	h = (h * Math.PI / 6) +(m * Math.PI / (6 * 60)) +(s * Math.PI / (360 * 60));
	l= ((m+s/60)/0.3333333333333333333333333333333333333* Math.PI / 6); 
	m = (m * Math.PI / 30) + (s * Math.PI / (30 * 60));
	s = (s * Math.PI / 30);
	
	m_trans.set_rotation_euler(m_scs.get_object_by_name("hh"), 0, -h, 0);
	m_trans.set_rotation_euler(m_scs.get_object_by_name("mm"), 0, -m, 0);
	m_trans.set_rotation_euler(m_scs.get_object_by_name("ss"), 0, -s, 0);
	m_trans.set_rotation_euler(m_scs.get_object_by_name("dd"), 0, -d, 0);
	m_trans.set_rotation_euler(m_scs.get_object_by_name("bb"), 0, -b, 0);
	m_trans.set_rotation_euler(m_scs.get_object_by_name("emptyLight"), 0, l, 0);
}

});

// import the app module and start the app by calling the init method
b4w.require("simple_app").init();
Денис
04 августа 2016 19:56
Ответ на сообщение пользователя Иван Любовников
да, других способов не могу придумать

вообщем в моем случае после снятия с паузы показывает 1й кадр старый 2й кадр переход на сл. старый кадр (+1 сек) и за тем уже скачок на новый кадр с правильным временем..

или я что то сделал не так или хз (
Денис
04 августа 2016 18:56
Ответ на сообщение пользователя Семенцов Роман
Можно использовать canvas-текстуру. Пример можно посмотреть тут. Если кликнуть по красному ящику по середине, прилетит письмо, где можно редактировать текст
Да, либо генерировать процедурно буквы через динамическую геометрию. Тут на форуме недавно (вчера вроде) была создана тема, посвященная ей


да про канвас тестуру думал.. помню тот пример. еще напрашивается пример в вебкамерой )

а про динамич. геометрию как мне кажется шрифты слишком сложный объект чтоб его там в JS крутить так.. ((
ну может какие то векторные шрифты как то автоматически преобразовывать .. хз..
Денис
04 августа 2016 18:50
Ответ на сообщение пользователя Иван Любовников
нет, resume сам по себе мало, что делает, а max_fps учитывается только в цикле requestAnimationFrame, который вызывается асинхронно

я так и думал ((
т.е. обязательно вызвать m_main.append_loop_cb(frame_cb); и уже в нем задать ?
просто не хотелось б усложнять там и так у меня еще кучу всего надо прилепить от часов поверх рендера (((
Денис
04 августа 2016 18:42
Вот задумался над тем как выводить произвольный текст выбранным шрифтом из JS на объекте или как объект ?

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

а вот про объмный в виде меша это видимо только движком можно сделать, но как я понял такой функции нет ? хотя при экспорте из Блендера текст и без преобразования в меш отлично выводится в b4w
( тут только одинвариант напрашивается , приготовить побуквенно весь шрифт и его уже поставлять во время выполнения JS на рендере)


что скажете?
Денис
04 августа 2016 18:33
Ответ на сообщение пользователя Иван Любовников
так и есть……
Костыль с выставлением >60 фпс должен нормально сработать.

интересно а так сразу если подрят выполнить должно сработать?

    
document.addEventListener("visibilitychange", function() {
        if (!document.hidden) {
        		m_cfg.set("max_fps", 60);
        		m_main.resume();
        		m_cfg.set("max_fps", 1);
        }
    });


что то не получатся вроде.. модет стало чуть короче время задержки или я просто придумываю ?
Денис
02 августа 2016 10:36
Ответ на сообщение пользователя Кирилл
Устройству всёравно нужно время что бы отрендерить первый кадр. Можно модифицировать код так, что бы изначально был чёрный экран или какая нить картинка, а после того как отрисуется сцена, после метода resume(), отобразилась картинка рендера.

Я бы на вашем месте поставил вместо чёрного фона картинку циферблата без стрелок
…………….

про отобразить картинку. проблема в том что свет динамический и любое небольшое изменение в картинке видно как дергаье изобраажения


Хотелось бы без костыликофф ((( обойтись тем более что разработчики тут где то есть, надеюсь услышат и ответят.
Денис
01 августа 2016 23:48
Проблема в том что мой тестовый девайс выдает макс 2-4 к в сек. на моей сцене и я его собственно поставил на 1к в сек вполне логично. и боюсь что в моем случае этот метод не сработает так как на ПК.

к стати пример в ФФ как то не работает кубик не крутится на кнопки реакции почти нет, кроме транслейт.

Спасибо за инфу.. попробуем дождаться ответа от программистов движка.. , как будто это буфер показывается сразу готовый.. , а надо по идее сразу запускать рендер в очищенный предварительно буфер и не ждать наступление сл. кадра. вроде как все асинхронно происходит же? верно?

ну и про "метод, повешенный с помощью append_loop_cb() продолжает выполняться," хотелось бы уточнений
Денис
31 июля 2016 15:24
Движок в браузере показывает несколько "старых" кадров
после "снятия с ПАУЗЫ" как обновить рендер до отображения?
( или при возврате фокуса на окно, возвращения с энергосберегающего режима итд… )

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

(мой рендер 1к в сек ограничен(так надо))

обычно подобные дела с прямым доступом к рендеру делал так:
    document.addEventListener("visibilitychange", function() {
        if (!document.hidden) {
        		//обновить пересчитаный кадр или   
                       //как вариант в 2Д - window.requestAnimationFrame(РЕФРЕШЪ);
        }
    }); 


как в данном "движке" это пофиксить подскажите плиз.
СПАСИБО
Денис
29 июля 2016 20:26
Ответ на сообщение пользователя Иван Любовников
….
device должен быть валидный и иметь тип m_input.DEVICE_GYRO


да конечно я незначал девайсу соответсвие:
gyro_device = m_input.get_device_by_type(m_input.DEVICE_GYRO);


пока пробую приделать свой старый метод с прямым доступом к гироскопу минуя браузер.
заработает потом буду упрощать попробую найти где оно не срабатывает ((
Денис