
Comme vous l'aurez deviné je m’intéresse à la 3D de purebasic en ce moment et je décortique l'exemple TerrainBlend histoire d'essayer de comprendre comment tout cela fonctionne.
Avec l'aide de purebasic ou les termes qui y sont employés sont souvent représentatif de tout et de rien à mes yeux, et avec l'exemple TerrainBlend, excellentissime ! Il donne vraiment envie de s'y intéresser, mais je le trouve un peu avare de commentaires, j'ai beaucoup de mal à comprendre.
Ce que j'ai cru comprendre c'est :
1.
CreateTerrain(#Terrain, Taille, TailleMonde, Echelle, NbCouches, NomFichier$, Extension$)
Taille = Nombre de poly qui constitue le terrain ?
TailleMonde = TailleXY de la parcelle principale ?
____________________________________________________________________________
2.
Chaque parcelle ajouté avec DefineTerrainTile() dispose de sa propre HeightMap (il n'y a pas de HeightMap globale incluant toutes les parcelles)
____________________________________________________________________________
3.
TerrainTilePointX ou Y(#Terrain, ParcelleX, ParcelleY, x, y, z) donne à partir d'un point de l'espace 3D sa coordonné X ou Y dans l'image qui sert de heightmap à cette parcelle
____________________________________________________________________________
4.
On affecte pas directement une hauteur en jouant sur les vertex, il faut changer la valeur dans la HeightMap de la parcelle concernée qui se répercute sur le terrain dès qu'on l'update.
____________________________________________________________________________
5.
Dans l'exemple TerrainBlend, la procedure DoTerrainModify(), pourquoi on multiplie par imgSize ?
Code : Tout sélectionner
Procedure DoTerrainModify(tx, ty, wx.f, wy.f, wz.f, mBrushSizeTerrainSpace.f, TimeElapsed.f)
imgSize.f = TerrainTileLayerMapSize(0, tx, ty)
Pointx.f = TerrainTilePointX(0, tx, ty, wx, wy, wz)
Pointy.f = TerrainTilePointY(0, tx, ty, wx, wy, wz)
startx = (Pointx - mBrushSizeTerrainSpace) * imgSize
starty = (Pointy - mBrushSizeTerrainSpace) * imgSize
endx = (Pointx + mBrushSizeTerrainSpace) * imgSize
endy = (Pointy + mBrushSizeTerrainSpace) * imgSize
startx = Max(startx, 0)
starty = Max(starty, 0)
endx = Min(endx, imgSize)
endy = Min(endy, imgSize)
For y = starty To endy
For x = startx To endx
tsXdist.f = (x / imgSize) - Pointx
tsYdist.f = (y / imgSize) - Pointy
weight.f = Min(1.0, Sqr(tsYdist * tsYdist + tsXdist * tsXdist) / (0.5 * mBrushSizeTerrainSpace))
weight = 1.0 - (weight * weight)
paint.f = weight * TimeElapsed
imgY = imgSize - y
val.f = GetTerrainTileLayerBlend(0, tx, ty, 1, x, imgY) + paint
Clamp(@val, 0, 1)
SetTerrainTileLayerBlend(0, tx, ty, 1, x, imgY, val)
Next x
Next y
UpdateTerrainTileLayerBlend(0, tx, ty, 1)
EndProcedure
