SetMeshData()

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
spacewalker
Beiträge: 48
Registriert: 15.07.2005 15:22
Wohnort: Stuttgart

SetMeshData()

Beitrag von spacewalker »

Tagchen!

Bei mir scheint SetMeschData() nicht wirklich zu funktionieren - die UV koordinaten werden nicht übernommen, in keiner beta. Selbst die etwas umgeschrieben 3D beispiele aus PB 3.94 oder eingelesene milkshape ASCII dateien :-(

Kann das jemand bestaetigen ?
Ich liebe Asche und Rauch meiner Zigaretten.
Benutzeravatar
grapy
Beiträge: 108
Registriert: 09.09.2004 09:05

Beitrag von grapy »

Hi,

ohne Beispiel kann man den Fehler wohl nicht finden.

Ich kann es jedenfalls nicht bestätigen.

Hab schon einiges probiert und konvertiert und bisher war es wie es sein soll.

Gruß :mrgreen: grapy
Benutzeravatar
spacewalker
Beiträge: 48
Registriert: 15.07.2005 15:22
Wohnort: Stuttgart

Beitrag von spacewalker »

hmm also folgender code erstellt pyramiden die blau gefaerbt sind..
textur ist aber gelb mit blauer umrandung.

Code: Alles auswählen

; SetMeshData / Normals Example by DiGe 07/2004 

Structure _Vertices 
  x1.f ; Vertex 1 
  y1.f 
  z1.f 
  x2.f ; Vertex 2 
  y2.f 
  z2.f 
  x3.f ; Vertex 3 
  y3.f 
  z3.f 
EndStructure 

Structure _Triangles 
  TriangleF_a.w 
  TriangleF_b.w 
  TriangleF_c.w 
  
  TriangleB_a.w 
  TriangleB_b.w 
  TriangleB_c.w 
EndStructure 

Structure _TextureCoordinates 
  Vertex1_a.f ; Vertex 1 
  Vertex1_b.f 
  Vertex2_a.f ; Vertex 2 
  Vertex2_b.f 
  Vertex3_a.f ; Vertex 3 
  Vertex3_b.f 
  Vertex4_a.f ; Vertex 4 
  Vertex4_b.f 
EndStructure 

Structure _Normals 
  x1.f ; Normals Vertex 1 
  y1.f 
  z1.f 
  x2.f ; Normals Vertex 2 
  y2.f 
  z2.f 
  x3.f ; Normals Vertex 3 
  y3.f 
  z3.f 
EndStructure 

Structure _Colors 
  ; Farben für jede Seite des Dreieckes 
  col_a.l 
  col_b.l 
  col_c.l 
EndStructure 

Procedure GetNormals ( *Vertics, *Normals, Negativ.b ) 
  
  *TEMP._Vertices = *Vertics 
  *NRML._Normals  = *Normals 
  
  If Negativ 
    *NRML\x1 = ((*TEMP\y3 - *TEMP\y2) * (*TEMP\z2 - *TEMP\z1)) - ((*TEMP\z3 - *TEMP\z2) * (*TEMP\y2 - *TEMP\y1)) 
    *NRML\y1 = ((*TEMP\z3 - *TEMP\z2) * (*TEMP\x2 - *TEMP\x1)) - ((*TEMP\x3 - *TEMP\x2) * (*TEMP\z2 - *TEMP\z1)) 
    *NRML\z1 = ((*TEMP\x3 - *TEMP\x2) * (*TEMP\y2 - *TEMP\y1)) - ((*TEMP\y3 - *TEMP\y2) * (*TEMP\x2 - *TEMP\x1)) 
  Else 
    *NRML\x1 = ((*TEMP\y1 - *TEMP\y2) * (*TEMP\z2 - *TEMP\z3)) - ((*TEMP\z1 - *TEMP\z2) * (*TEMP\y2 - *TEMP\y3)) 
    *NRML\y1 = ((*TEMP\z1 - *TEMP\z2) * (*TEMP\x2 - *TEMP\x3)) - ((*TEMP\x1 - *TEMP\x2) * (*TEMP\z2 - *TEMP\z3)) 
    *NRML\z1 = ((*TEMP\x1 - *TEMP\x2) * (*TEMP\y2 - *TEMP\y3)) - ((*TEMP\y1 - *TEMP\y2) * (*TEMP\x2 - *TEMP\x3)) 
  EndIf 
  
  Length.f = Sqr( *NRML\x1 * *NRML\x1 + *NRML\y1 * *NRML\y1 + *NRML\z1 * *NRML\z1) 
  If Length = 0 : Length = 1 : EndIf 
  
  *NRML\x1 / Length 
  *NRML\y1 / Length 
  *NRML\z1 / Length 
  
  *NRML\x2 = *NRML\x1 
  *NRML\y2 = *NRML\y1 
  *NRML\z2 = *NRML\z1 
  
  *NRML\x3 = *NRML\x1 
  *NRML\y3 = *NRML\y1 
  *NRML\z3 = *NRML\z1 
  
EndProcedure 

Procedure InitGameTimer() 
  ; initialize highres timing function TimeGetTime_() 
  Shared _GT_DevCaps.TIMECAPS 
  timeGetDevCaps_(_GT_DevCaps,SizeOf(TIMECAPS)) 
  timeBeginPeriod_(_GT_DevCaps\wPeriodMin) 
EndProcedure 

Procedure StopGameTimer() 
  ; de-initialize highres timing function TimeGetTime_() 
  Shared _GT_DevCaps.TIMECAPS 
  timeEndPeriod_(_GT_DevCaps\wPeriodMin) 
EndProcedure 

Procedure ShowError(error$) 
  #ERR_1 = "Cant create " 
  #ERR_2 = " !"+Chr(13)+"(out of memory?)" 
  MessageRequester("ERROR",#ERR_1+error$+#ERR_2,#MB_ICONERROR) 
  End 
EndProcedure 

;{ Initialisierung 
If InitEngine3D() And InitSprite() And InitKeyboard() And InitMouse() 
  
  #LOOPTIME   = 1000/60  ; 60 Frames in 1000ms (1second) 
  SmallFont = LoadFont(0,"Tahoma", 10, #PB_Font_Bold) 
  
  If OpenWindow(0, 0, 0, 800, 600,"OGRE Rocks") 
    If OpenWindowedScreen(WindowID(0),0, 0, 800, 600, 0, 0, 0)=0 
      MessageRequester("ERROR","Cant open DirectX screen !",#MB_ICONERROR):End 
    EndIf 
  EndIf 
  
  Dim TextureCoordinates._TextureCoordinates (3) 
  Dim Triangles._Triangles(3) 
  Dim Vertices._Vertices  (3) 
  Dim Normals._Normals    (3) 
  
; Pyramide 
  Restore Pyramide_Vertics 
  For a = 0 To 3 
    Read Vertices(a)\x1 
    Read Vertices(a)\y1 
    Read Vertices(a)\z1 
    
    Read Vertices(a)\x2 
    Read Vertices(a)\y2 
    Read Vertices(a)\z2 
    
    Read Vertices(a)\x3 
    Read Vertices(a)\y3 
    Read Vertices(a)\z3 
    
    Vertices(a)\x1 - 1 
    Vertices(a)\x2 - 1 
    Vertices(a)\x3 - 1 
    
    Vertices(a)\z1 - 1 
    Vertices(a)\z2 - 1 
    Vertices(a)\z3 - 1 
    
    GetNormals(@Vertices(a), @Normals(a), 0 ) 
  Next 
  
  Restore Pyramide_Faces 
  For a = 0 To 3 
    Read Triangles(a)\TriangleF_a 
    Read Triangles(a)\TriangleF_b 
    Read Triangles(a)\TriangleF_c 
    
    Read Triangles(a)\TriangleB_a 
    Read Triangles(a)\TriangleB_b 
    Read Triangles(a)\TriangleB_c 
  Next  
  
  For a = 0 To 3 
    Restore Pyramide_UV 
    Read TextureCoordinates(a)\Vertex1_a 
    Read TextureCoordinates(a)\Vertex1_b 
    
    Read TextureCoordinates(a)\Vertex2_a 
    Read TextureCoordinates(a)\Vertex2_b 
    
    Read TextureCoordinates(a)\Vertex3_a 
    Read TextureCoordinates(a)\Vertex3_b 
    
    Read TextureCoordinates(a)\Vertex4_a 
    Read TextureCoordinates(a)\Vertex4_b 
  Next 

  If CreateMesh(0,-1) 
    SetMeshData( 0, #PB_Mesh_Vertex     ,@Vertices()          , 12 * 3 ) 
    SetMeshData( 0, #PB_Mesh_Face    ,@Triangles()         , 4  * 2 ) 
    SetMeshData( 0, #PB_Mesh_UVCoordinate,@TextureCoordinates(), 4  * 2 ) 
    SetMeshData( 0, #PB_Mesh_Normal      ,@Normals()           , 4  * 3 ) 
  
    If CreateTexture(0, 64, 64) 
      If StartDrawing(TextureOutput(0)) 
        Box(0,0,64,64,$FF0000) 
        Box(1,1,62,62,$00FFFF) 
        FrontColor( RGB(0, 0, 0) ) 
        DrawingMode(1) 
        DrawText(3,5,"LiGHT" ) 
        StopDrawing() 
      EndIf 
  
      CreateMaterial(0,TextureID(0)) 
  
      If CreateEntity(0, MeshID(0),MaterialID(0)) 
        MaterialShadingMode  (0, #PB_Material_Flat ) 
        MaterialDiffuseColor (0, RGB($FF,$FF,$FF)) 
        MaterialAmbientColor (0, RGB($90,$90,$90)) 
        MaterialSpecularColor(0, RGB($F0,$F0,$F0)) 
        MaterialFilteringMode(0, #PB_Material_Trilinear ) 
      EndIf 
      
      CopyEntity ( 0, 1 ) : ResizeEntity( 1, 0.5, 0.5, 0.5 ) 
      CopyEntity ( 1, 2 ) : ResizeEntity( 2, 0.25, 0.25, 0.25 ) 
      CopyEntity ( 1, 3 ) : ResizeEntity( 3, 0.75, 0.75, 0.75 ) 
      CopyEntity ( 1, 4 ) : ResizeEntity( 4, 1.25, 1.25, 1.25 ) 
      
      EntityLocate( 1, -2, 0, 2 ) 
      EntityLocate( 2,  2, 0, 2 ) 
      EntityLocate( 3, -2, 0, -2 ) 
      EntityLocate( 4,  2, 0, -2 ) 
      
    EndIf 
  EndIf 
  
  CreateCamera (0, 0, 0, 100, 100) 
  CameraRange  (0, 0.1, 400 ) 
  CameraLookAt (0, 0, 0, 0 ) 
  CameraLocate (0, 0, 1, 5 ) 
  
  If CreateLight(1,RGB($FF,$FF,$FF))=0:ShowError("light"):Else:LightLocate(1, 0, 1, 2):EndIf 
  
  ; start game timer 
  InitGameTimer() 
  LoopTimer = timeGetTime_() 
  ;} 
;{ Schleife, Abfrage 
Repeat 
  If fullscreen 
    While ( timeGetTime_()-LoopTimer )<#LOOPTIME : Delay(1) : Wend 
    LoopTimer = timeGetTime_() 
  Else 
    Repeat 
      Event=WindowEvent() 
      If Event=#PB_Event_CloseWindow 
        Quit = #True 
      ElseIf Event=0 
        While ( timeGetTime_()-LoopTimer )<#LOOPTIME : Delay(1) : Wend 
        LoopTimer = timeGetTime_() 
      EndIf 
    Until Event=0 
  EndIf 
  
  ; check keys 
  If ExamineKeyboard() 
    If KeyboardPushed(#PB_Key_Right) 
    MoveCamera(0, 1,0,0):EndIf 
    If KeyboardPushed(#PB_Key_Left) 
    MoveCamera(0,-1,0,0):EndIf 
    If KeyboardPushed(#PB_Key_Up) 
    MoveCamera(0,0,0,-1):EndIf 
    If KeyboardPushed(#PB_Key_Down) 
    MoveCamera(0,0,0, 1):EndIf 
    If KeyboardPushed(#PB_Key_F3) 
      FOV - 1 : If FOV < 40:FOV=40:EndIf 
    CameraFOV(0,FOV):EndIf 
    If KeyboardPushed(#PB_Key_F4) 
      FOV + 1 : If FOV > 120:FOV=120:EndIf 
    CameraFOV(0,FOV):EndIf 
    
    If keypressed=0 
      If KeyboardPushed(#PB_Key_F1) 
      HideText!1 : keypressed=20 : EndIf 
      If KeyboardPushed(#PB_Key_F2) 
        RenderMode+1 : If RenderMode=3:RenderMode=0:EndIf 
      CameraRenderMode(0,RenderMode):keypressed=20:EndIf 
      If KeyboardPushed(#PB_Key_F5) 
        ScaleEntity(enti, 1.1, 1.1, 1.1) 
      EndIf 
    Else 
      keypressed-1 
    EndIf 
  EndIf 
  
  ; mouse freelook 
  If ExamineMouse() 
    RotateCamera(0,-MouseDeltaX(),-MouseDeltaY(),0) 
  EndIf 
  a = a+1
  RotateEntity( 0, a, 0, 0 ) 
  
  ; info text 
  If HideText=0 
    If StartDrawing(ScreenOutput()) 
      DrawingMode(1):FrontColor(RGB($40,$FF,$00)):DrawingFont(SmallFont) 
      DrawText(15,15,"F2     : RenderMode") 
      DrawText(15,30,"Count  : "+Str( CountRenderedTriangles() )) 
      DrawText(15,45,"FPS    : "+Str( Engine3DFrameRate(#PB_Engine3D_Current))) 
      
      DrawText(250,15,"CameraX: "+RSet(StrF(CameraX(0),2),4,"0")) 
      DrawText(250,30,"CameraY: "+RSet(StrF(CameraY(0),2),4,"0")) 
      DrawText(250,45,"CameraZ: "+RSet(StrF(CameraZ(0),2),4,"0")) 
      
      StopDrawing() 
    EndIf 
  EndIf 
  
  FlipBuffers() 
  RenderWorld() 
  
Until KeyboardPushed(#PB_Key_Escape) Or Quit 
StopGameTimer() 
Else 
  MessageRequester("Error", "Cant init DirectX 3D Engine",0) 
EndIf 
;}  
End 

;{ Daten-Sektion 
DataSection 

Pyramide_Vertics: 
  Data.f 0,0,0 ; Vertex0 
  Data.f 1,2,1 ; Vertex1 
  Data.f 2,0,0 ; Vertex2 
  
  Data.f 2,0,0 ; Vertex3 
  Data.f 1,2,1 ; Vertex4 
  Data.f 2,0,2 ; Vertex5 
  
  Data.f 2,0,2 ; Vertex6 
  Data.f 1,2,1 ; Vertex7 
  Data.f 0,0,2 ; Vertex8 
  
  Data.f 0,0,2 ; Vertex9 
  Data.f 1,2,1 ; Vertex10 
  Data.f 0,0,0 ; Vertex11 

Pyramide_Faces: 
  Data.w 0, 1, 2 ; Face 1 
  Data.w 0, 2, 1 ; Face 2 
  
  Data.w 3, 4, 5 ; Face 3 
  Data.w 3, 5, 4 ; Face 4 
  
  Data.w 6, 7, 8 ; Face 5 
  Data.w 6, 8, 7 ; Face 6 
  
  Data.w 9, 10, 11 ; Face 7 
  Data.w 9, 11, 10 ; Face 8 

Pyramide_UV: 
  Data.f 0.0, 0.0 
  Data.f 0.0, 3.0 
  Data.f 3.0, 3.0 
  Data.f 3.0, 0.0 

EndDataSection 
;} 
Ich liebe Asche und Rauch meiner Zigaretten.
Benutzeravatar
grapy
Beiträge: 108
Registriert: 09.09.2004 09:05

Beitrag von grapy »

Wenn ich die Texture extrahiere und es in Milkshape nachstelle,

kommt dasselbe dabei raus. Alles blau! :mrgreen: grapy
Benutzeravatar
grapy
Beiträge: 108
Registriert: 09.09.2004 09:05

Beitrag von grapy »

@spacewalker

Hab mir nochmal Zeit genommen...

und es geht doch:

Code: Alles auswählen

  ExamineDesktops() 
  hBitmap = CreateImage(99, DesktopWidth(0), DesktopHeight(0)) 
  hdc = StartDrawing(ImageOutput(99)) 
  SelectObject_(hdc, hBitmap) 
  BitBlt_(hdc, 0, 0, DesktopWidth(0), DesktopHeight(0), GetDC_(GetDesktopWindow_()), 0, 0, #SRCCOPY) 
  StopDrawing() 
  DeleteDC_(hdc)

  InitEngine3D()
   
  InitSprite()
  
  InitKeyboard()
   
  InitMouse()  
   
  OpenWindow(0, 308, 235, 800, 600, "my_Create_a_mesh", #PB_Window_SystemMenu | #PB_Window_TitleBar)

  OpenWindowedScreen(WindowID(0), 0, 0, 800, 600, 0, 0, 0)
        
  AmbientColor(RGB(255, 255, 255)) 


  CreateMesh(99, -1) 
  SetMeshData(99, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate, ?VertexID, 4) 
  SetMeshData(99, #PB_Mesh_Face, ?FaceID, 2) 

  CreateTexture(99, 256, 256) 
  StartDrawing(TextureOutput(99)) 
  DrawImage(ImageID(99),0,0) 
  StopDrawing() 

  CreateMaterial(99, TextureID(99))
  
  CreateEntity(99, MeshID(99), MaterialID(99))

 
  CreateCamera(1, 0, 0, 100, 100)
     
  CameraLocate(1, 0, 50, 350)

  CameraRange(1, 0.1, 1000)

 
  Repeat
    
    Event = WindowEvent()
    
      ExamineKeyboard() 
        If KeyboardPushed(#PB_Key_A)
          KeyX.f = -factor.f 
        ElseIf KeyboardPushed(#PB_Key_D) 
          KeyX = factor.f 
        Else 
          KeyX = 0 
        EndIf 
        
        If KeyboardPushed(#PB_Key_W) 
          KeyZ.f = -factor.f 
        ElseIf KeyboardPushed(#PB_Key_S)
          KeyZ = factor.f 
        Else 
          KeyZ = 0 
        EndIf  

        If sglob
          KeyZ = factor.f
        EndIf
        
      ExamineMouse() 
        MouseX.f = -MouseDeltaX()/10 
        MouseY.f = -MouseDeltaY()/10
        CameraRX.f + MouseX
        CameraRY.f
        CameraRZ.f + MouseY
        RotateCamera(1, MouseX, MouseY, 0) 
      
       
      MoveCamera(1, KeyX, 0, KeyZ) 
    

      RenderWorld() 
 
      If StartDrawing(ScreenOutput()) 
        FrontColor(RGB(255, 255, 255)) 
        DrawingMode(#PB_2DDrawing_Transparent) 
        DrawText(0, 0, StrF(Engine3DFrameRate(#PB_Engine3D_Current), 1)+" FPS") 
        DrawText(0, 15, Str(CountRenderedTriangles())+" Triangles")
        StopDrawing() 
      EndIf 
      
      FlipBuffers(1)      

Until KeyboardPushed(#PB_Key_Escape) Or Event = #PB_Event_CloseWindow
  
  
DataSection
  VertexID:
   ;Data.f x, y, z, Nx, Ny, Nz, U, V 
    Data.f -100, 100, 0, 0, 0, -1, 0, 0
    Data.f -100, 0, 0, 0, 0, -1, 0, 1
    Data.f 100, 0, 0, 0, 0, -1, 1, 1
    Data.f 100, 100, 0, 0, 0, -1, 1, 0    
  FaceID:
    Data.w 0, 1, 2
    Data.w 0, 2, 3   
EndDataSection
gruß :mrgreen: grapy
Gesperrt