Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - WPShadow

#91
Mist, du warst schneller! Wollte ich eigentlich schreiben, sobald ich daheim bin  :booze:
#92
Experimentieren!  :D

Hat auch genauso gefunzt, wie ich es mir gedacht hatte!
#93
Klasse, hat funktioniert:

Der Filename wird richtig dargestellt und es wird auch korrekt geschrieben: fps_2013-11-15_14_47_03.txt

Code (glbasic) Select

2013-11-15 14:46:55 | fps: 117
2013-11-15 14:46:56 | fps: 122
2013-11-15 14:46:57 | fps: 121
2013-11-15 14:46:58 | fps: 121
2013-11-15 14:46:59 | fps: 122
2013-11-15 14:47:00 | fps: 122
2013-11-15 14:47:01 | fps: 122
2013-11-15 14:47:02 | fps: 122
2013-11-15 14:47:03 | fps: 120


Code (glbasic) Select

SUB GLB_ON_QUIT:
LOCAL output$[], tmp$, time$[]

IF sys_settings.debugging = 1

SPLITSTR(PLATFORMINFO$("TIME"), output$[], " ")
SPLITSTR(output$[1], time$[], ":")

OPENFILE(0, "logs/fps_" + output$[0] + "_" + time$[0] + "_" + time$[1] + "_" + time$[2] + ".txt", -1)

IF LEN(fps_log[]) > 0

FOREACH m IN fps_log[]

tmp$ = m.date$ + " | fps: " + m.log_fps

WRITELINE 0, tmp$

NEXT

ENDIF

CLOSEFILE 0

ENDIF

ENDSUB
#94
Verflixt, stimmt! An den Doppelpunkt hatte ich gar nicht gedacht.

Das ist eines der Symbole, das von Windows nicht zugelassen wird!

Ich teste es gleich mal! Danke für den Tip! ^^
#95
GLBasic - de / GLB_ON_QUIT
2013-Nov-15
Hi,

ich hab mal ein kleines Experiment gemacht und wollte beim Beenden des Programmes die Logs rausschreiben.

Code (glbasic) Select

SUB GLB_ON_QUIT:
LOCAL output$[], tmp$

IF sys_settings.debugging = 1

SPLITSTR(PLATFORMINFO$("TIME"), output$[], " ")

OPENFILE(0, "logs/fps_" + output$[0] + "_" + output$[1] + ".txt", -1)

IF LEN(fps_log[]) > 0

FOREACH m IN fps_log[]

tmp$ = m.date$ + " | fps: " + m.log_fps

WRITELINE 0, tmp$

NEXT

ENDIF

CLOSEFILE 0

ENDIF

ENDSUB


Leider bekomme ich nur die Fehlermeldung: error 3 zurück geworfen und die Logs werden nicht geschrieben.

Irgendeine Idee, was error 3 zu bedeuten hat? Ich wäre ganz glücklich, wenn mir hier jemand helfen könnte!  =D

LG

W.
#96
hey,

I think all the time about the following concept of the usage of voxel:

Shouldn't it be possible to build objects with the voxel engine? For example a house. With walls and something else. On the outside is the wall.

Now what would happen if you shoot a bullet on the wall? several voxels would be destroyed --> so what will happen that moment to the invisible voxels behind them?


#97
Looks really great!

Now I want to play GL - Craft ^^
#98
Hey,

thanks for the examples, they are really great. It will take a little time to analyse my current code and see how I can use it with your examples.

But I will reply as fast as I can... (I think arround the weekend)

CU

W.

#99
It is more an experiment than a real project. I try to find out, how I can program it by myself.  =D

QuoteAnother question: with assembled voxel objects, shouldn't we only be interested in the outside layer?  That would reduce the amount of data sent to the graphics card enormously...

I know, only to draw the "outside" of the box will reduce the whole thing.

I tried it like this:

Code (glbasic) Select
FUNCTION create_base_chunk: size
LOCAL tmp_x, tmp_y, tmp_z
LOCAL c AS cube_type
LOCAL hit

FOR tmp_x = 0 TO size - 1
FOR tmp_y = 0 TO size - 1
FOR tmp_z = 0 TO size - 1

c.typ = RND(2)
c.x = tmp_x
c.y = tmp_y
c.z = tmp_z




IF c.x = 0 OR c.x = size - 1 OR c.y = 0 OR c.y = size - 1 OR c.z = 0 OR c.z = size - 1
c.active = TRUE
ELSE
c.active = FALSE
ENDIF





DIMPUSH cube[], c


INC anzahl, 1

NEXT
NEXT
NEXT



ENDFUNCTION



But shouldn't it be possible to reduce it more than that? With this I reduced it from 4096 to 1352, but the camera cannot see the backside, so that cubes are not necessary.
#100
Hi,

I've got a little problem with the visibility of cubes. I work on a little experiment, where I try to make a big cube with 16 x 16 x 16 small cube.

Now I need only the cubes that the camera can see, everything else isn't necessary to render. The only problem that I have is to detect which cube is hidden.

I tried X_COLLISIONRAY but I've no idea how to use it right.

This is my code for now...

Code (glbasic) Select

// --------------------------------- //
// Project: voxel
// Start: Tuesday, October 01, 2013
// IDE Version: 11.322


// SETCURRENTDIR("Media") // go to media files

TYPE cube_type
typ
x
y
z
active
ENDTYPE

GLOBAL cube[] AS cube_type
GLOBAL counter, visible, size_total

main()



FUNCTION main:

CreateCube(0, 1, RGB(255, 0, 0))
CreateCube(1, 1, RGB(0, 255, 0))
CreateCube(2, 1, RGB(0, 0, 255))

size_total = 16

create_base_chunk(size_total)



WHILE TRUE

X_MAKE3D 1, 1000, 45



X_CAMERA 25, 25, 20, 0, 0, 0



visible = 0

draw_chunk(size_total)

X_MAKE2D

PRINT "counter: " + counter, 0, 0
PRINT "visible: " + visible, 0, 20



SHOWSCREEN

WEND


ENDFUNCTION

FUNCTION draw_chunk: size

FOREACH c IN cube[]

IF c.active = TRUE
INC visible, 1

X_MOVEMENT c.x - (size/2), c.z - (size/2), c.y - (size/2)
X_DRAWOBJ c.typ, 0
ENDIF

NEXT



ENDFUNCTION


FUNCTION create_base_chunk: size
LOCAL tmp_x, tmp_y, tmp_z
LOCAL c AS cube_type
LOCAL hit

FOR tmp_x = 0 TO size - 1
FOR tmp_y = 0 TO size - 1
FOR tmp_z = 0 TO size - 1

c.typ = RND(2)
c.x = tmp_x
c.y = tmp_y
c.z = tmp_z





c.active = TRUE





DIMPUSH cube[], c


INC counter, 1

NEXT
NEXT
NEXT



ENDFUNCTION




// ------------------------------------------------------------- //
// -=#  CREATECUBE  #=-
// ------------------------------------------------------------- //
FUNCTION CreateCube: num, sz, col
        // Diese Variablen sind als LOCAL definiert:
        // num, sz,
        sz=sz/2
        X_OBJSTART num
                // Front Face
                X_OBJADDVERTEX  sz, -sz,  sz, 1, 0, col
                X_OBJADDVERTEX -sz, -sz,  sz, 0, 0, col
                X_OBJADDVERTEX  sz,  sz,  sz, 1, 1, col
                X_OBJADDVERTEX -sz,  sz,  sz, 0, 1, col
                X_OBJNEWGROUP
                // Back Face
                X_OBJADDVERTEX -sz,  sz, -sz, 1, 1, col
                X_OBJADDVERTEX -sz, -sz, -sz, 1, 0, col
                X_OBJADDVERTEX  sz,  sz, -sz, 0, 1, col
                X_OBJADDVERTEX  sz, -sz, -sz, 0, 0, col
                X_OBJNEWGROUP
                // Top Face
                X_OBJADDVERTEX -sz,  sz,  sz, 0, 0, col
                X_OBJADDVERTEX -sz,  sz, -sz, 0, 1, col
                X_OBJADDVERTEX  sz,  sz,  sz, 1, 0, col
                X_OBJADDVERTEX  sz,  sz, -sz, 1, 1, col
                X_OBJNEWGROUP
                // Bottom Face
                X_OBJADDVERTEX  sz, -sz, -sz, 0, 1, col
                X_OBJADDVERTEX -sz, -sz, -sz, 1, 1, col
                X_OBJADDVERTEX  sz, -sz,  sz, 0, 0, col
                X_OBJADDVERTEX -sz, -sz,  sz, 1, 0, col
                X_OBJNEWGROUP
                // Right face
                X_OBJADDVERTEX  sz,  sz, -sz, 1, 1, col
                X_OBJADDVERTEX  sz, -sz, -sz, 1, 0, col
                X_OBJADDVERTEX  sz,  sz,  sz, 0, 1, col
                X_OBJADDVERTEX  sz, -sz,  sz, 0, 0, col
                X_OBJNEWGROUP
                // Left Face
                X_OBJADDVERTEX -sz, -sz,  sz, 1, 0, col
                X_OBJADDVERTEX -sz, -sz, -sz, 0, 0, co :ol
                X_OBJADDVERTEX -sz,  sz,  sz, 1, 1, col
                X_OBJADDVERTEX -sz,  sz, -sz, 0, 1, col
                X_OBJNEWGROUP
        X_OBJEND

ENDFUNCTION // sz


Any idea how I can implement it right?

CU

W.
#101
Hi,

kennt sich jemand mit Voxel aus? Ich experimentiere gerade mit der Sichtbarkeit von Würfeln.

Dabei erstelle ich grundlegend einen 3D - Raster (im Beispiel 16 x 16 x 16). Der erstellte Bereich hat also 4096 Würfel. Die von der Kamera erfasste Fläche hat im Grunde jedoch nur

((16 x 16) * 3) - (3 * 16) = 720 Würfel

Ich rechne da: Grundfläche x 3 - der Überschneidungen der Flächen

Jetzt stellt sich für mich die Frage, wie ich die von der Kamera sichtbaren Bereiche errechnen kann?

Ich habe mit X_COLLISIONRAY experimentiert, aber ich bin mir rein vom Aufbau her nicht ganz sicher.

Hat jemand eine Idee, wie man sowas angehen kann? Hier mal der Code, mit dem ich experimentiere:

Code (glbasic) Select

// --------------------------------- //
// Project: voxel
// Start: Tuesday, October 01, 2013
// IDE Version: 11.322


// SETCURRENTDIR("Media") // go to media files

TYPE cube_type
typ
x
y
z
active
ENDTYPE

GLOBAL cube[] AS cube_type
GLOBAL anzahl, sichtbar, size_total

main()



FUNCTION main:

CreateCube(0, 1, RGB(255, 0, 0))
CreateCube(1, 1, RGB(0, 255, 0))
CreateCube(2, 1, RGB(0, 0, 255))

size_total = 16

create_base_chunk(size_total)



WHILE TRUE

X_MAKE3D 1, 1000, 45



X_CAMERA 25, 25, 20, 0, 0, 0



sichtbar = 0

draw_chunk(size_total)

X_MAKE2D

PRINT "Anzahl: " + anzahl, 0, 0
PRINT "Sichtbar: " + sichtbar, 0, 20



SHOWSCREEN

WEND


ENDFUNCTION

FUNCTION draw_chunk: size

FOREACH c IN cube[]

IF c.active = TRUE
INC sichtbar, 1

X_MOVEMENT c.x - (size/2), c.z - (size/2), c.y - (size/2)
X_DRAWOBJ c.typ, 0
ENDIF

NEXT



ENDFUNCTION


FUNCTION create_base_chunk: size
LOCAL tmp_x, tmp_y, tmp_z
LOCAL c AS cube_type
LOCAL hit

FOR tmp_x = 0 TO size - 1
FOR tmp_y = 0 TO size - 1
FOR tmp_z = 0 TO size - 1

c.typ = RND(2)
c.x = tmp_x
c.y = tmp_y
c.z = tmp_z





c.active = TRUE





DIMPUSH cube[], c


INC anzahl, 1

NEXT
NEXT
NEXT



ENDFUNCTION




// ------------------------------------------------------------- //
// -=#  CREATECUBE  #=-
// ------------------------------------------------------------- //
FUNCTION CreateCube: num, sz, col
        // Diese Variablen sind als LOCAL definiert:
        // num, sz,
        sz=sz/2
        X_OBJSTART num
                // Front Face
                X_OBJADDVERTEX  sz, -sz,  sz, 1, 0, col
                X_OBJADDVERTEX -sz, -sz,  sz, 0, 0, col
                X_OBJADDVERTEX  sz,  sz,  sz, 1, 1, col
                X_OBJADDVERTEX -sz,  sz,  sz, 0, 1, col
                X_OBJNEWGROUP
                // Back Face
                X_OBJADDVERTEX -sz,  sz, -sz, 1, 1, col
                X_OBJADDVERTEX -sz, -sz, -sz, 1, 0, col
                X_OBJADDVERTEX  sz,  sz, -sz, 0, 1, col
                X_OBJADDVERTEX  sz, -sz, -sz, 0, 0, col
                X_OBJNEWGROUP
                // Top Face
                X_OBJADDVERTEX -sz,  sz,  sz, 0, 0, col
                X_OBJADDVERTEX -sz,  sz, -sz, 0, 1, col
                X_OBJADDVERTEX  sz,  sz,  sz, 1, 0, col
                X_OBJADDVERTEX  sz,  sz, -sz, 1, 1, col
                X_OBJNEWGROUP
                // Bottom Face
                X_OBJADDVERTEX  sz, -sz, -sz, 0, 1, col
                X_OBJADDVERTEX -sz, -sz, -sz, 1, 1, col
                X_OBJADDVERTEX  sz, -sz,  sz, 0, 0, col
                X_OBJADDVERTEX -sz, -sz,  sz, 1, 0, col
                X_OBJNEWGROUP
                // Right face
                X_OBJADDVERTEX  sz,  sz, -sz, 1, 1, col
                X_OBJADDVERTEX  sz, -sz, -sz, 1, 0, col
                X_OBJADDVERTEX  sz,  sz,  sz, 0, 1, col
                X_OBJADDVERTEX  sz, -sz,  sz, 0, 0, col
                X_OBJNEWGROUP
                // Left Face
                X_OBJADDVERTEX -sz, -sz,  sz, 1, 0, col
                X_OBJADDVERTEX -sz, -sz, -sz, 0, 0, col
                X_OBJADDVERTEX -sz,  sz,  sz, 1, 1, col
                X_OBJADDVERTEX -sz,  sz, -sz, 0, 1, col
                X_OBJNEWGROUP
        X_OBJEND

ENDFUNCTION // sz


lg

W.
#102
hey,

ich habe mich mal an einen ganz kleinen Versuch gewagt und es mit einem rekursiven "sink" geschrieben.

Meintest du es ca. so in der Art? Übrigens: sorry für den nicht allzu schön geschriebenen Code, ich habe ihn mal "nebenbei" zusammen geschustert...

Code (glbasic) Select

// --------------------------------- //
// Project: Circular Buffer
// Start: Friday, September 06, 2013
// IDE Version: 11.322


// SETCURRENTDIR("Media") // go to media files

TYPE twin
id
ENDTYPE

TYPE tpointer
id
ENDTYPE

GLOBAL win[] AS twin, pointer[] AS tpointer


main()

FUNCTION main:

add(1)
add(2)
add(3)

sink(0)

WHILE TRUE

draw()

SHOWSCREEN
WEND



ENDFUNCTION

FUNCTION add: id
LOCAL m AS tpointer
LOCAL n AS twin

m.id = LEN(win[])

DIMPUSH pointer[], m

n.id = id

DIMPUSH win[], n


ENDFUNCTION

FUNCTION draw:
LOCAL wert

FOREACH m IN pointer[]
INC wert, 1
PRINT win[m.id].id, 0, wert * 20
NEXT


ENDFUNCTION

FUNCTION sink: id
LOCAL tmp_id, max_length

max_length = LEN(pointer[]) - 1

tmp_id = pointer[id].id
pointer[id].id = pointer[id + 1].id
pointer[id + 1].id = tmp_id

IF (id + 1) < max_length THEN sink(id + 1)

ENDFUNCTION
#103
ok, ich glaube ich weiß, wie du meinst.

Ich mache mal einen Versuch und schaue, wie man sowas sauber baut.  =D

Danke für den Tip!  :good:
#104
Hey,

Problem:

Ich habe 3 Elemente, die dargestellt werden. Die 3 Elemente überlappen quasi. Wenn ich das "unterste" Element (im Array das 0te) aktiviere, dann soll es an die oberste Stelle wandern. Soweit kein Problem (dachte ich), also "reproduziere" ich es (mit DIMPUSH), setze es damit also an die allerletzte Stelle und lösche einfach das Original. Leider ergibt sich dadurch ein Bug in meinem Programmchen.

Also bekam ich den Tip SORTARRAY zu nutzen und damit das erste Objekt an die letzte Position wandern zu lassen. Mein Problem dabei ist, daß ich mir nicht sicher bin, ob "sortieren" einen Sinn macht, da ich immer nur ein unteres Element haben möchte, das ans Ende wandert und nicht die ganze Reihe. Es kann auch nur sein, daß das 3. von 5 Elementen den Platz von Nr. 5 übernehmen müßte und Nr. 5 zu 4 und 4 zu 3 wird.

Gibt es evtl. einen Weg einfach die Zeiger zu tauschen oder macht es da eher Sinn selbst eine Verkettete Liste zu schreiben?

lg

W.
#105
Alles Gute zum Geburtstag aus Österreich  :good: :booze: