copyentity

Blitz3D Forums/Blitz3D Beginners Area/copyentity

Prym(Posted 2016) [#1]
Est-ce que "copyentity" conserve l'information de collision ?

Does 'copyentity' keep the collision information ?
Thanks for this simple question .


RemiD(Posted 2016) [#2]
I think that no, because each time you use copyentity, it creates a new reference (and thus a new entity) even if the same mesh can be used for rendering.
To check, do something like that :
ellipsoid = CreatePivot()
EntityRadius(ellipsoid,0.25)
EntityType(ellipsoid,GroupA)
DebugLog("ellipsoid reference = "+ellipsoid)

ellipsoidcopy = CopyEntity(ellipsoid)
EntityRadius(ellipsoidcopy,0.25)
EntityType(ellipsoidcopy,GroupB)
DebugLog("ellipsoidcopy reference = "+ellipsoidcopy)

if the 2 references are the same, it means they are the same, else it means they are different ;)


Flanker(Posted 2016) [#3]
If you create a sphere with a collision type and a collision radius, all the copies will have the same parameters, so yes it keeps collision informations.


Bobysait(Posted 2016) [#4]
CopyEntity "copie" tous les attributs de l'entité, hierarchie, animations et collisions incluses. par "copie" il faut comprendre qu'en gros, ça crée un pointeur vers les données de la source, mais ça ne copie pas au sens strict les données (En définitive elles sont partagées).

Ce que dis RemiD est un peu absurde en fait. Les Nombre retourné par les fonctions CreateXXXX (CreateCamera/CreateMesh/CreateSphere/etc...) ainsi que CopyEntity/CopyMesh/etc ...(en fait, tout ce qui crée une entité) ne sont que les adresses des structures dans la mémoire (ram). Elles sont forcément différentes puisque ce sont des entités bien distinctes. En revanche, ce que l'entité contient peut être une "instanciation" et non une copie de données.

Derrière la structure de l'objet il y a d'autres objets qui contiennent les données (l'adresse de l'entité, elle, pointe vers la classe maire "Entity", mais la structure, contient des données qui peuvent être des pointeurs vers d'autres données qui peuvent ou non être partagés)
Par exemple, dans une bibliothèque, on aurait des index pour trier les livres par catégorie, par ordre alphabétique des titres et par ordre alphabétique des auteurs
Les index pointent donc vers des livres, mais ce ne sont que des "pointeurs", le livre n'est pas dupliqué pour chaque index, il n'y a que la référence vers le livre

Maintenant, pour simplifier, imagine que tu as une classe entity
Type Entity
 Field Matrix.Mat4
 Field CollisionData.TCollisionData
End Type

l'objet matrix, pour des raisons évidente est unique pour chaque entité (c'est le tableau qui contient les position, rotations, dimensions de l'objet)
l'objet CollisionData en revanche pointe vers un objet qui peut être partagé entre plusieurs entités (ce qui permet de gagner de la place dans la ram)
CollisionData n'est donc qu'un pointeur vers les données de collisions
Donc, quand tu copies un objet, il copie non pas les données contenues dans ce pointeur, mais le pointeur lui-même (les données, c'est le livre, l'entité ne fait que répertorié l'objet comme un index de la bibliothèque).

Donc, chaque instance d'une entité est unique, mais le contenu lui peut être unique ou identique, et dans le cas des copy tout est "instancié" (copie des pointeurs et non des données).

Petite parallèle :
- pour ce qui est des mesh, c'est aussi pour cette raison qu'on a un PaintMesh et un PaintEntity distinct, ce qui permet d'avoir un mesh "copié" (instancié) qui aura quand même sa propre couleur (sans quoi, tout ce qui modifie le mesh original ou une de ses copies, modifie toutes les copies) -> à contrario, PaintMesh modifie le matériau des surfaces, donc affecte toutes les copies.


RemiD(Posted 2016) [#5]
it depends what you mean by "collisions informations", if you copy an entity, it will have the same properties (unless you change them), but they will be different entities and thus different ellipsoids... That's what i meant.


Bobysait(Posted 2016) [#6]

but they will be different entities and thus different ellipsoids... That's what i meant.



Obviously, they are different entities, but No, they havent' different "ellipsoids"
Object::Object( const Object &o ):
Entity(o),
order(o.order),animator(0),last_copy(0),
coll_type(o.coll_type),coll_radii(o.coll_radii),coll_box(o.coll_box),
pick_geom(o.pick_geom),obscurer(o.obscurer),captured(false){
	reset();
}

This is the code of the copyentity invocated for the class Object.
It uses the reference of the source collision object. So, the copied entity has not different collision informations with same data copied, they have the same data object.


RemiD(Posted 2016) [#7]
For me ellipsoid = entity with a radius, and when you use entitycolor on an entity which has a radius and which has a mesh associated with it, this will change its color...