Voxel fürs 3d Gamestudio

Posted By: ratz

Voxel fürs 3d Gamestudio - 09/06/13 13:21

Hallo

mein Kollege hat mich gestern auf seiner X-box 360
das Spiel "Minecraft" zocken lassen ...

ich war begeistert von der umsetzung und habe immer gedacht, dass es ein ganz einfaches Kinderspiel were
__________________________

nun möchte ich diese Technick gerne ins 3D gamestudio
umsetzen , nach langen googlen bin ich auf folgede große
Namen gestoßen:

CUBE_X und VOXEL

nach weiterem googlen hab ich das jetzt so verstanden:

ein Voxel ist ein Pixel mit Volumen welches in die
3te dimension positioniert und gezeichnet wird..

beim CubeX handelt es sich anscheind um ein Sammel-begrif
und ist ein bereits umgesetztes projeckt fürs 3d-GS

über edliche links bin ich dann auf ein Download gestoßen
und habe mir das project mal angeuckt ...

im verzeichnis "Code/cubeX.c" habe ich dann folgendes gefunden:

Code:
BLOCK* block_create(VECTOR* pos, BLOCK_MATERIAL* material)
{
 ...
 // GANZ VIEL CODE !!!! 
 ...
}



und dann plötzlich:

weiter unten die zusammensetzung:
Code:
function block_createTop(BLOCK* block,BLOCK_MATERIAL* material,VECTOR* pos)
{
	if(block->top)
		return;
	block->top = ent_create(material->top,vector(pos->x,pos->y,pos->z + BLOCK_SIZE_HALF),NULL);
	set(block->top,DECAL | NOFILTER);
	reset(block->top,DYNAMIC);
	block->top->tilt = 90;
	block->top->skill[0] = block;
}

function block_createBottom(BLOCK* block,BLOCK_MATERIAL* material,VECTOR* pos)
{
	if(block->bottom)
		return;
	block->bottom = ent_create(material->bottom,vector(pos->x,pos->y,pos->z - BLOCK_SIZE_HALF),NULL);
	set(block->bottom,DECAL | NOFILTER);
	reset(block->bottom,DYNAMIC);
	block->bottom->tilt = -90;
	block->bottom->skill[0] = block;
}

function block_createRight(BLOCK* block,BLOCK_MATERIAL* material,VECTOR* pos)
{
	if(block->right)
		return;
	block->right = ent_create(material->right,vector(pos->x,pos->y - BLOCK_SIZE_HALF,pos->z),NULL);
	set(block->right,DECAL | NOFILTER);
	reset(block->right,DYNAMIC);
	block->right->pan = -90;
	block->right->skill[0] = block;
}

function block_createLeft(BLOCK* block,BLOCK_MATERIAL* material,VECTOR* pos)
{
	if(block->left)
		return;
	block->left = ent_create(material->left,vector(pos->x,pos->y + BLOCK_SIZE_HALF,pos->z),NULL);
	set(block->left,DECAL | NOFILTER);
	reset(block->left,DYNAMIC);
	block->left->pan = 90;
	block->left->skill[0] = block;
}

function block_createFront(BLOCK* block,BLOCK_MATERIAL* material,VECTOR* pos)
{
	if(block->front)
		return;
	block->front = ent_create(material->front,vector(pos->x + BLOCK_SIZE_HALF,pos->y,pos->z),NULL);
	set(block->front,DECAL | NOFILTER);
	reset(block->front,DYNAMIC);
	block->front->skill[0] = block;
}

function block_createBack(BLOCK* block,BLOCK_MATERIAL* material,VECTOR* pos)
{
	if(block->back)
		return;
	block->back = ent_create(material->back,vector(pos->x - BLOCK_SIZE_HALF,pos->y,pos->z),NULL);
	set(block->back,DECAL | NOFILTER);
	reset(block->back,DYNAMIC);
	block->back->pan = 180;
	block->back->skill[0] = block;
}



usw ... usw ... usw...


FRAGE:

wie bekomme ich das ganze denn jetzt in die 3te
Dimension ????????

immer wieder erscheint der befehl:
Code:
"ent_create"



- ent_create lässt aber eigendlich nur 1000 entits zu
(ich benutze die A8 Gratis version)

ich möchte gerne wissen wie man das ganze
ohne den ganzen material-kram verwirklicht

so das einfach nur weisse blöcke zu sehn sind ...

Warum das ganze ???

-> erstelle ich 3 Cubes (.mdl) die nebeneinander
liegen hat jeder Cube schatten , licht ect.

Sprich: Man sieht einfach das, das erstellte
object aus 3 cubes gemacht worden ist

hier:





sind also in 3d-gs erstelle voxels auch nur Entitys ??

ich will das wissen weil ich da was bestimmtes vor habe wink
...
Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/06/13 13:48

für jedes voxel eine ENTITY* zu verwenden ist EXTREM ineffizient und wenn du etwas minecraft ähnliches hinbekommen willst leider viel zu langsam.

Du könntest also für z.B. 16³ blöcke eine ENTITY* verwenden, dabei musst du aber auch das meshen per direct-x machen.

Außerdem musst du auch block-seiten, die nicht sichtbar sind erst garnicht erstellen, weil das wieder extrem viel leistung für garnichts verbrauchen würde.

...und mit dem lighting will ich erst garnicht anfangen.

Also meiner Meinung nach ist es relativ schwer ein voxelsystem wie das in minecraft verwendete zu coden, vor Allem, wenn man noch keine Ahnung hat, wie man mit vertex / index buffern arbeitet.
Posted By: MasterQ32

Re: Voxel fürs 3d Gamestudio - 09/06/13 14:24

Quote:
beim CubeX handelt es sich anscheind um ein Sammel-begrif
und ist ein bereits umgesetztes projeckt fürs 3d-GS

Autor meldet sich:
Ja, CubeX ist ein (altes) Voxel-System, welches eigentlich auch mit der Free-Version gehen sollte. Ich habe den Ansatz von Kartoffel auf einfache Weise verfolgt, in dem ich Sprites anstelle von Würfeln verwende und nur die sichtbaren Würfelseiten darstelle. max_entities kann übrigens vor dem Level-Laden erhöht werden (sollte auch irgendwo ein Beispiel dabei sein).

Ich habe das System nochmal überarbeitet und in TUST veröffentlich:
Kubus Voxelizer
Es kann aber sein, dass Kubus eine Extra- oder Commercial-Version benötigt.

Es ist auf jeden Fall nicht einfach, so ein System optimal mit Gamestudio umzusetzen.
Gruß
Felix
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/09/13 11:12

laugh jaaa .. ersteinmal danke für so viel information
ich war lange nicht mehr hier on

@ MasterQ32:

an sprites habe ich auch schon gedacht , nur drehen diese sich halt zur
camera mit -> Gestern lass ich im buch:
"Computerspiele - Programmierung und Design"
(hab ich schon ganz lange laugh )
das es in Gamestudio A4 ein Flag gab namens:

My.ORIENTED = ON;

gab

gibt es in lite C ein solches flag ? .. bestimmt finde ich es gleich laugh
Posted By: MasterQ32

Re: Voxel fürs 3d Gamestudio - 09/09/13 11:20

ja, das nennt sich bei sprites DECAL.
das verhindert, dass sie von zwei seiten gezeichnet werden
und dass sie sich automatisch mitdrehen
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/09/13 11:26

okey , jetzt muss ich gucken wie ich das mache ^^

benutze ich ent_create kann ich dann auch flags benuzen ?

Code:
function create_test()
{
 var i;
 for (i=0; i<2; i++) // repeat 2 times
 {	
  ent_create("texture.bmp",vector(10+i,0,0),NULL);
  set(my,DECAL);
 }
}



so kommt die fehlermeldung: "Script-Crah in create test"

mit der for-schleife experimentiere ich nur rum wink
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/09/13 11:32

habs grin

Code:
ENTITY* test;

function create_()
{
 
  test = ent_create("texture.bmp",vector(10,0,0),NULL);
  set(test,DECAL);
 
}

Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/09/13 11:41

you sollte auch gehen, da musst du keinen zusätzlichen pointer erstellen.
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/09/13 12:33

Boa damit kann man ja richtig geile sachen machen

laugh sieht aus wie ein Direct X oder Open_GL beispiel grin




ich hab jetzt mal 32x32 texturen gemacht grin

Code:
///////////////////////////////



ENTITY* b1;
ENTITY* b2;
ENTITY* b3;
ENTITY* b4;
ENTITY* b5;
ENTITY* b6;


function create_cube()
{
 
  b1 = ent_create("test1.bmp",vector(42,0,0),NULL);  
  b1.pan = 0;
  
  b2 = ent_create("test2.bmp",vector(10,0,0),NULL);
  b2.pan = -180;
 
  b3 = ent_create("test3.bmp",vector(26,16,0),NULL);
  b3.pan = 90;
  
  b4 = ent_create("test1.bmp",vector(26,-16,0),NULL);
  b4.pan = -90;
  
 
  b5 = ent_create("test2.bmp",vector(26,0,16),NULL);
  b5.tilt = 90;

  
  set(b1,DECAL);
  set(b2,DECAL);
  set(b3,DECAL);
  set(b4,DECAL);
  set(b5,DECAL);

  
}

Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/09/13 12:47

was ich mit meinem letzten post meinte:

Code:
you = ent_create("test1.bmp",vector(42,0,0),NULL);  
you.pan = 0;
set(you,DECAL);


und ich wiederhol mich nochmal, 1 entity = 1 block ist VIEL zu ineffizient.
1 entity = 1 block-seite ist da noch schlimmer.
Posted By: rayp

Re: Voxel fürs 3d Gamestudio - 09/09/13 12:56

So wäre es noch besser, falls ent_create nicht erfolgreich war ^^
Code:
you = ent_create("test1.bmp",vector(42,0,0),NULL);  
if (you){
   you.pan = 0;
   set(you,DECAL);
}

Posted By: MasterQ32

Re: Voxel fürs 3d Gamestudio - 09/09/13 13:03

@Kartoffel: Sprites rendern bei weitem schneller als Model-Entities. Von daher sollte das sich ausgleichen...
Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/09/13 13:33

kann man ja mal mit nem 256³ level ausprobieren
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/09/13 15:26

...
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/09/13 15:59

gute laufzeit wink ^^ 146 fps
ich hab die max_entity jetzt mal auf 2000
gemacht und mithilfe der for-scheife eine lange
strecke gezeichnet...




Code:
var i;

var coord_counter_x =32;
var coord_counter_y =32;

ENTITY* cube[500];

function create_atom()
{
 for (i=0; i<500; i++) 
 {	
  cube[i] = ent_create("test1.bmp",vector(42,0+coord_counter_x,0),NULL);  
  cube[i].pan = 180;

  cube[i] = ent_create("test2.bmp",vector(10,0+coord_counter_x,0),NULL);
  cube[i].pan = -180;
 
  cube[i] = ent_create("test3.bmp",vector(26,16+coord_counter_x,0),NULL);
  cube[i].pan = 90;
  
  cube[i] = ent_create("test1.bmp",vector(26,-16+coord_counter_x,0),NULL);
  cube[i].pan = -90;
  
  cube[i] = ent_create("test2.bmp",vector(26,0+coord_counter_x,16),NULL);
  cube[i].tilt = 90;
  
  set(cube[i],DECAL);

  i++;
  coord_counter_x += 35;
  coord_counter_y += 35;
 }
}


function main()
{
max_entities = 2000;
	level_load("test.WMB");
   create_atom();
}



wink ich melde mich später wieder wenn ich was brauche oder euch was zeigen will

-Danke nochmals wink
Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/09/13 16:57

...kleines beispiel: 2500 blöcke, 1 entity



sichtbarkeit des models macht +- 4fps aus, die restliche auslastung kommt durch das postprocessing und 8x supersampling.

ohne nachbearbeitung und antialiasing läuft das ganze auf ~2200fps.

edit: nur um das nochmal klarzustellen: ich will nicht sagen, dass dein ansatz falsch ist, du wirst aber relativ schnell an begrenzungen stoßen (fps & entity limit)
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/09/13 17:20

so ... jetzt muckt meine for-schleife rum
ich will nichtnur in die Länge, sondern auch in
der Breite erstellen ...

Code:
...



frown und das ist das Ergebniss


was mache ich falsch ?

drehe ich das ganze um in der schleife dann kommt das gleiche ergebniss
mache ich es anders , dann meint mein Programm beim ausführen script-crash
Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/09/13 17:24

du musst die coord counter nach den schleifen immer wieder resetten
edit: und du verwendest cube[i] mehrmals. benutze doch einfach 2 variablen, anstatt i_x, i_y und i.
edit2: achso, natürlich wäre es auch naheliegend, einen 2 dimensionalen ent array zu verwenden.
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/10/13 08:19

kann mir mal wer die schleife richtig einstellen
(wo am schluss coord_x/coord_y resetten )?

ich bekomm irgenwie nur komische muster anstatt
eine fläche die in die länge sowie in die breite gehen soll grin

und wie geht das, dass ich den cube[i] nur einmal verwenden muss/soll/kann?

-> und ent_array gibs im handbuch nicht
Posted By: the_clown

Re: Voxel fürs 3d Gamestudio - 09/10/13 10:24

coord_counter_y müsstest du vor der inneren schleife immer zurücksetzen. ist aber obsoleter rat da die ganze funktion so langfristig nicht funktionieren kann.

erstmal zu ent array: das ist keine funktion (nichts mit ent_array oder so) sondern kurz für entity-array. cube[] ist ein entity array, genauer ein array von pointern vom typ entity. was ein array ist solltest du auf jeden fall wissen wenn du derartige dinge programmieren möchtest, arrays sind eine recht fundamentale datenstruktur.

ein problem in deinem code ist das du irgendwie versuchst alle entities, die einen würfel bilden, in einem einzigen array-element zu speichern, denn du setzt cube[i] in deiner schleife gleich mehrmals auf den rückgabewert eines ent_create aufrufs. im endeffekt zeigt cube[i] dadurch am ende der schleife nur auf die zuletzt erzeugte seite des i-ten würfels. nebenbei bewirkt das dass auch nur diese seite das DECAL flag gesetzt hat; das sich nicht alle anderen seiten nach der kamera ausrichten kommt daher dass du ihre ausrichtung direkt nach dem erzeugen manuell setzt, was wenn ich mich richtig erinnere den gleichen effekt wie das flag hat. wenn du später durch dein array iterierst, um beispielsweise bei allen blöcken die farbe zu ändern oder so, wirst du feststellen dass änderungen sich nur auf eine seite auswirken.

außerdem ist es relativ ineffizient die würfel in einem EINdimensionalen array zu speichern, besser wäre es, ein ZWEIdimensionales zu verwenden, dadurch kannst du später gezielt auf blöcke in bestimmten zeilen und spalten deiner blockwelt zugreifen. das spart dir auch 4 deiner 5 variablen im code. lies dir mal die abschnitte zu arrays im handbuch durch, die erklären das glaub ich ganz gut. später wenn du tatsächlich welten aus deinen blöcken bauen willst wäre sogar ein dreidimensionales array ideal (auch wenn ich nicht mehr weiß ob das in lite-c geht).
am besten wäre es aber sowieso, zwei eigene datenstrukturen zu verwenden, eine um alle seiten eines blockes abzuspeichern und eine weitere um die block-welt zu verwalten. dazu benutzt man structs. das spart in der regel eine menge unnötigen code. auch dazu gibt es einen abschnitt im handbuch.
Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/10/13 10:35

@^: 3d arrays gehen auf jeden fall (es sollten auch nochmehr gehen)
edit2: wenn man's genau nimmt ist mein code im prinzip ein 4d array ;P

@ratz: wenn du das unbedingt mit sprites machen willst dann nehm einfach einen struct.
edit: eigentlich ist es - egal mit welcher methode - am besten einen struct zu verwenden in einem 2D oder 3D array. (was man eben braucht)

Code:
var voxel_size = 16;

typedef struct VOXEL
{
	ENTITY * front;  // x-
	ENTITY * back;   // x+
	ENTITY * left;   // y+
	ENTITY * right;  // y-
	ENTITY * top;    // z+
	ENTITY * bottom; // z-
} VOXEL;


VOXEL * VoxelStructure[16][16]; // 2D array

[...]

int x, y;

for(x = 0; x < 16; x++)
{
	for(y = 0; y < 16; y++)
	{
		VoxelStructure[x][y].front = ent_create( ... , vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
		VoxelStructure[x][y].front.xxx = ; // winkel setzen
		
		VoxelStructure[x][y].back = ent_create( ... , vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
		VoxelStructure[x][y].back.xxx = ; // winkel setzen
		
		VoxelStructure[x][y].left = ent_create( ... , vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
		VoxelStructure[x][y].left.xxx = ; // winkel setzen
		
		VoxelStructure[x][y].right = ent_create( ... , vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
		VoxelStructure[x][y].right.xxx = ; // winkel setzen
		
		VoxelStructure[x][y].top = ent_create( ... , vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
		VoxelStructure[x][y].top.xxx = ; // winkel setzen
		
		VoxelStructure[x][y].bottom = ent_create( ... , vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
		VoxelStructure[x][y].bottom.xxx = ; // winkel setzen
	}	
}


offsets und winkel sind nicht im code
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/10/13 10:37

so ich hab den post hier gelöscht und jetzt den voxel bearbeitet -> danke erstmal für den schnippsel

Code:
var voxel_size = 16;

typedef struct VOXEL
{
	ENTITY * front;  // x-
	ENTITY * back;   // x+
	ENTITY * left;   // y+
	ENTITY * right;  // y-
	ENTITY * top;    // z+
	ENTITY * bottom; // z-
} VOXEL;


VOXEL * VoxelStructure[16][16]; // 2D array
{

 int x, y;

for(x = 0; x < 16; x++)
{
	for(y = 0; y < 16; y++)
	{
		VoxelStructure[x][y].front = ent_create("test1.bmp" , vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
		VoxelStructure[x][y].front.pan = 180;// winkel setzen
		
		VoxelStructure[x][y].back = ent_create("test1.bmp" , vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
		VoxelStructure[x][y].back.pan = -180; // winkel setzen
		
		VoxelStructure[x][y].left = ent_create( "test1.bmp" , vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
		VoxelStructure[x][y].left.pan = 90; // winkel setzen
		
		VoxelStructure[x][y].right = ent_create( "test1.bmp", vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
		VoxelStructure[x][y].right.pan = -90;  // winkel setzen
		
		VoxelStructure[x][y].top = ent_create( "test1.bmp", vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
		VoxelStructure[x][y].top.tilt = 90;  // winkel setzen
		
		//VoxelStructure[x][y].bottom = ent_create( "test1.bmp" , vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
		//VoxelStructure[x][y].bottom.xxx = ; // winkel setzen
	}	
 }
}

////////////////////////////////////////////////



wie starte ich den voxel in der main ?
ist seit dem letzen post von Kartoffel
totals neuland für mich tongue
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/10/13 10:38

mom ............ der post von KArtoffel kam gerade als ich fertig war mit mein post


bitte nicht überreagieren grin
Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/10/13 10:40

hehe, ja das war fast gleichzeitig.

wenn du noch mehr codebeispiele brauchst, sags bitte.
Posted By: the_clown

Re: Voxel fürs 3d Gamestudio - 09/10/13 10:53

ich wollte dir eigentlich auch ein stück code schreiben aber meine linke hand ist momentan leider tippunfähig deswegen sind sonderzeichen etwas mühsam tongue
ich würde dir trotzdem empfehlen dir mal ein bisschen was im handbuch durchzulesen zu den genannten themen, und auch darüber hinaus, denn wenn man sich hauptsächlich an codebeispielen orientiert die genau das machen was man gerade braucht, ohne weiteres wissen dahinter über die verwendeten methoden und so weiter, dann kommt man beim nächsten ähnlichen problem wieder nicht weiter bis jemand mit spezifischem code aushilft. je mehr du über lite-c und programmiertechniken generell weißt desto weniger probleme dieser art bekommst du im verlauf.

kartoffels code ist übrigens für dein spezielles problem erstmal so ziemlich die optimalste lösung. ich würd den aber nicht abtippen sondern wie gesagt so lang versuchen ihn zu verstehen bis du aus dem kopf genau das gleiche selbst schreiben kannst und dabei auch erklären könntest, was passiert. wie gesagt, knowledge is power, VOR ALLEM beim programmieren wink
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/10/13 10:58

okey ...

::ich glaube ich versehe::

die typedef struckt gibt die benötigten Entitys an
(informartion des Objectes)
und die voxel-structure die mit x,y Arrays positioniert wird sagt dem struct was
dann zutun ist

right ?

eins noch:

wie starte ich den voxel in der main ?
mit set() oder voxel();
oder in einer function ?

STRUCTS sind totals neuland für mich hört sich aber recht interssant an wink



Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/10/13 11:17

genau so wie du es mit den entitys gemacht hast

Code:
#include <acknex.h>
#include <default.c>

//

var voxel_size = 16;

typedef struct VOXEL
{
	ENTITY * front;  // x-
	ENTITY * back;   // x+
	ENTITY * left;   // y+
	ENTITY * right;  // y-
	ENTITY * top;    // z+
	ENTITY * bottom; // z-
} VOXEL;


VOXEL * VoxelStructure[16][16]; // 2D array


void create_voxels()
{
	int x, y;
	
	for(x = 0; x < 16; x++)
	{
		for(y = 0; y < 16; y++)
		{
			VoxelStructure[x][y].front = ent_create("test1.bmp" , vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
			VoxelStructure[x][y].front.pan = 180;// winkel setzen
			
			VoxelStructure[x][y].back = ent_create("test1.bmp" , vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
			VoxelStructure[x][y].back.pan = -180; // winkel setzen
			
			VoxelStructure[x][y].left = ent_create( "test1.bmp" , vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
			VoxelStructure[x][y].left.pan = 90; // winkel setzen
			
			VoxelStructure[x][y].right = ent_create( "test1.bmp", vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
			VoxelStructure[x][y].right.pan = -90;  // winkel setzen
			
			VoxelStructure[x][y].top = ent_create( "test1.bmp", vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
			VoxelStructure[x][y].top.tilt = 90;  // winkel setzen
			
			//VoxelStructure[x][y].bottom = ent_create( "test1.bmp" , vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
			//VoxelStructure[x][y].bottom.xxx = ; // winkel setzen
		}	
	}
}


void main()
{
	wait(1);
	video_set(sys_metrics(0) * 0.75, sys_metrics(1) * 0.75, 0, 2);
	fps_max = 60;
	
	max_entities = 2000;
	
	level_load("test.WMB");
		wait(1); // warten bis der level geladen ist, kann sonst probleme auf langsamen rechnern / großen leveln geben
	
	create_voxels();
}


////////////////////////////////////////////////


und ich muss the clown zustimmen: das alles ist scheinbar #neuland für dich also ist es sehr wichtig, dass du dich auch mit dem zeug auseinandersetzt und den code verstehsts.
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/10/13 11:27

ahhh schonwieder gleichzeitiger post grin
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/10/13 11:29

wenn ich es starten will kommt: script-crash in create_voxel()
Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/10/13 11:31

hmm. ich rate mal.

pack...
VoxelStructure[x][y] = sys_malloc(sizeof(VOXEL));
...an den anfang der 'for(y =...' schleife
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/10/13 11:36

boa !!:D da were ich nie im leben drauf gekommen , ersteinmal 1000 dank dafür
ich zerflück den voxel / die Struckt jetzt solange bist ich ihn genau versehe

wink danke dir mal wieder
Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/10/13 11:40

noch als erklärung

mit dem
VOXEL * VoxelStructure[16][16];
wird eine liste aus 16x16 pointern erstellt.

das problem war, dass die pointer noch leer waren.
man musste erst für jeden pointer speicher allokieren (<pointer> = sys_malloc()), und zwar mit der größe, die der struct (VOXEL) umfasst (sizeof(VOXEL))

...pointer können ziemlich nervern und sind auch nicht so leicht zu verstehen.
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/10/13 11:46

eins hab ich auch noch ...
ich glaub ich bekomm alles kaputt grin

ich wollte gerade nur die richtigen texturen test.1.bmp mit anderen ersetzen und wieder ausführen ....

jetzt geht garnichts mehr

es kommt: not enought entites reservet (2000)

dann habe ich auf 4000 gesetzt und die gleiche meldung kommt:

not enought entites reservet (4000)

ich hab nur auf

for(x = 0; x < 32; x++)
{
for(y = 0; y < 32; y++)
{

gesetzt -> auf 16 tuts es
frown


Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/10/13 11:48

den speicher darfst du erst wieder freigeben wenn du die pointerstruktur leeren willst.

...und wenn, dann mit sys_free tongue

poste mal deinen code.
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/10/13 11:51

ja es lag an der 32 grin

habs

Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/10/13 11:54

die pointerstruktur ist nur 16x16 groß... da geht 32 leicht druber tongue
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/10/13 12:04

ja weil meine texturen 32x32 sind , hab ich da versucht was zu ändern ...

ich hab jetzt 16x16 gemacht und trotzdem kommt das ergebniss raus



wenn ich die alten werte eintrage im vector dann sind die gannnz weit auseinander
mit unregelmäßigen abstand

am code habe ich jetzt nichts verändert
Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/10/13 12:10

ändere die voxel_size, dafür ist die ja extra da grin
hab jetzt mal die standartgröße von 16 genommen (CUBEL_MDL ist genauso groß)
wenn deine sprites größer sind, muss du das natürlich anpassen.

edit: außerdem seh ich, dass du keine offsets hast, die müssen auf die position draufgerechnet werden.
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/10/13 12:38

ja ... ich hab alle offsets beachtet und verändert wink



endlich ... und nochmals danke wink

voxel_size hab ich auf 35 gestellt , da es sonst stark flackert wenn man sich dich dn boden bewegt und so sieht man mehr ^^
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/10/13 12:49

achja ... hier der code

Code:
#include <acknex.h>
#include <default.c>

//

var voxel_size = 32; // hier 35 für den abstand ;) 

typedef struct VOXEL
{
	ENTITY * front;  // x-
	ENTITY * back;   // x+
	ENTITY * left;   // y+
	ENTITY * right;  // y-
	ENTITY * top;    // z+
	ENTITY * bottom; // z-
} VOXEL;


VOXEL * VoxelStructure[16][16]; // 2D array


void create_voxels()
{
	int x, y;
	
		
	for(x = 0; x < 18; x++)
	{
		for(y = 0; y < 18; y++)
		{
			VoxelStructure[x][y] = sys_malloc(sizeof(VOXEL));
			
			VoxelStructure[x][y].front = ent_create("test1.bmp" , vector(voxel_size * x+42, voxel_size * y, 0), NULL); // seite erstellen
			VoxelStructure[x][y].front.pan = 180;// winkel setzen
			
			VoxelStructure[x][y].back = ent_create("test2.bmp" , vector(voxel_size * x+10, voxel_size * y, 0), NULL); // seite erstellen
			VoxelStructure[x][y].back.pan = -180; // winkel setzen
			
			VoxelStructure[x][y].left = ent_create( "test3.bmp" , vector(voxel_size * x+26, voxel_size * y+16, 0), NULL); // seite erstellen
			VoxelStructure[x][y].left.pan = 90; // winkel setzen
			
			VoxelStructure[x][y].right = ent_create( "test3.bmp", vector(voxel_size * x+26, voxel_size * y-16, 0), NULL); // seite erstellen
			VoxelStructure[x][y].right.pan = -90;  // winkel setzen
			
			VoxelStructure[x][y].top = ent_create( "test1.bmp", vector(voxel_size * x +26, voxel_size * y, 16), NULL); // seite erstellen
			VoxelStructure[x][y].top.tilt = 90;  // winkel setzen
			
			//VoxelStructure[x][y].bottom = ent_create( "test1.bmp" , vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
			//VoxelStructure[x][y].bottom.xxx = ; // winkel setzen
	}
	}
}


void main()
{
	wait(1);
	video_set(sys_metrics(0) * 0.75, sys_metrics(1) * 0.75, 0, 2);
	fps_max = 60;
	
	max_entities = 4000;
	
	level_load("test.WMB");
		wait(1); // warten bis der level geladen ist, kann sonst probleme auf langsamen rechnern / großen leveln geben
	
	create_voxels();
}



die textren sind 32x32 Bilder
Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/10/13 13:26

gut, dass es jetzt funktioniert.
aber du überschreitest in der for schleife immernoch den array (x < 18)!

wenn das ganze überhaupt startet, wird es in dem fall jede menge speicher fehler & random crashes geben sobald das projekt komplexer wird.

(...mist, jetzt hab ich auch bock, was in die richtung zu coden ._.)
Posted By: the_clown

Re: Voxel fürs 3d Gamestudio - 09/10/13 15:08

Originally Posted By: Kartoffel

(...mist, jetzt hab ich auch bock, was in die richtung zu coden ._.)



haha ja voxel sind ein interessantes thema grin
du hast allerdings recht was die performance bei diesem ansatz angeht, ich hab auch gerade mal einen kleinen ansatz probiert und mit einem feld von 1024 voxeln bekomme ich mit einem netbook nur noch um die 15 fps (amd c40 dual core prozessor, 4 gigabyte RAM). Zusätzlich zu 6 sprite-entities pro voxel liegt auch noch eine bitmap für jeden voxel im speicher (um per bmap_for_enity auf dem voxel rumzumalen).
Die hardware auf der ich grad arbeite ist zwar eh nicht spieltauglich, aber die voxelzahl ist nun wirklich nicht hoch. selbst wenn man die hardwareleistung um faktor 10 bis 20 hochschraubt, die voxelzahlen die mir so vorschweben liegen eher im hunderttausenderberreich, und das KANN mit dem ansatz einfach nicht flüssig genug sein, schon gar nicht mit laufendem spielcode und -objekten obendrauf... deswegen würde mich dein anderer ansatz mal interessieren, Kartoffel, der mit der einen entity...?
Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/10/13 15:42

Quote:
der mit der einen entity...?

eine entity wird nicht möglich sein (irgendwo zwischen 2700 und 3000 nicht aneinanderliegenden blöcken hat man die max-polys-pro-model-grenze erreicht)

einfach wie minecraft: 1 Model == 1 Chunk == 16³ Blöcke
damit überschreitet man die poly grenze nie und hat sehr gute performance.

Achso auserdem muss man alle nicht sichbaren seiten erst garnicht meshen, weil sonst geschätzt ~90% leistung umsonst verbraten wird (kann gut sein, dass es noch mehr ist).
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/11/13 11:45

ich bin heute mal aus spaß in die 3te dimension gegangen und
habe jetzt mal eine 2x2 pixel bmp benutzt

das ergebniss:

level lädt ... 6 sec später erscheint der cube




Code:
#include <acknex.h>
#include <default.c>

//

var voxel_size = 4; // hier für den abstand ;) 

typedef struct VOXEL
{
	ENTITY * front;  // x-
	ENTITY * back;   // x+
	ENTITY * left;   // y+
	ENTITY * right;  // y-
	ENTITY * top;    // z+
	ENTITY * bottom; // z-
	
	
} VOXEL;


VOXEL * VoxelStructure[20][20][20]; // 2D array


void create_voxel()
{
	int x, y, z;
	
		
	for(x = 0; x < 12; x++)
	{
		for(y = 0; y < 12; y++)
		{
		 	for(z = 0; z < 12; z++)
	   	{ 	
		  	VoxelStructure[x][y][z] = sys_malloc(sizeof(VOXEL));
			
			VoxelStructure[x][y][z].front = ent_create("atom.bmp" , vector(voxel_size * x+2, voxel_size * y,  voxel_size * z), NULL); // seite erstellen
			VoxelStructure[x][y][z].front.pan = 180;// winkel setzen
			
			VoxelStructure[x][y][z].back = ent_create("atom.bmp" , vector(voxel_size * x-0.001, voxel_size * y, voxel_size * z), NULL); // seite erstellen
			VoxelStructure[x][y][z].back.pan = -180; // winkel setzen
			
			VoxelStructure[x][y][z].left = ent_create( "atom.bmp" , vector(voxel_size * x+1, voxel_size * y+1, voxel_size * z), NULL); // seite erstellen
			VoxelStructure[x][y][z].left.pan = 90; // winkel setzen
			
			VoxelStructure[x][y][z].right = ent_create( "atom.bmp", vector(voxel_size * x+1, voxel_size * y-1, voxel_size * z), NULL); // seite erstellen
			VoxelStructure[x][y][z].right.pan = -90;  // winkel setzen
			
			VoxelStructure[x][y][z].top = ent_create( "atom.bmp", vector(voxel_size * x +1, voxel_size * y, voxel_size * z+1), NULL); // seite erstellen
			VoxelStructure[x][y][z].top.tilt = 90;  // winkel setzen
			
			//VoxelStructure[x][y].bottom = ent_create( "test1.bmp" , vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
			//VoxelStructure[x][y].bottom.xxx = ; // winkel setzen
	     }
	  }
	}
}


void main()
{
	wait(1);
	video_set(sys_metrics(0) * 0.75, sys_metrics(1) * 0.75, 0, 2);
	fps_max = 60;
	
	max_entities = 48000;
	
	level_load("test.WMB");
		wait(1); // warten bis der level geladen ist, kann sonst probleme auf langsamen rechnern / großen leveln geben
	
	create_voxel();
}



wie rechnet sich denn die max_entity zusammen , ich hab die jetzt mal auf sage und schreibe: 48000 gesetzt
Posted By: 3run

Re: Voxel fürs 3d Gamestudio - 09/11/13 11:59

I can't understand German, but there is something wrong going on with your texture size (it's size should be power of 2).
Here is how it should looks like, with proper code and proper texture size (64x64):

Code:
Code:
#include <acknex.h>
#include <default.c>

//

var voxel_size = 64; // hier fur den abstand ;) 

typedef struct VOXEL
{
	ENTITY * front;  // x-
	ENTITY * back;   // x+
	ENTITY * left;   // y+
	ENTITY * right;  // y-
	ENTITY * top;    // z+
	ENTITY * bottom; // z-
	
	
} VOXEL;


VOXEL * VoxelStructure[20][20][20]; // 2D array


void create_voxel()
{
	int x, y, z;
	
		
	for(x = 0; x < 6; x++)
	{
		for(y = 0; y < 6; y++)
		{
		 	for(z = 0; z < 6; z++)
	   	{ 	
		  	VoxelStructure[x][y][z] = sys_malloc(sizeof(VOXEL));
			
			VoxelStructure[x][y][z].front = ent_create("brick02.pcx" , vector(voxel_size * x + 32, voxel_size * y,  voxel_size * z), NULL); // seite erstellen
			VoxelStructure[x][y][z].front.pan = 180;// winkel setzen
			
			VoxelStructure[x][y][z].back = ent_create("brick02.pcx" , vector(voxel_size * x - 32, voxel_size * y, voxel_size * z), NULL); // seite erstellen
			VoxelStructure[x][y][z].back.pan = -180; // winkel setzen
			
			VoxelStructure[x][y][z].left = ent_create( "brick02.pcx" , vector(voxel_size * x, voxel_size * y + 32, voxel_size * z), NULL); // seite erstellen
			VoxelStructure[x][y][z].left.pan = 90; // winkel setzen
			
			VoxelStructure[x][y][z].right = ent_create( "brick02.pcx", vector(voxel_size * x, voxel_size * y - 32, voxel_size * z), NULL); // seite erstellen
			VoxelStructure[x][y][z].right.pan = -90;  // winkel setzen
			
			VoxelStructure[x][y][z].top = ent_create( "brick02.pcx", vector(voxel_size * x, voxel_size * y, voxel_size * z + 32), NULL); // seite erstellen
			VoxelStructure[x][y][z].top.tilt = 90;  // winkel setzen
			
			VoxelStructure[x][y][z].bottom = ent_create( "brick02.pcx", vector(voxel_size * x, voxel_size * y, voxel_size * z - 32), NULL); // seite erstellen
			VoxelStructure[x][y][z].bottom.tilt = 270;  // winkel setzen
	     }
	  }
	}
}


void main()
{
	wait(1);
	video_set(sys_metrics(0) * 0.75, sys_metrics(1) * 0.75, 0, 2);
	fps_max = 60;
	
	max_entities = 48000;
	
	level_load("");
		wait(1); // warten bis der level geladen ist, kann sonst probleme auf langsamen rechnern / gro?en leveln geben
	
	create_voxel();
}

Anyway, good luck.



Greets
Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/11/13 12:35

@3run: he wanted to have a spaces between them smirk

@ratz: max entities? sorry aber so schwer ist das doch nicht... maximales entity-limit.
(in deinem fall verwendest du pro block ja 5 entities)
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/11/13 12:45

wie bekommt man das den hin , dass nicht alle sichtbar sind , wovon du immer redes -> kartoffel laugh ?

-> ich habe jetzt den code so bearbeitet, dass wenn man
die a taste drückt ein neuer block hinter dem nächten
erzeugt wird

-> komischer weise kann ich so mehr blöcke (voxel) erzeugen,
als wenn ich das mithilfe der for-schleife versuche


Code:
#include <acknex.h>
#include <default.c>

//

var voxel_size = 2; // hier 35 für den abstand ;) 

var i = 0;


var coord_x = 0;
var coord_y = 0;
var coord_z = 0;


typedef struct VOXEL
{
	ENTITY* front;  // x-
	ENTITY* back;   // x+
	ENTITY* left;   // y+
	ENTITY* right;  // y-
	ENTITY* top;    // z+
	ENTITY* bottom; // z-
	
	
} VOXEL;


VOXEL * VoxelStructure[16][16][16]; // 2D array


void create_atom(i)
{
	int x, y, z;
	
		
	for(x = 0; x < 6; x++)
	{
		for(y = 0; y < 6; y++)
		{
		 	for(z = 0; z < 6; z++)
	   	{ 	
		  	VoxelStructure[x][y][z] = sys_malloc(sizeof(VOXEL));
			
			VoxelStructure[x][y][z].front = ent_create("atom.bmp" , vector(voxel_size *x*coord_x+2, voxel_size * y,  voxel_size * z), NULL); // seite erstellen
			VoxelStructure[x][y][z].front.pan = 180;// winkel setzen
			
			VoxelStructure[x][y][z].back = ent_create("atom.bmp" , vector(voxel_size *x*coord_x-0.001, voxel_size * y, voxel_size * z), NULL); // seite erstellen
			VoxelStructure[x][y][z].back.pan = -180; // winkel setzen
			
			VoxelStructure[x][y][z].left = ent_create( "atom.bmp" , vector(voxel_size * x *coord_x+1, voxel_size * y+1, voxel_size * z), NULL); // seite erstellen
			VoxelStructure[x][y][z].left.pan = 90; // winkel setzen
			
			VoxelStructure[x][y][z].right = ent_create( "atom.bmp", vector(voxel_size * x *coord_x+1, voxel_size * y -1, voxel_size * z), NULL); // seite erstellen
			VoxelStructure[x][y][z].right.pan = -90;  // winkel setzen
			
			VoxelStructure[x][y][z].top = ent_create( "atom.bmp", vector(voxel_size * x *coord_x+1, voxel_size * y , voxel_size * z+1), NULL); // seite erstellen
			VoxelStructure[x][y][z].top.tilt = 90;  // winkel setzen
			
			//VoxelStructure[x][y].bottom = ent_create( "test1.bmp" , vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
			//VoxelStructure[x][y].bottom.xxx = ; // winkel setzen
	     }
	  }
	}
}


void main()
{
	wait(1);
	video_set(sys_metrics(0) * 0.75, sys_metrics(1) * 0.75, 0, 2);
	fps_max = 60;
	
	max_entities = 48000;
	
	level_load("test.WMB");
		wait(1); // warten bis der level geladen ist, kann sonst probleme auf langsamen rechnern / großen leveln geben
	
	create_atom(i);
	
	while(1)
	{
	 if(key_a == 1)
	 {
	  create_atom(i);
	  i+=1;
	  coord_x +=5;
	 }
	 wait(1);	
	}
}

Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/11/13 12:56

Quote:
-> komischer weise kann ich so mehr blöcke (voxel) erzeugen,
als wenn ich das mithilfe der for-schleife versuche

weil immer wieder speicher allokiert wird, und die vorherigen pointer dabei neugesetzt werden -> du kommst nichtmehr an die entitys ran + memory leak.

das mit den seiten ist schwieriger.

am besten du machst einen struct für einen chunk, in den du speicherst, wo blöcke sind und wo nicht.

dazu brauchst du noch ne funktion zum erstellen der blöcke.
in der funktion musst du den chunk durchgehen und für jeden block checken, ob die jeweilige seite erstellt werden soll, oder nicht.
Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/11/13 13:50

ich hab mich mal hingesetzt und folgede formel erfunden , die vtl functionieren könnte:

Code:
voxel[i](16,16,16)  -> create_chunk[i](1,1,1) // ein voxel von 16³ wird zu ein chunk
 
reset(create_chunk[i])  -> create_voxel[i] = pos.chunk[i] // wird der chunk gelöscht 
                                                          // wird er zum voxel

Posted By: ratz

Re: Voxel fürs 3d Gamestudio - 09/11/13 13:52

ich setz mich glecih mal hin und bastel mal ein bisschen weiter
Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/11/13 13:55

nur mal als ansatz hilfe

Code:
typedef struct CHUNK
{
	byte voxels[16][16][16]; // 0: kein voxel vorhanden, 1: voxel vorhanden
	
	
} CHUNK;



aber... das hier ist im moment ausschließlich für die chunk / block informationen, nicht für die geometrie.
Posted By: 3run

Re: Voxel fürs 3d Gamestudio - 09/11/13 14:45

Kartoffel@ to have space between them, he just needs to increase the "voxel_size". Or what do you mean?
Posted By: Kartoffel

Re: Voxel fürs 3d Gamestudio - 09/11/13 14:55

3run@: yeah, I just meant that the spaces between the blocks were not his problem.

He just showed an example and asked a question regarding max_entities laugh
Posted By: 3run

Re: Voxel fürs 3d Gamestudio - 09/11/13 15:42

Kartoffel@ oh, ok then, my bad that I don't know German grin
Posted By: rayp

Re: Voxel fürs 3d Gamestudio - 09/11/13 18:28

btw....
Thats the reason why threads should be in english. Even if its bad english ull reach more helping / reading people with it. Threads in german are allowed for sure but not fair for non german users. I guess your thread "Ein/Ausgabe So geht's" would be read twice often if it would be written in english.
Posted By: 3run

Re: Voxel fürs 3d Gamestudio - 09/11/13 19:31

rayp@ absolutely agree, it could be easier (f.e. for me), to understand "bad" english, than reading all crap on russian that I see after google translator grin
© 2024 lite-C Forums