Sign in to follow this  
Dad72

markVerticesDataAsUpdatable not update changes

Recommended Posts

Hello,

When I use markVerticesDataAsUpdatable, my terrain was updated correctly via a file. But, now this seems  not to work today.

I do this:

$.getJSON("ground.data?" + (new Date()).getTime(), function(data) {			
    global.terrain.markVerticesDataAsUpdatable(BABYLON.VertexBuffer.PositionKind, true);
});

And the elevation of the vertices was updated automatically if the file was updated. But now retesting, this no longer seems to work.

Also, I do not find this function (intellisens) in the playground.

Are there any changes for this function or something else that prevents putting a days? 

Share this post


Link to post
Share on other sites

I can not reproduce it on the PG because I use PHP to edit the file.

I'll explain in French to make simple.

J'ai un editeur de terrain et un editeur de zone sur deux onglet different. sur l’éditeur de zone, je charge un terrain venant d'un fichier data.babylon, Ensuite je charge sur l’éditeur de terrain le meme terrain du meme fichier data.babylon que je peut éditer pour élever les sommets par exemple. Ensuite quand j'enregistre le terrain sur l’éditeur de terrain, cela modifie le fichier data.babylon avec les nouvelles élévation de sommet (chose que je fait en PHP pour réécrire dans le fichier babylon), ce qui avait pour effet de modifier le terrain cotée editeur de zone et cela fonctionnait. Mais maintenant, quand ce fichier babylon est modifier, il ne met pas a jour la scene cotée editeur de zone.

Pour que mes changements soit apparent, il faut que je réactualise le terrain sur l’éditeur de zone (et c’est pris en compte, donc les changements on bien lieux, mais pas sur la scene). Je n'avais pas besoin d'actualiser, la simple modification des données dans le fichier suffisait pour mettre a jour le terrain en prenant en compte les modifications venant de l’éditeur de terrain. Je suppose que quelque chose a changer qui empêche la mise a jour des données venant du fichier babylon. Je voie ma scene ce rafraîchir en mettant a jour mes textures, mais pas les vertex modifier.

Je sait que cela fonctionnait bien quand la fonction markVerticesDataAsUpdatable a été créer, mais plus maintenant après avoir re-tester cela hier. Cette fonction markVerticesDataAsUpdatable réactualisait la scene correctement en prenant en compte les modifications du fichier, mais plus maintenant, les vertex ou autre chose ne sont plus mis a jour (je ne saurait pas dire quoi exactement, mais je sais que avant cela fonctionnais).

Ou sinon c’est cette fonction qui mettait a jour updateCoordinateHeights, je ne sais pas.

Désoler de ne pas pouvoir le recréer sur le PG, j'utilise du PHP pour modifier le fichier babylon, ce que je ne peut pas faire sur le playground. J’espère que mes explication pourrons t'aider a mieux comprendre de quoi ca peut venir.

 

Share this post


Link to post
Share on other sites

Helas je comprends ton point mais je ne peux pas aider si je ne reproduis pas. markVerticesDataAsUpdatable va en fait recreer tous les vertex buffers en les flaggant updatable. Rien n'a change sinon.

 

du coup je me demande si ca ne vient pas d'ailleurs (genre le reload? un probleme de cache?)

 

 

 

Share this post


Link to post
Share on other sites

Oui ca vient surement d'ailleur. Je ne sais pas comment reproduire cela dans le PG. J'essaye de trouver une idée qui pourrais reproduire le bug, mais j'en ai pas qui me vient encore.

Peut être que tu aurais une idée de ce qui pourrait éventuellement empêcher la réactualisation depuis les dernière changement qu'il y a eu. je sais qu'il y a eu des changement sur tout ce qui est vertex recensement, ca pourrait venir de là ?

Merci DK. Je cherche de mon cotée pour reproduire sur le PG, si je trouve une idée de comment.

Share this post


Link to post
Share on other sites

Ah, je ne sais pas alors pourquoi j'ai ce bug maintenant. Je vais essayer de comprendre et voir comment je peut reproduire un cas sur le PG (j'ai peut être une idée qu'il faut que j'explore). A moins que je trouve une solution autres. Je reviendrais pour te dire.

Share this post


Link to post
Share on other sites

Ok, j'ai trouver comment reproduire le bug et j'ai aussi trouver le correctif. Pour ce qui me parait être un bug:  je t'ai mis des commentaires dans le premier PG. En faite, je créer un premier terrain avec ImportMesh et je vais chercher ensuite tout les vertex modifier dans un fichier a part que j'appel avec getJson. Mais les vertex changer ne sont pas pris en compte. J'ai aussi mis en commentaire un autre ImportMesh pour que tu voie le terrain comme il devrais ressembler après modification (celui qui est appeler dans le getJson)

Mais comme on peut le voir, rien ne change, le terrain reste a son état d'origine après son chargement. Avant cela fonctionnais, markVerticesDataAsUpdatable suffisait pour mettre a jour la scene.

http://www.babylonjs-playground.com/#DPDV50

Maintenant le correctif. Si j'utilise setVerticesData(), cela fonctionne. Ce que je ne comprend pas c’est pourquoi avant avec markVerticesDataAsUpdatable, cela suffisait, je n'avais plus besoin d'utiliser setVerticesData().

http://www.babylonjs-playground.com/#DPDV50#2

Alors peut être que c'est comme ca qu'il faut faire, que avant j'étais sur mes cache qui m'avais donner l'impression que markVerticesDataAsUpdatable mettait a jour ma scene apres avoir retirer les setVerticesData(). Si c’est ca, désoler du signalement. je mettrait en résolu.

 

 

Share this post


Link to post
Share on other sites

Oui, mais si tu enlève setVerticesData comme tu a fait, le terrain reste le meme. il ne modifie pas le terrain comme il devrais être dans mon exemple.

Mais c’est vrais que j'ai oublier de mettre les normal en updatable aussi.

Share this post


Link to post
Share on other sites

Ça c’est le resultat que je devrais avoir (on peut voir une difference au niveau des élévation)

http://www.babylonjs-playground.com/#DPDV50#7

Et la le resultat avant

http://www.babylonjs-playground.com/#DPDV50#8

et la le bug ou je suis obliger d'utiliser setVerticeData pour avoir le resultat souhaiter

http://www.babylonjs-playground.com/#DPDV50#9

 

Share this post


Link to post
Share on other sites

Voila en image ce que j'ai sur le 7 qui est le resultat que je devrais avoir sur le 9 après que le terrain soit editer.

5916d195ae2e3_2017-05-1311_27_00-Babylon.jsPlayground.jpg.d20d4119d279e56ea7e22683fb2d71c4.jpg

et sur le 8 c’est le terrain avant qu'il ne soit éditer

5916d196ac6f7_2017-05-1311_26_44-Babylon.jsPlayground.jpg.3c86ae3b6c69bc8281d269f816343c5f.jpg

Sur ce PG le bug (ligne 26 et 27) : http://www.babylonjs-playground.com/#DPDV50#9 (il faut patienter quelque seconde quand le terrain s'affiche)

Sur ce PG, je corrige en utilisant setVerticeData (ligne 30 et 31) : http://www.babylonjs-playground.com/#DPDV50#10 (il faut patienter quelque seconde quand le terrain s'affiche)

 

 

 

 

Share this post


Link to post
Share on other sites

Ok, j'ai compris pourquoi. C’est quand je créais le terrain je le mettait en déjà en updatable, donc après l'avoir éditer le markVerticesDataAsUpdatable() ne fonctionnait pas a cause de ce code :

if (this.getVertexBuffer(kind).isUpdatable() === updatable) {
    return;
}

du coup la ligne suivante :  this.setVerticesData(kind, this.getVerticesData(kind), updatable); n’était pas exécuter et ne mettait pas a jour mon terrain. 

Fonction ici : https://github.com/BabylonJS/Babylon.js/blob/master/src/Mesh/babylon.mesh.ts#L726

Cette condition isUpdatable n'est pas nécessaire car il empêche de mettre a jour les vertexes. 

D'ailleur on devrais mettre tout a true car si on utilise cette fonction c’est pas pour mettre false. Je pensait a quelque chose comme ça :

public markVerticesDataAsUpdatable(kind: string) {	
	this.setVerticesData(kind, this.getVerticesData(kind), true);
}

J'ai donc corriger mon probleme ici :

http://www.babylonjs-playground.com/#DPDV50#11

-----------------------------------------------------------------

PS : J'aurais plus vue une fonction comme cela pour simplifier (je suis pas sûr pour le nom de la fonction) :

public allVerticesDataAsUpdatable() {
	let PositionKind = BABYLON.VertexBuffer.PositionKind;
	let NormalKind = BABYLON.VertexBuffer.NormalKind;	
	this.setVerticesData(PositionKind, this.getVerticesData(PositionKind), true);			
	this.setVerticesData(NormalKind, this.getVerticesData(NormalKind), true);
}

 

Share this post


Link to post
Share on other sites

Ok super

content que tu aies trouve!. Le truc c'est que allVerticesDataAsUpdatable ca doit vraiment tout faire: genre color, bones, etc.. Or on ne sait pas si l'utilisateur veut vraiment tout ca

Quote

Cette condition isUpdatable n'est pas nécessaire car il empêche de mettre a jour les vertexes. 

Ben ca empeche de reconstruire le buffer si il est deja comme tu veux

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.