Deutsch
Wünsche und Anregungen

Wunsch: experimental Funktion

 
Gedanklich aus: [...] 

@Roland:

Lauter Funktionen welche wie geschaffen sind um erstmal in eine experimental-Funktion aufgenommen zu werden - beispielsweise kann man mit XProfan OpenGL keine positions- und farbgenauen Textausgaben erzeugen und mit einer einfachen Funktion (XProfan-Quelltext längst vorhanden) gibts hierzu Abhilfe um mit OpenGL auch schöne Texteffekte und Textausgaben erzeugen zu können wie es alle anderen auch tun (nicht umsonst) über eine Font-Textur.

Auf deutsch: Roland bau doch bitte eine Funktion die zum Beispiel experimental heisst, und für diese experimental bitte eine für
KompilierenMarkierenSeparieren
proc OGL.DRAWSYSTEXT

    PARAMETERS X!,Y!,TXT$,SZ!,SZY!,HOPX!,SZX!

    IF %PCOUNT<7

        SZX!=1

    ENDIF

    IF %PCOUNT<6

        HOPX!=1

    ENDIF

    IF %PCOUNT<5

        SZY!=1

    ENDIF

    IF %PCOUNT<4

        SZ!=1

    ENDIF

    HOPX!=HOPX!*SZ!
    SZX!=SZX!*SZ!
    var XX!=X!+32*SZX!
    var YY!=Y!+32*SZ!*SZY!
    var TX!=0
    var TY!=0
    var TXX!=0
    var TYY!=0
    var COLUMN&=0
    var ROW&=0
    var O&=0
    var C&=LEN(TXT$)
    OGL(push)
    OGL(texture,OGL.TEXSYSFNT&,1)
    HOPX!=16*HOPX!

    WHILELOOP C&

        O&=ORD(MID$(TXT$,&LOOP,1))
        COLUMN&=O&16
        ROW&=O&-COLUMN&*16
        TX!=0.0625*COLUMN&-0.005
        TY!=0.0625*(16-ROW&-1)-0.005
        TXX!=TX!+0.0625
        TYY!=TY!+0.0625
        OGL(glBegin,7)
        OGL(glTexCoord2f,TX!,TYY!)
        OGL(glVertex3f,X!,Y!,0)
        OGL(glTexCoord2f,TXX!,TYY!)
        OGL(glVertex3f,XX!,Y!,0)
        OGL(glTexCoord2f,TXX!,TY!)
        OGL(glVertex3f,XX!,YY!,0)
        OGL(glTexCoord2f,TX!,TY!)
        OGL(glVertex3f,X!,YY!,0)
        OGL(glEnd)

    ENDWHILE

    OGL(pop)
    RETURN HOPX!

endproc


Also
KompilierenMarkierenSeparieren.

Beispielsweise empfinde ich die Implementierung einer Systemvariable $appDataDir im Gegensatz zu solch zeitkritischen Dingen ziemlich irritierend, da ein $appDataDir selten sinnvoll in Schleifen Verwendung finden wird und ein $appDataDir mit z.B. 3 eigenen XProfanzeilen zu ersetzen ist und die Funktion hierfür schon jahrelang überall rumbaumelt.

Vielleicht ist es nicht unsinnvoller, Funktionen zu implementieren, welche wiederkehrende und zeitkritische Vorgänge abdecken, um die Geschwindigkeit des XProfanprogrammes auch weiter konkurrenzfähig zu gestalten.

Die Idee mit der Experimental-Funktion ist imho nun schon über 1,5 Jahre alt und ich habe - wenn ich mich recht entsinne - noo Ideenfeedback. Ich möchte nicht beginnen mir selbst wie eine Nervensäge vorzukommen.
 
07.04.2009  
 



Nachtrag:
iF
Ich möchte nicht beginnen mir selbst wie eine Nervensäge vorzukommen.

Zu spät!
 
07.04.2009  
 



OGL.DRAWSYSTEXT hat heute sein 2 jähriges Warten auf eine Reaktion aufgegeben, findet leider nur in z.B. einer DLL sein Zuhause.

Statt dieser lauter Beiträge hätte ich mir solch DLL gleich schreiben können, aber ich wollte zeigen was für tolle Spiele man mit XProfan herstellen kann - mit reinem XProfan um besonders damit zu werben auch im Spiel.
 
08.04.2009  
 




RGH
Hallo iF,

ich habe mich mit einer Kontainerfunktion experimental noch nicht so recht anfreunden können.
Das birgt doch die Gefahr, dass Quelltexte mit dieser Funktion veröffentlicht werden und diese auch noch Monate und Jahre nach der Veröffentlichung in den Weiten des WWW (oder dieser Community) herumgeistern. Dann kommen sicher bald irgendwelche Leute, die diese herunterladen und ausprobieren wollen und wieder kurz vor einem Herzkasper stehen, weil diese experimentellen Kontainerfunktionen nicht mehr oder anders funktionieren und sie nun die riesigen Quellcodes umschreiben müssen.

Zu Deiner OGL-Funktion: Füge doch mal ein kurzes XProfan-Beispielprogramm hinzu, mit dem man sieht, was sie macht und was ihre Fähigkeiten demonstriert und erleutere ihre Parameter mal in verständlichem (Hilfedatei-geeignetem) Deutsch. Dann schaue ich mir die Sache mal an und packe sie möglicherweise auf die ToDo-Liste für die nächste XProfan-Version. Versprochen!

Gruß
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
08.04.2009  
 



Schrift/Textausgaben malen, die/eine Textur-Datei beinhaltet alle Chars und die Funktion zeichnet aus diesen Chars entsprechend texturierte Vertexe sodass der an die Funktion übergebene String per OpenGL ausgegeben wird.

Die Parameter:

X!,Y! : Position des auszugebenen Textes
TXT$ : Auszugebener Text

Optionale Parameter
SZ! : YX Skalierungsfaktor/Schriftgrösse
SZY! : Vertikal-Verzerrung für typische Effekte
HOPX! : Sprungweite zwischen den Chars
SZX! : Horizontal-Verzerrung für typische Effekte

Die obige Funktion ist (natürlich) optimiert auf schnelle Ausführung per XProfan - ein Delphi oder C Code würde sicher etwas anders programmiert mehr Geschwindigkeit bringen. (z.B. ohne MID$ in der Schleife)

Das oben ist nur eine abgespeckte Variante, das Original hat noch eine optionale xtraProcAddr um Texte z.B. einfach von aussen Rotieren oder Knicken zu lassen.
KompilierenMarkierenSeparieren
Das mit der xtraProcAddr ist im Grunde eine einfache (zugleich aber äusserst wirkungsvolle) Sache, habe ich aber leider noch kein Feedback auf die Frage ob Du aus XProfan heraus eine XProfan-Funktion aufrufen kannst deren Adresse per ProcAddr bezogen wurde. (Ich glaube aber: Natürlich) Darum habe ich diesen Part aus dem obigestem Code zu ogl.drawSysText erstmal herausgenommen auch um nicht völlig zu verwirren.

Ebenso - aber nur um Beispiele zu nennen für vielleicht testweise implementierbare Funktionen - habe ich Helfer-Schleifen (Funktionen) für Terrainbildung auf einer Fläche oder auf einem Sphere mühsam (für mich mühsam) erstellt, der Vorgang per XProfan unschön lange braucht aber nativ eingebunden (was imho ein Klax ist) wäre es sehr bereichernd und weitere Ideen fördernd.

Zum Thema experimental: Das ist ein Gedankenanstoss!

Ähnlich wie es z.B. in OpenGL-Umsetzungen experimentelle Funktionen gibt mit Vorzeichen des Experimenterfinders nvx_* ata_* wäre es vielleicht ganz praktisch wenn Du Funktionen - z.B. welche erstmalig in einer Version zu Versuchszwecken implementiert wurden - schonmal anbietest aber erklärst: Kein Support/ Keine Garantie/ Experimentalfunktionen.

Gedacht hierfür hatte ich (natürlich) eine Kontainerfunktion um keine IDs zu verbraten - ich aber glaube (leider _auch nicht _weiss, weil kein Response zu [...]  ), dass es ein IDs-Problem nicht mehr gibt.

Vielleicht also auch einfach durchzählen also experimental(1..x,param1..x).

Zu den Codes die dann rumschwirren: Da es (kein?) IDs-Problem gibt sollte es nichts ausmachen, eine später komplett integrierte Version einer Funktion auch später noch per Kontainerfunktion experimental aufrufbar zu gestalten.

Der einzig technische Nachteil der sich mir erschließt wäre, dass die Runtime um ein paar Byte an Grösse gewinnt.

Was wäre optimal: Wenn ein jemand eine tolle Funktion postet mit Bitte um Antestung einer leichtfüssigen Integrierung für mehr Geschwindigkeit: Klar, kein Problem für Roland - ab nach experimental. Vielleicht entsteht dann aus der einen oder anderen experimentellen Funktion - welche sich vlt. auch schon in lauter Versionen behauptet hat - eine neue echte Funktion.

2011 dann gleiche Stelle gleiche Welle?

RGH
Hallo iF,

ich habe mich mit einer Kontainerfunktion experimental noch nicht so recht anfreunden können.


Dann nenne sie doch RGH! (Mir ist schon klar, dass es Dir nicht um die Benennung geht, ich finde experimental auch doof...)
 
08.04.2009  
 




RGH
Hallo iF,
es fehlt mir immer noch ein Beispielcode, um obige (ganz weit obige) Funktion mal auszuprobieren und in Aktion zu sehen.
Gruß
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
08.04.2009  
 



Jupp, habe nur Zuhause mein /develope - ich bau Dir was Schönes hierzu zurecht.

Rumstreunende (und kompilierte) Beispiele gibts in der Community jedoch einige, z.B. auch immer wenn ich das Thema versuchte wieder (vorsichtig) anzustreifen.

Jedoch wäre es schön für mich zu wissen, ob ich einer XProfan-Funktion eine mit ProcAddr bezogene Funktionsadresse übergeben kann sodass diese per ProcAddr bezogene Funktion dann von der nativen XProfan-Funktion im Bedarfsfall ausgeführt werden könnte. (Callbacks wenn Du so möchtest.)

Dann würde ich nämlich lieber gleich die Variante _mit xtraProcAddr übersetzt beispielisieren, gingen darüber dann tolle Effekt wie z.B. sich um ein Zentrum drehende Chars oder Chars auf Sinuswelle etc..

Nur ohne die nativ vorliegende Hilfsfunktion im XProfan leider nicht wirklich in z.B. Spielen zeitkritisch und effektiv einsetzbar.
 
08.04.2009  
 




RGH
Hallo,
ich würde zuerst die erste Variante (ohne diese ProcAddr-Geschichte) vorziehen und mal anschauen, ob daraus was für XProfan 12 werden kann.
Gruß
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
08.04.2009  
 



Eine durchdachtere Variante wäre eine oglDrawTiles-Funktion, für die ich mal ein Minimalbeispiel (haha) aufbereitet habe:
KompilierenMarkierenSeparieren
 {$iq}
def &screenX 1024
def &screenY 768
window &screenX,&screenY
hWnd.setInnerSize(&screenX,&screenY)
var hPic&=create(hNewPic,512,512,0)
var y&=
startPaint hPic&
useFont fixedsys,1,0,0,0,0
textColor $FFFFFF,-1

whileLoop 256

    drawText &loop mod 16*32,&loop16*32,chr$(&loop+1)

wend

endPaint
savepic fixedsys.bmp,hpic&
startpaint hPic&
cls $008800
usePen 0,0,$33BB33

whileLoop 0,16

    line &loop*32,0 - &loop*32,512
    line 0,&loop*32 - 512,&loop*32

wend

usePen 0,0,$006611

whileLoop 0,16

    line 0,(&loop*32-1) - 512,(&loop*32-1)
    line (&loop*32-1),0 - (&loop*32-1),512

wend

whileLoop 5000

    setPixel rnd(512),rnd(512),$55EE55

wend

savepic grid.bmp,hpic&
deleteObject hPic&
//
ogl(init,%hWnd,0,0,0,0)
var meineTiles&=ogl(loadTextureBMP,fixedsys.bmp,1)
var meineTiles2&=ogl(loadTextureBMP,grid.bmp,1)
ogl(posMode,1)
var myList&=ogl(startList)
var s$=

whileLoop 16

    s$=

    whileLoop 16

        s$=s$+chr$(&loop+y&*16)

    wend

    ogl.drawTiles(0,100+y&*16,s$,16,32,1,0.25)
    inc y&

wend

ogl(endList)
var pa&=procAddr(myOGLTileOutCallBackProc,4)
var fps&=0
var fpsT&=&getTickCount+1000
var fpsC&=0

while 1

    inc fpsC&

    if fpsT&<&getTickCount

        inc fpsT&,1000
        fps&=fpsC&
        fpsC&=0

    endif

    ogl(clear)
    ogl(move,0,0,-5)
    ogl(texture,meineTiles&,1)
    ogl(color,0,0,1,1)
    ogl(rotate,&getTickCount/700,&getTickCount/500,&getTickCount/300)
    ogl(cuboid,1,1,1)
    ogl(color,1,1,1,1)
    ogl.2d()
    ogl(drawList,myList&)
    ogl.drawTiles(0,0,ABC Hallo Welt: +str$(&getTickCount),16,32,1,0.25)
    ogl.drawTiles(0,200,ABC Hallo Welt: +str$(&getTickCount),16,32,4,0.25,pa&)
    ogl(color,0,1,0,1)
    ogl.drawTiles(0,500,FPS: +str$(fps&),16,32,1,0.25)
    ogl(color,1,1,1,1)
    ogl(texture,meineTiles2&,1)

    whileLoop 16

        ogl.drawTiles(650,5+&loop*32,chr$(&loop*4)+chr$(&loop*4+1)+chr$(&loop*4+2)+chr$(&loop*4+3),16,32)

    wend

    testCorrectOriginLines()
    ogl(show)
    case %mousePressed=2 : break

wend

//ogl(deleteTexture,1)
ogl(done)
end

proc myOGLTileOutCallBackProc

    parameters x&,y&,c&,o&
    ogl(move,c&*35,sin(c&+&getTickCount*0.003)*10+350,0)
    //ogl(color,rnd(2),rnd(2),rnd(2),1)

endproc

proc ogl.drawTiles

    parameters x!,y!,tiles$,tilesPerRow&,pixelPerTile&,scaleF!,dropF!,tileOutCallBack&
    case %pCount<8 : tileOutCallBack&=0
    case %pCount<7 : dropF!=1
    case %pCount<6 : scaleF!=1
    var c&=len(tiles$)
    casenot c& : return x!
    var COLUMN&=0
    var ROW&=0
    var TX!=0
    var TY!=0
    var TXX!=0
    var TYY!=0
    var o&=0
    var f!=(1/tilesPerRow&)
    var xx!=x!+pixelPerTile&*scaleF!
    var yy!=y!+pixelPerTile&*scaleF!
    ogl(push)

    whileLoop c&

        o&=ord(mid$(tiles$,&loop,1))-1
        row&=o&*f!
        column&=o&-row&*tilesPerRow&
        tx!=f!*column&
        ty!=f!*(tilesPerRow&-row&-1)
        txx!=tx!+f!
        tyy!=ty!+f!
        messagebox str$(tx!)+ +str$(ty!)+ +str$(txx!)+ +str$(tyy!),,0

        if tileOutCallBack&

            ogl(push)
            call(tileOutCallBack&,int(x!),int(y!),&loop,o&)

        endif

        oGL(glBegin,~GL_QUADS)
        oGL(glTexCoord2f,tx!,tyy!)
        oGL(glVertex3f,x!,y!,0)
        oGL(glTexCoord2f,txx!,tyy!)
        oGL(glVertex3f,xx!,y!,0)
        oGL(glTexCoord2f,txx!,ty!)
        oGL(glVertex3f,xx!,yy!,0)
        oGL(glTexCoord2f,tx!,ty!)
        oGL(glVertex3f,x!,yy!,0)
        ogl(glEnd)

        ifnot tileOutCallBack&

            ogl(move,pixelPerTile&*dropF!*scaleF!,0,0)

        else

            ogl(pop)

        endif

    wend

    OGL(pop)
    RETURN pixelPerTile&*c&*dropF!*scaleF!

endproc

proc ogl.2d

    ogl(origin,0,0,0)
    ogl(posmode,1)
    ogl(glMatrixMode,~GL_PROJECTION)
    ogl.ortho(0,&screenY,&screenX,0,0,256)

endproc

proc ogl.ortho

    parameters x&,y&,xx&,yy&,z&,zz&
    ogl(glLoadIdentity)
    ogl(glViewport,0,0,&screenX,&screenY)
    declare m#
    dim m#,48
    float m#,0 =x&,xx&,y&,yy&,z&,zz&
    ogl(glOrtho,long(m#,0 ),long(m#,4 ),long(m#,8 ),long(m#,12),long(m#,16),long(m#,20),long(m#,24),long(m#,28),long(m#,32),long(m#,36),long(m#,40),long(m#,44))
    dispose m#

endproc

proc hWnd.setInnerSize

    parameters x&,y&
    setwindowpos %hWnd = %winLeft,%winTop - ((%winRight-%winLeft)-(width(%hWnd)-x&)),((%winBottom-%winTop)-(height(%hWnd)-y&));0

endproc

proc ogl.line

    parameters x!,y!,xx!,yy!
    ogl(glBegin,~GL_LINES)
    ogl(glVertex3f,x!,y!,)
    ogl(glVertex3f,xx!,yy!,)
    ogl(glEnd)

endproc

proc testCorrectOriginLines

    ogl(color,1,1,1,1)

    whileLoop 0,&screenX,2

        ogl.line(&loop,0,&loop,&screenY)

    wend

    whileLoop 0,&screenY,2

        ogl.line(0,&loop,&screenX,&loop)

    wend

endproc


Wohlbemerkt es nur um die Funktion ogl.drawTiles ginge. (mit oder ohne extraproc)

So kann man neben der Nützlichkeit schnell Tiles anzuzeigen diese Funktion auch für die schnelle derartige Textausgabe einsetzen.

1.033 kB
Hochgeladen:09.04.2009
Ladeanzahl116
Herunterladen
1.034 kB
Hochgeladen:09.04.2009
Ladeanzahl101
Herunterladen
 
09.04.2009  
 



Ich habe den Beispielquelltext für oglDrawTiles nochmals überarbeitet/aktualisiert, an der Funktion ogl.drawTiles selbst hat sich nichts geändert.

Im Interpreter erreiche bei dem neuen Beispiel 4 FPS und mit Runtime um die 20 FPS.

Wäre ogl.drawTiles nativ würde der Interpreter bei mir ~20 FPS und die Runtime bei abgeschaltetem VSync ~110 FPS erreichen was natürlich klasse wäre.
 
09.04.2009  
 



Auf Pentium 4 mit 3.4 GHz nach Compilierung mit XPSE+XProfancompiler heiße 4 Fps (
Aber erst nach langer Vorausberechnungszeit von ca 10 sec... Hmmmmmm...
 
16.04.2009  
 




Nico
Madysa
1 - in Worten: ein - Frame(s) pro Sekunde; aufgerundet, versteht sich.
Sitze hier aber auch an einem 450-MHz-Rechner und Windows 2000.
 
Nico Madysa
17.04.2009  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

6.434 Betrachtungen

Unbenanntvor 0 min.
Jörg Sellmeyer09.09.2014
H.Brill31.08.2014
iF13.05.2013
p.specht15.04.2013
Mehr...

Themeninformationen

Dieses Thema hat 4 Teilnehmer:

iF (8x)
RGH (3x)
Nico Madysa (1x)
unbekannt (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie