3DS Import für Ogre

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

3DS Import für Ogre

Beitrag von mpz »

Hi,

hier kommt eine kleines Beispiel um 3DS Dateien in Ogre zu übernehmen. Ich arbeite gerade an einem B3D Import für meine 3D Engine, vielleicht mache ich davon auch eine Anpassung für Ogre...


Mit freundlichen Grüssen,
Michael

Code: Alles auswählen

;////////////////////////////////////////////////////////////////
;//
;// Project Title: 3DS Import
;// File Title: OgreMesh_3ds.pb
;// Created On: 16.5.2009
;// Updated On: 
;// Author: Michael Paulwitz
;// OS:Windows
;// 
;// Ein Beispielcode meiner MP 3D Engine angepasst für Ogre 
;// Unterstützt nur einen Texturlayer
;// 
;// A piece of code for my MP 3D Engine, adapted for Ogre
;// support only one textur layer
;// 
;////////////////////////////////////////////////////////////////


Structure MyVertex 
    x.f : y.f : z.f     ; vertices coordinates 
    nx.f : ny.f : nz.f  ; normals coordinates
    Color.l             ; color ARGB
    u.f : v.f           ; texture coordinates 
EndStructure 

Structure FTriangle 
    f1.w 
    f2.w 
    f3.w  
EndStructure 

Structure D3DCOLORVALUE
    r.f
    g.f
    b.f
    a.f
EndStructure

Structure D3DMATERIAL
   Ambient.D3DCOLORVALUE ;/* Ambient color RGB */
   Diffuse.D3DCOLORVALUE ;/* Diffuse color RGBA */
   Specular.D3DCOLORVALUE ;/* Specular 'shininess' */
EndStructure

#Mesh = 0
    
Procedure MP_Load3ds( Mesh.l , FileName.s )
  
  Color.l = $FFFFFF  
  If FileName.s
    If ReadFile(0, FileName)
      Texture.D3DMATERIAL
    
    
      While Eof(0) = 0           ; sich wiederholende Schleife bis das Ende der Datei ("end of file") erreicht ist
          chunk_id  = ReadWord(0) & $FFFF
          chunk_len.l = ReadLong(0)
          Select chunk_id
                  Case $4D4D ;  Main chunk 
               ;   Case $0002 ;   : 3DS-Version
               ;         Debug "< Version = "+Str( ReadLong(0)) 
                  Case $3D3D ;  3D editor chunk
                  Case $AFFF ; Material exist
                ;  Case $A000 ; Material name
                ;        MaterialName.s = ReadString(0)
                ;        Debug "< MaterialName = "+MaterialName                  
                  Case $10 ; * 0010 - RGB Color, float size 4,4,4
                        If Text_Kind = 1
                          Texture\Ambient\r = ReadFloat(0)*255
                          Texture\Ambient\g = ReadFloat(0)*255
                          Texture\Ambient\b = ReadFloat(0)*255
                        ElseIf Text_Kind = 2
                          Texture\Diffuse\r = ReadFloat(0)*255
                          Texture\Diffuse\g = ReadFloat(0)*255
                          Texture\Diffuse\b = ReadFloat(0)*255
                        ElseIf Text_Kind = 3
                          Texture\Specular\r = ReadFloat(0)*255
                          Texture\Specular\g = ReadFloat(0)*255
                          Texture\Specular\b = ReadFloat(0)*255
                        EndIf
                  Case $11 ; * 0011 - RGB Color - 24 bit, 3 x Byte  
                        If Text_Kind = 1
                          Texture\Ambient\r = ReadByte(0)
                          Texture\Ambient\g = ReadByte(0)
                          Texture\Ambient\b = ReadByte(0)
                        ElseIf Text_Kind = 2
                          Texture\Diffuse\r = ReadByte(0)
                          Texture\Diffuse\g = ReadByte(0)
                          Texture\Diffuse\b = ReadByte(0)
                        ElseIf Text_Kind = 3
                          Texture\Specular\r = ReadByte(0)
                          Texture\Specular\g = ReadByte(0)
                          Texture\Specular\b = ReadByte(0)
                        EndIf
                  Case $A010 ; Ambient color
                          ;Debug "< Ambient color"
                          Text_Kind = 1
                  Case $A020 ; Diffuse color
                          ;Debug "< Diffuse color"
                          Text_Kind = 2
                  Case $A030 ; Specular color
                          ;Debug "< Specular color"
                          Text_Kind = 3
                  Case $A040 ; Material shininess percent
                  Case $A041 ; Material shininess strength percent
                  Case $A200 ; Map
                  Case $A300 ; Mapping filename
                        Texturname.s = ReadString(0)
                        ;Debug "< Texturname = "+Texturname
                  Case $4000 ; Object block (with name of your object)
                        ModelName.s = ReadString(0)
                  ;      Debug "< Modelname = "+ModelName
			            Case $4100 ;  Triangular mesh
		   	          Case $4110 ; Your vertices
                        qty_Vertex.w = ReadWord(0)
                        ;Debug "< Vertex = "+Str(qty_Vertex)
                        *VBuffer = AllocateMemory(SizeOf(MyVertex)*qty_Vertex) 
                        *PtrV.MyVertex = *VBuffer
                        For i=0 To qty_Vertex-1
                            *PtrV\x = ReadFloat(0) 
                            *PtrV\y = ReadFloat(0) 
                            *PtrV\z = ReadFloat(0)
                            *PtrV\nx = *PtrV\x
                            *PtrV\ny = *PtrV\y
                            *PtrV\nz = *PtrV\z
                            *PtrV\Color = Color  
                            *PtrV + SizeOf(MyVertex) 
                        Next    
 			            Case $4120 ; Your faces
                        qty_Triangle.w = ReadWord(0)
                        ;Debug "< Triangle = "+Str(qty_Triangle)
                        *IBuffer=AllocateMemory(SizeOf(FTriangle)*qty_Triangle) 
                        *PtrF.FTriangle=*IBuffer 
                        For i=0 To qty_Triangle-1
                            *PtrF\f1 = ReadWord(0)
                            *PtrF\f2 = ReadWord(0)
                            *PtrF\f3 = ReadWord(0)
                            face_flags.w = ReadWord(0)
                      ;      Debug Str(*PtrF\f1)+ " / "+Str(*PtrF\f2)+ " / "+Str(*PtrF\f3)+" / "+Str(face_flags)
                            *PtrF + SizeOf(FTriangle) 
                            
				                Next
    		          Case $4140 ; : Mapping coordinates list
                        qty_Vertex.w = ReadWord(0)
                        ;Debug "< Vertex uv = "+Str(qty_Vertex)
                        *PtrV.MyVertex = *VBuffer

				                For i=0 To qty_Vertex-1
                            *PtrV\u = ReadFloat(0) 
                            *PtrV\v = ReadFloat(0) 
                            *PtrV + SizeOf(MyVertex) 
                        Next
                  Default
                        For x = 1 To chunk_len - 6
                              ReadByte(0)
                        Next
               EndSelect
               Wend

               CreateMesh(Mesh, qty_Vertex)
               SetMeshData(Mesh, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_Color  | #PB_Mesh_UVCoordinate, *VBuffer, qty_Vertex);3)
               SetMeshData(Mesh, #PB_Mesh_Face, *IBuffer, qty_Triangle)

               Add3DArchive(GetPathPart(FileName.s), #PB_3DArchive_FileSystem) ; Textur in Ordner / Add folder

               If FileSize(GetPathPart(FileName.s)+Texturname) > 0
                  CreateEntity(Mesh, MeshID(Mesh), CreateMaterial(0, LoadTexture(0, Texturname.s)))
                  MaterialAmbientColor(0, RGB(Texture\Ambient\r,Texture\Ambient\g,Texture\Ambient\b))
                  MaterialDiffuseColor(0, RGB(Texture\Diffuse\r,Texture\Diffuse\g,Texture\Diffuse\b))
                  MaterialSpecularColor(0, RGB(Texture\Specular\r,Texture\Specular\g,Texture\Specular\b))
               Else
                  CreateEntity(Mesh, MeshID(0),#PB_Material_None)
               EndIf
               ProcedureReturn #True
      EndIf
      CloseFile(0)
    EndIf

  ProcedureReturn #False

EndProcedure

If InitEngine3D() And InitSprite() And InitKeyboard()
  OpenWindow(0,0,0,640,480,"3DS Import TEST  - Key A and Y/Z bewegt/move Mesh",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0)
 
  Pattern$ = "3DS Files(*.3ds)|*.3ds"
  directory$ = "C:\Programme\PureBasic\media\"
  FileName.s = OpenFileRequester("Bitte Datei zum Laden auswählen", directory$, Pattern$, 0) 
  If Not FileName.s
     MessageRequester("Information", "Der Requester wurde abgebrochen.", 0)
     End 
  EndIf
  MP_Load3ds( #Mesh , FileName.s )
 
  colorlight = 0
  
  If colorlight = 0
 
     CreateLight(0, RGB(255,255,255), 100.0, 0, 0)   ; White Light

  Else
  
     CreateLight(0, RGB(0,0,255), 100.0, 0, 0)   ; Blue Light
     CreateLight(1, RGB(255,0,0), -100.0, 0, 0)  ; Red Light
     CreateLight(2, RGB(255,255,0), 0.0, 100, 0)   ; Yellow Light
  
  EndIf
    
    CreateCamera(0, 0, 0, 100, 100)
   CameraLocate(0,0,0,40)
 
    Repeat
      ExamineKeyboard()
      Select WindowEvent()
        Case #PB_Event_CloseWindow
          Quit = #True
      EndSelect
 
      If KeyboardPushed(#PB_Key_A) ; Key A = Zoom +
         z-1
         CameraLocate(0,0,0,z)
      EndIf
 
      If KeyboardPushed(#PB_Key_Z) ; Key Z = Zoom +
         z+1
         CameraLocate(0,0,0,z)
      EndIf
  
      If KeyboardPushed(#PB_Key_Y) ; Key Y = Zoom +
         z+1
         CameraLocate(0,0,0,z)
      EndIf
 
      RotateEntity(#Mesh, 1, 1, 1, #PB_Relative)
 
      ClearScreen(RGB(0,0,0))
      RenderWorld()
      FlipBuffers()
 
    Until KeyboardPushed(#PB_Key_Escape) Or Quit
Else
  MessageRequester("Error", "Cant init DirectX 3D Engine",0)
EndIf
 
End
Working on :lol: - LibSGD - MP3D Engine - 8)
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Beitrag von mpz »

Falls es hier im Forum jemand interessiert:

B3D import
http://www.purebasic.fr/english/viewtopic.php?t=36839

Gruß,
Michael

edit: link angepasst
Zuletzt geändert von mpz am 23.03.2009 11:47, insgesamt 1-mal geändert.
Working on :lol: - LibSGD - MP3D Engine - 8)
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

Da war ein Doppelpost im engl. Forum, ich hab des entfernt.
der richtige Link ist:

http://www.purebasic.fr/english/viewtopic.php?t=36839
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Beitrag von mpz »

Hi rings,

Danke, hatte ich nicht bemerkt...

Gruß Michael
Working on :lol: - LibSGD - MP3D Engine - 8)
Benutzeravatar
Morty
Beiträge: 268
Registriert: 22.10.2004 07:20
Wohnort: Erfurt
Kontaktdaten:

Beitrag von Morty »

Hi Michael.

Nur damit Du nicht an Dir zweifelst ;o)
Ich finde Deine Sachen im 3D Bereich sehr hilfreich. Hab mir gerade auch mal Deinen "3D Konverter" angeschaut. Auf den ersten Blick macht er saubere Arbeit.

Ich denke einfach, es programmieren hier nicht so viele an 3D Spielen oder ähnlichen. Auch ich überlege jedesmal, ob ich für ein neues Projekt auf irrLicht in C++ zurück greife, oder es wieder mit PB Ogre versuche.

Darum, mach auf jeden Fall weiter so und gib den Leuten hier im Forum mehr Zeit :allright:

Morty
Antworten