[Monkey] Spielerei mit OpenGL ES 1.1

Übersicht Andere Programmiersprachen Allgemein

Neue Antwort erstellen

Farbfinsternis

Betreff: Spielerei mit OpenGL ES 1.1

BeitragSa, Dez 31, 2011 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Seit neuestem besitzt Monkey ja das offizielle OpenGL ES Module basierend auf der Version 1.1 des Standards und einige wissen ja dass mir nichts soviel Spaß macht wie das Verpacken von Lowlevel Kram in Highlevel Funktionen. Herausgekommen ist bisher nichts was man auch nur ansatzweise als "productive" bezeichnen könnte, aber mir hat es geholfen das Modul opengl.gles11 besser zu verstehen. Neben dem normalen Wrapper Gehampel habe ich noch ein LoadMesh() eingebaut. Dieses liest ein bekloppt simples Format ein (Textdatei) und erzeugt daraus ein Mesh.

Folgender Code:
Code: [AUSKLAPPEN]

Strict

Import mojo
Import s3d.s3d

Class S3DTest Extends App
   Field plane:Mesh
   Field cam:Camera
   
   Method OnCreate:Int()
      InitS3D()
      
      plane = LoadMesh("mesh.txt")
      PositionEntity(plane, 0.0, 0.0, -2.0)
      EntityColor(plane, 255, 200, 0, 255)
            
      cam = CreateCamera()
      CameraClsColor(cam, 90, 120, 220)
            
      SetUpdateRate(60)
      
      Return 0
   End
   
   Method OnUpdate:Int()
      TurnEntity(plane, 1.0, 1.0, 1.0)
      
      Return 0
   End
   
   Method OnRender:Int()
      RenderWorld()
      
      Return 0
   End
End

Function Main:Int()
   New S3DTest()
   Return 0
End


Erzeugt dieses Bild:
user posted image

>> Das s3d Modul gibbet hier <<

... und wer kein Monkey besitzt aber mal gucken will findet hier ein Sample für Windows.

Leider läuft der Kram noch nicht unter Android und ich komme ums Verrecken nicht dahinter warum es das nicht tut ... aber das ist ja nur eine Frage der Zeit Wink
Farbfinsternis.tv

Farbfinsternis

BeitragSo, Jan 01, 2012 23:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe mal noch ein bisschen weiter gebastelt
user posted image

Neuerungen und Veränderungen:
Code: [AUSKLAPPEN]

01/01/2011 v0.1
added   : Color.toArray:Float[]()
added   : Color.toBuffer:Int(buffer:DataBuffer, address:Int)
added   : Color.toString:String()
added   : Vertex.toBuffer:Int(buffer:DataBuffer, address:Int)
added   : Entity.SetColor:Void(col:Color4F)
added   : Entity.SetColor:Void(col:String) can actually be white, black, red, green, blue, yellow, magenta, grey, lightgrey, darkgrey, orange or brown
added   : Entity.GetColor:Color4F()
added   : Color.New(col:Color4F)
added   : Color.New(col:String)
added   : Vector.toArray:Float[]()
added   : Light.New(number:Int = GL_LIGHT0, lightType:Int = LIGHT_DIRECTIONAL)
added   : S3D.CreateLight:Light(lightType:Int = LIGHT_DIRECTIONAL)
added   : CreateLight:Light(lightType:Int = LIGHT_DIRECTIONAL)
changed   : MeshFileFormat: the chunk "face" has now 7 values: x, y, z, r, g, b, a for a vertex, RGBA is optional
fixed   : Mesh.New(meshFile:String) not longer read indices to vertices
note   : Lights can be created but are currently ignored because there are no material functions in s3d
note   : if CreateLight() returns Null, there be more than 8 lights in your code
note   : a bug (or my fail) prevents that a mesh can have vertex colors


Das Modul
Das Beispiel für Windows (GLFW)

Lichter können zwar erzeugt werden, aber ihr könnt auch mit der Taschenlampe über den Monitor funzeln. Da es noch keine Materialien gibt habe ich Lichter nicht angeschaltet ... ohne Materialien ergibt es halt keinen Sinn Lichter in OGL zu setzen da deren Eigenschaften alle Eigenschaften des Meshs überschreiben.

Das Format für das MeshFile wurde geändert: Im Chunk "face" kann man nun die Vertex-Koordinaten angeben und danach (in derselben Zeile) die Farbe für dieses Vertex im Format RGBA. Das Fileformat ist abwärtskompatibel, RGBA kann auch weggelassen werden.

Ein Bug in opengl.gles11 sorgt dafür dass VertexColors derzeit nicht verwendet werden können. Ich hoffe Mark rüstet da schnell nach.
Farbfinsternis.tv

Nicdel

BeitragMo, Jan 02, 2012 3:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht recht gut aus. Kannst ja mal versuchen das LoadMesh für .obj umzuschreiben, ist ja an sich ein ziemlich einfaches Format.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Farbfinsternis

BeitragDi, Jan 03, 2012 0:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich selbst habe kaum die Zeit großartig Importer zu schreiben, das S3D Format ist nur entstanden weil mich hardcoded meshes ankotzen. Der User "Fred" im Monkey Forum hat einen Milkshape ASCII Loader geschrieben, der funktioniert zwar noch nicht wie er soll, aber wir arbeiten mit der Hilfe von Mark Sibly daran.

Im Moment baut der MS3D ASCII Loader sowas:
user posted image
Das soll eigentlich ein grauer Würfel sein Wink Ich zitiere: "it is a long hard road out of hell" Very Happy

Neu im S3D Format ist dass Chunks (face, indicies) jetzt mit ">" eingeleitet werden und nicht mehr mit einem "'". Dieses Zeichen ist jetzt Kommentaren vorbehalten. Kommentare können eine Zeile sein, oder am Ende einer Zeile stehen.
Farbfinsternis.tv

Farbfinsternis

BeitragMo, Jan 09, 2012 20:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe mich nun doch entschieden einen Wavefront Obj Loader zu bauen ....

user posted image
Farbfinsternis.tv

biggicekey

BeitragMo, Jan 09, 2012 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Coole Sache. Worauf lässt sich das alles kompilieren?
#45 www.icekeyunlimited.de www.starcrusade.de
Gewinner BCC#17 !!! mit dotkiller
Nothing more to register - you've cleaned us out![/size]

Farbfinsternis

BeitragMo, Jan 09, 2012 21:46
Antworten mit Zitat
Benutzer-Profile anzeigen
GLFW, Android und iOS
Farbfinsternis.tv

Farbfinsternis

BeitragDi, Jan 10, 2012 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Es geht voran ... habe mal ein Video hochgeladen dass ich von meiner Android-Faselfunke aufgenommen habe. Es zeigt ein Mesh welches geladen wurde und 16 weitere die Referenzen auf das erste Mesh sind, also nicht nochmals im Speicher vorliegen.

http://www.youtube.com/watch?v...AAAAAAAAAA

Der Quelltext für diese Demo:
Code: [AUSKLAPPEN]

Import s3d

Class MyApp Extends App
   Field cam:Camera, light:Light, mesh:Mesh
   
   Field ref:MeshRef[16]
   Field refTurn:Vector[16]
   
   Method OnCreate()
      Seed = Millisecs()
      
      cam      = CreateCamera
      light   = CreateLight
      mesh   = LoadMesh("monkey.obj")
            
      PositionEntity mesh, 0.0, 2.0, -4.0      
      PositionEntity light, 0.0, 5.0, -8.0
      CameraClsColor cam, 0.3, 0.6, 0.9
      
      'let's create some monkeys
      Local x:Float = -4.0
      Local y:Float = -3.0
      Local z:Float = -16.0
      Local c:Int = 0
      For Local i:Int = 0 Until 16
         ref[i] = CloneMesh(mesh)
         refTurn[i] = New Vector(Rnd(-1.0, 1.0), Rnd(-1.0, 1.0), Rnd(-1.0, 1.0))
         
         PositionEntity ref[i], x, y, z
         x += 3
         c += 1
         
         If c = 4
            c = 0
            z += 3
            x = -4
         EndIf
      Next
      SetUpdateRate 30
   End
   
   Method OnUpdate()
      TurnEntity mesh, 1.0, 1.0, 1.0
      
      ' turn the monkey horde
      For Local i:Int = 0 Until 16
         TurnEntity ref[i], refTurn[i].X(), refTurn[i].Y(), refTurn[i].Z()
      Next
   End
   
   Method OnRender()
      RenderWorld
   End
   
End

Function Main()
   New MyApp
End

user posted image
Farbfinsternis.tv

Farbfinsternis

Betreff: Schon wieder auf 0.1

BeitragDi, Jan 10, 2012 23:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Neustart!

S3D ist nun wieder auf 0.1 zurück gesetzt. Der Grund dafür ist dass es ums Verrecken nicht möglich war den alten Code so anzupassen dass er mit den Änderungen von Mark Sibly funktioniert.

Das neue Modul kann hier gezogen werden.
Das "17 Monkeys" Beispiel gibbet hier.
Die Demo funktioniert leider nicht auf GLFW und ich habe keine Ahnung warum. Auf Android und iOS läuft sie aber hervorragend.

Wenn Du selbst Modelle für S3D erstellen willst musst Du ein paar Sachen beachten:
1. Das Mesh muss Texturkoordinaten besitzen, das heißt Du musst Dein Mesh unwrappen
2. Im Moment kann man nur Wavefront Object (obj) Models laden, weitere Loader sind in Arbeit
3. Wenn Du Dein Model mit Blender2.6x exportierst aktiviere "Include Normals" und "Triangulate Faces"

Wenn Du Deine Mesh-Daten nicht umbenennen willst gehe in Deinen Buidl Ordner, öffne die CONFIG.TXT und füge bei den Textdateien die Endungen "obj" und "mtl" hinzu.

Ich habe gerade einen guten Lauf und alles funktioniert super. Somit wird aus dem "Spielereien mit GL ES1.1" ein ernsthaftes Projekt mit dem Ziel 3D Game mit Monkey (vor allem) für iOS und Android zu bauen.

Das Changelog "so far"
Code: [AUSKLAPPEN]

01/10/2012 - Restart! v0.1
added   : Classes by Mark Sibly: Mesh, Vertex, VertexMap, VertexStack, ObjLoader
added   : Classes Vector, Color, Entity, MeshRef, Texture, Material, Light, Frustum, Viewport, Camera, S3D
added   : Vector.New(x:Float = 0.0, y:Float = 0.0, z:Float = 0.0)
added   : Vector.set:Void(x:Float = 0.0, y:Float = 0.0, z:Float = 0.0)
added   : Vector.X:Float(), Vector.Y:Float(), Vector.Z:Float()
added   : Vector.add:Void(vec:Vector)
added   : Vector.add:Void(x:Float = 0.0, y:Float = 0.0, z:Float = 0.0)
added   : Entity.New(x:Float = 0.0, y:Float = 0.0, z:Float = 0.0)
added   : Entity.setPosition:Void(x:Float = 0.0, y:Float = 0.0, z:Float = 0.0)
added   : Entity.setRotation:Void(x:Float = 0.0, y:Float = 0.0, z:Float = 0.0)
added   : Entity.setScale:Void(x:Float = 0.0, y:Float = 0.0, z:Float = 0.0)
added   : Entity.turn:Void(x:Float = 0.0, y:Float = 0.0, z:Float = 0.0)
added   : Entity.move:Void(x:Float = 0.0, y:Float = 0.0, z:Float = 0.0)
added   : Entity.getPosition:Float[]()
added   : Entity.getRotation:Float[]()
added   : Entity.getScale:Float[]()
added   : Color.New(r:Float = 0.0, g:Float = 0.0, b:Float = 0.0, a:Float = 1.0)
added   : Color.set:Void(r:Float = 0.0, g:Float = 0.0, b:Float = 0.0, a:Float = 1.0)
added   : Color.RED:Float(), Color.GREEN:Float(), Color.BLUE:Float(), Color.ALPHA:Float()
added   : Color.normalize:Float[](r:Float, g:Float, b:Float, a:Float) <private
added   : Texture.New(filename:String)
added   : Texture.FlipY:Void()
added   : Texture.getWidth:Int(), Texture.getHeight:Int()
added   : Texture.getBufObj:Int(), Texture.getData:DataBuffer()
added   : Material.New()
added   : Material.setAlpha:Void(alpha:Float = 1.0)
added   : Material.setDiffuse:Void(r:Float = 1.0, g:Float = 1.0, b:Float = 1.0)
added   : Material.setAmbient:Void(r:Float = 0.0, g:Float = 0.0, b:Float = 0.0)
added   : Material.setSpecular:Void(r:Float = 1.0, g:Float = 1.0, b:Float = 1.0)
added   : Material.setShininess:Void(shininess:Float = 0.5)
added   : Material.setIllumination:Void(illumination:Float = 1.0)
added   : Material.Method getAmbient:Float[]()
added   : Material.getDiffuse:Float[]()
added   : Material.getSpecular:Float[]()
added   : Material.getAlpha:Float()
added   : Material.getShininess:Float()
added   : Material.getIllumination:Float()
added   : Material.getIlluminationModel:Int()
added   : Material.getTexture:Texture()
added   : Material.loadTexture:Texture(textureFile:String)
added   : Material.loadMaterial:Void(matFile:String)
added   : Mesh.createRef:MeshRef()
added   : MeshRef.New(mesh:Mesh)
added   : Light.New(num:Int = GL_LIGHT0, x:Float = 0.0, y:Float = 0.0, z:Float = 0.0)
added   : Light.update:Void()
added   : Frustum.New(left:Float = -1.0, right:Float = 1.0, bottom:Float = -1.0, top:Float = 1.0, near:Float = 1.0, far:Float = 100.0)
added   : Frustum.set:Void(left:Float = -1.0, right:Float = 1.0, bottom:Float = -1.0, top:Float = 1.0, near:Float = 1.0, far:Float = 100.0)
added   : Frustum.setNear:Void(value:Float = 1.0)
added   : Frustum.setFar:Void(value:Float = 100.0)
added   : Frustum.LEFT:Float(), Frustum.TOP:Float(), Frustum.RIGHT:Float()
added   : Frustum.BOTTOM:Float(), Frustum.NEAR:Float(), Frustum.FAR:Float()
added   : Viewport.New(), Viewport.set:Void(x:Float, y:Float, width:Float, height:Float)
added   : Viewport.X:Float(), Y:Float(), WIDTH:Float(), HEIGHT:Float()
added   : Camera.New()
added   : Camera.setNear:Void(value:Float = 1.0)
added   : Camera.setFar:Void(value:Float = 100.0)
added   : Camera.clsColor:Void(r:Float = 0.0, g:Float = 0.0, b:Float = 0.0, a:Float = 1.0)
added   : Camera.clsMode:Void(mode:Int = GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
added   : Camera.getFrustum:Frustum(), Camera.getViewport:Viewport()
added   : Camera.getClearColor:Color(), Camera.getClearMode:Int()
added   : S3D.New()
added   : S3D.renderWorld:Void()
added   : S3D.createCamera:Camera()
added   : S3D.createLight:Light()
added   : S3D.loadMesh:Mesh(fileName:String)
added   : S3D.refMesh:MeshRef(mesh:Mesh)
added   : RenderWorld:Void()
added   : CreateCamera:Camera()
added   : CreateLight:Light()
added   : LoadMesh:Mesh(filename:String)
added   : CloneMesh:MeshRef(mesh:Mesh)
added   : PositionEntity:Void(entity:Entity, x:Float = 0.0, y:Float = 0.0, z:Float = 0.0)
added   : TurnEntity:Void(entity:Entity, x:Float = 0.0, y:Float = 0.0, z:Float = 0.0)
added   : MoveEntity:Void(entity:Entity, x:Float = 0.0, y:Float = 0.0, z:Float = 0.0)
added   : EntityX:Float(entity:Entity)
added   : EntityY:Float(entity:Entity)
added   : EntityZ:Float(entity:Entity)
added   : EntityPitch:Float(entity:Entity)
added   : EntityYaw:Float(entity:Entity)
added   : EntityRoll:Float(entity:Entity)
added   : CameraClsColor:Void(camera:Camera, r:Float = 0.0, g:Float = 0.0, b:Float = 0.0)
changed   : Mesh.render() calls the method Mesh.bind() automatically
changed   : Mesh.render() now has the parameter lights:Light[]
changed : Mesh.render() now iterate a list of references for this mesh
changed   : ObjLoader.LoadMesh() now loads the object material and his texture
changed   : global OpenGL settings moved from renderWorld() to New()
Farbfinsternis.tv

Propellator

BeitragMi, Jan 11, 2012 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehr cool, wie aus einer kleinen Spielerei eine Engine wird. Smile
Besitze leider weder Monkey noch ein Smartphone, kann deshalb leider nicht dazu beitragen.

Gutes Gelingen beim Projekt!
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

peacemaker

BeitragMo, Feb 06, 2012 14:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, schaut alles ziemlich cool aus!

Wollte das mal in der Demo ausprobieren, nur gibt es da immer einen Fehler aufgrund des Fehlens von gles11-Wrappers... gibt es eine Möglichkeit den separat zu downloaden oder kommt man hierbei nicht ums Kaufen herum?

Greetzz
~Tehadon~
www.tehadon.de
http://www.blitzforum.de/worklogs/14/

Farbfinsternis

BeitragMo, Feb 06, 2012 15:57
Antworten mit Zitat
Benutzer-Profile anzeigen
peacemaker hat Folgendes geschrieben:
Hallo, schaut alles ziemlich cool aus!

Wollte das mal in der Demo ausprobieren, nur gibt es da immer einen Fehler aufgrund des Fehlens von gles11-Wrappers... gibt es eine Möglichkeit den separat zu downloaden oder kommt man hierbei nicht ums Kaufen herum?

Greetzz

Mit der Demo geht das nicht, erst ab Monkey v52
Farbfinsternis.tv

Neue Antwort erstellen


Übersicht Andere Programmiersprachen Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group