Material "Scripte" mit Purebasic Mitteln umsetzen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

Material "Scripte" mit Purebasic Mitteln umsetzen

Beitrag von Makke »

Hallo zusammen,

ich schaue mir gerade die 3D Funktionen von Purebasic an. In den Examples habe ich gesehen, das Fred (oder wer die auch erstellt hat) die Scripte mit Purebasic Mitteln nachgebaut hat (Bsp.: die Partikel Demo).

Jetzt hatte ich folgendes gefunden: http://devernay.free.fr/cours/opengl/materials.html und alleine schon der klangvollen Farbnamen habe ich mal versucht das nachzubauen:

Code: Alles auswählen

; Quelle: http://devernay.free.fr/cours/opengl/materials.html

EnableExplicit

Enumeration
  #MATERIAL_PREDEF_EMERALD
  #MATERIAL_PREDEF_JADE
  #MATERIAL_PREDEF_OBSIDIAN
  #MATERIAL_PREDEF_PEARL
  #MATERIAL_PREDEF_RUBY
  #MATERIAL_PREDEF_TURQUOISE
  #MATERIAL_PREDEF_BRASS
  #MATERIAL_PREDEF_BRONZE
  #MATERIAL_PREDEF_CHROME
  #MATERIAL_PREDEF_COPPER
  #MATERIAL_PREDEF_GOLD
  #MATERIAL_PREDEF_SILVER
  #MATERIAL_PREDEF_BLACKPLASTIC
  #MATERIAL_PREDEF_CYANPLASTIC
  #MATERIAL_PREDEF_GREENPLASTIC
  #MATERIAL_PREDEF_REDPLASTIC
  #MATERIAL_PREDEF_WHITEPLASTIC
  #MATERIAL_PREDEF_YELLOWPLASTIC
  #MATERIAL_PREDEF_BLACKRUBBER
  #MATERIAL_PREDEF_CYANRUBBER
  #MATERIAL_PREDEF_GREENRUBBER
  #MATERIAL_PREDEF_REDRUBBER
  #MATERIAL_PREDEF_WHITERUBBER
  #MATERIAL_PREDEF_YELLOWRUBBER
EndEnumeration

Dim TextureNames.s(24)
Dim WindowBtn.i(24)
Define.i WindowEvt, GadgetEvt, hMaterial, hMesh, hEntity, hLight, hCamera
Define.b DoLoop = #True

Macro fRGB(r, g, b)
  RGB(Round(r, #PB_Round_Nearest), Round(g, #PB_Round_Nearest), Round(b, #PB_Round_Nearest))
EndMacro

Macro Do(Status, Error, EndProgram = #True) ; Purebasic Forum
  If Not Status
    CompilerIf #PB_Compiler_Debugger
      Debug "ERROR: " + Error
    CompilerElse
      MessageRequester("ERROR", Error)
    CompilerEndIf
    CompilerIf EndProgram
      End
    CompilerEndIf
  EndIf
EndMacro

Procedure.i CreatePredefinedMaterial(TypeOfMaterial.i, hTexture.i=-1, TexWidth.i=512, TexHeight.i=512)
  
  Shared hLight
  Protected.i hMat
  Protected.f ambr, ambg, ambb, ambin, difr, difg, difb, specr, specg, specb, shine
  
  Select TypeOfMaterial
    
    Case #MATERIAL_PREDEF_EMERALD
      ambr  = 0.0215 : ambg  = 0.1745 : ambb  = 0.0215 : difr  = 0.07568 : difg  = 0.61424 : difb  = 0.07568 : specr = 0.633 : specg = 0.727811 : specb = 0.633 : shine = 0.6
      
    Case #MATERIAL_PREDEF_JADE
      ambr=0.135 : ambg=0.2225 : ambb=0.1575 : difr=0.54 : difg=0.89 : difb=0.63 : specr=0.316228 : specg=0.316228 : specb=0.316228 : shine=0.1
      
    Case #MATERIAL_PREDEF_OBSIDIAN
      ambr=0.05375 : ambg=0.05 : ambb=0.06625 : difr=0.18275 : difg=0.17 : difb=0.22525 : specr=0.332741 : specg=0.328634 : specb=0.346435 : shine=0.3      
      
    Case #MATERIAL_PREDEF_PEARL
      ambr=0.25 : ambg=0.20725 : ambb=0.20725 : difr=1 : difg=0.829 : difb=0.829 : specr=0.296648 : specg=0.296648 : specb=0.296648 : shine=0.088
      
    Case #MATERIAL_PREDEF_RUBY
      ambr=0.1745 : ambg=0.01175 : ambb=0.01175 : difr=0.61424 : difg=0.04136 : difb=0.04136 : specr=0.727811 : specg=0.626959 : specb=0.626959 : shine=0.6
      
    Case #MATERIAL_PREDEF_TURQUOISE
      ambr=0.1 : ambg=0.18725 : ambb=0.1745 : difr=0.396 : difg=0.74151 : difb=0.69102 : specr=0.297254 : specg=0.30829 : specb=0.306678 : shine=0.1
      
    Case #MATERIAL_PREDEF_BRASS
      ambr=0.329412 : ambg=0.223529 : ambb=0.027451 : difr=0.780392 : difg=0.568627 : difb=0.113725 : specr=0.992157 : specg=0.941176 : specb=0.807843 : shine=0.21794872
      
    Case #MATERIAL_PREDEF_BRONZE
      ambr=0.2125 : ambg=0.1275 : ambb=0.054 : difr=0.714 : difg=0.4284 : difb=0.18144 : specr=0.393548 : specg=0.271906 : specb=0.166721 : shine=0.2
      
    Case #MATERIAL_PREDEF_CHROME
      ambr=0.25 : ambg=0.25 : ambb=0.25 : difr=0.4 : difg=0.4 : difb=0.4 : specr=0.774597 : specg=0.774597 : specb=0.774597 : shine=0.6      
      
    Case #MATERIAL_PREDEF_COPPER
      ambr=0.19125 : ambg=0.0735 : ambb=0.0225 : difr=0.7038 : difg=0.27048 : difb=0.0828 : specr=0.256777 : specg=0.137622 : specb=0.086014 : shine=0.1
      
    Case #MATERIAL_PREDEF_GOLD
      ambr=0.24725 : ambg=0.1995 : ambb=0.0745 : difr=0.75164 : difg=0.60648 : difb=0.22648 : specr=0.628281 : specg=0.555802 : specb=0.366065 : shine=0.4      
      
    Case #MATERIAL_PREDEF_SILVER
      ambr=0.19225 : ambg=0.19225 : ambb=0.19225 : difr=0.50754 : difg=0.50754 : difb=0.50754 : specr=0.508273 : specg=0.508273 : specb=0.508273 : shine=0.4
      
    Case #MATERIAL_PREDEF_BLACKPLASTIC
      ambr=0.0 : ambg=0.0 : ambb=0.0 : difr=0.01 : difg=0.01 : difb=0.01 : specr=0.50 : specg=0.50 : specb=0.50 : shine=0.25
      
    Case #MATERIAL_PREDEF_CYANPLASTIC
      ambr=0.0 : ambg=0.1 : ambb=0.06 : difr=0.0 : difg=0.50980392 : difb=0.50980392 : specr=0.50196078 : specg=0.50196078 : specb=0.50196078 : shine=0.25
      
    Case #MATERIAL_PREDEF_GREENPLASTIC
      ambr=0.0 : ambg=0.0 : ambb=0.0 : difr=0.1 : difg=0.35 : difb=0.1 : specr=0.45 : specg=0.55 : specb=0.45 : shine=0.25
      
    Case #MATERIAL_PREDEF_REDPLASTIC
      ambr=0.0 : ambg=0.0 : ambb=0.0 : difr=0.5 : difg=0.0 : difb=0.0 : specr=0.7 : specg=0.6 : specb=0.6 : shine=0.25
      
    Case #MATERIAL_PREDEF_WHITEPLASTIC
      ambr=0.0 : ambg=0.0 : ambb=0.0 : difr=0.55 : difg=0.55 : difb=0.55 : specr=0.70 : specg=0.70 : specb=0.70 : shine=0.25
      
    Case #MATERIAL_PREDEF_YELLOWPLASTIC
      ambr=0.0 : ambg=0.0 : ambb=0.0 : difr=0.5 : difg=0.5 : difb=0.0 : specr=0.60 : specg=0.60 : specb=0.50 : shine=0.25
      
    Case #MATERIAL_PREDEF_BLACKRUBBER
      ambr=0.02 : ambg=0.02 : ambb=0.02 : difr=0.01 : difg=0.01 : difb=0.01 : specr=0.4 : specg=0.4 : specb=0.4 : shine=0.078125
      
    Case #MATERIAL_PREDEF_CYANRUBBER
      ambr=0.0 : ambg=0.05 : ambb=0.05 : difr=0.4 : difg=0.5 : difb=0.5 : specr=0.04 : specg=0.7 : specb=0.7 : shine=0.078125
      
    Case #MATERIAL_PREDEF_GREENRUBBER
      ambr=0.0 : ambg=0.05 : ambb=0.0 : difr=0.4 : difg=0.5 : difb=0.4 : specr=0.04 : specg=0.7 : specb=0.04 : shine=0.078125
      
    Case #MATERIAL_PREDEF_REDRUBBER
      ambr=0.05 : ambg=0.0 : ambb=0.0 : difr=0.5 : difg=0.4 : difb=0.4 : specr=0.7 : specg=0.04 : specb=0.04 : shine=0.078125
      
    Case #MATERIAL_PREDEF_WHITERUBBER
      ambr=0.05 : ambg=0.05 : ambb=0.05 : difr=0.5 : difg=0.5 : difb=0.5 : specr=0.7 : specg=0.7 : specb=0.7 : shine=0.078125
      
    Case #MATERIAL_PREDEF_YELLOWRUBBER
      ambr=0.05 : ambg=0.05 : ambb=0.0 : difr=0.5 : difg=0.5 : difb=0.4 : specr=0.7 : specg=0.7 : specb=0.04 : shine=0.078125
      
    Default : ProcedureReturn -1
        
  EndSelect
  
  ambr  * 255 
  ambg  * 255 
  ambb  * 255 
  difr  * 255 
  difg  * 255 
  difb  * 255
  specr * 255
  specg * 255
  specb * 255
  shine * 128
  ambin = (0.212671*ambr + 0.715160*ambg + 0.072169*ambb) / (0.212671*difr + 0.715160*difg + 0.072169*difb)
  
  If hTexture = -1
    hTexture = CreateTexture(#PB_Any, TexWidth, TexHeight)
    If IsTexture(hTexture)
      StartDrawing(TextureOutput(hTexture))
      Box(0, 0, TexWidth, TexHeight, RGB(255,255,255))
      ;Box(0, 0, TexWidth, TexHeight, RGB(128,128,128))
      StopDrawing()
    Else
      ProcedureReturn -3
    EndIf
  Else
    If Not IsTexture(hTexture)
      ProcedureReturn -2
    EndIf
  EndIf
  
  hMat = CreateMaterial(#PB_Any, TextureID(hTexture))
  If Not IsMaterial(hMat)
    ProcedureReturn -4
  EndIf
  
  SetMaterialColor(hMat, #PB_Material_AmbientColor, fRGB(ambr, ambg, ambb))
  SetMaterialColor(hMat, #PB_Material_DiffuseColor, fRGB(difr, difg, difb))
  SetMaterialColor(hMat, #PB_Material_SpecularColor, fRGB(specr, specg, specb))
  MaterialShininess(hMat, shine)
  MaterialShadingMode(hmat, #PB_Material_Phong)
  MaterialDepthWrite(hMat, #True)
  ;MaterialFilteringMode(hMat, #PB_Material_Anisotropic, 8)
  
  ProcedureReturn hMat
  
EndProcedure

Procedure CreateBackground()
  Protected.i hTex, hMat, hMesh, hEnt
  Protected.i amb  = RGB(192, 192, 192)
  Protected.i dif  = RGB(32, 32, 32)
  Protected.i spec = RGB(255, 255, 255)
  hTex = CreateTexture(#PB_Any, 128, 128)
  StartDrawing(TextureOutput(hTex))
  Box(0, 0, 64, 64, RGB(32,32,32))
  Box(64, 64, 64, 64, RGB(32,32,32))
  Box(64, 0, 64, 64, RGB(255,255,255))
  Box(0, 64, 64, 64, RGB(255,255,255))
  StopDrawing()
  hMat = CreateMaterial(#PB_Any, TextureID(hTex))
  SetMaterialColor(hMat, #PB_Material_AmbientColor, amb)
  SetMaterialColor(hMat, #PB_Material_DiffuseColor, dif)
  SetMaterialColor(hMat, #PB_Material_SpecularColor, spec)
  MaterialDepthWrite(hMat, #True)
  MaterialFilteringMode(hMat, #PB_Material_Anisotropic, 8)
  hMesh = CreatePlane(#PB_Any, 1024, 1024, 1, 1, 10, 10)
  hEnt = CreateEntity(#PB_Any, MeshID(hMesh), MaterialID(hMat), 0, -500, -1000)
  ScaleEntity(hEnt, 4, 4, 4)
  RotateEntity(hEnt, 45, 0, 0, #PB_Absolute)
EndProcedure

Procedure ChangeMaterial(TypeOfMaterial.i)
  Shared TextureNames()
  Shared hMaterial, hMesh, hEntity
  Protected.i x, y, z
  If IsMaterial(hMaterial)
    FreeMaterial(hMaterial)
  EndIf
  hMaterial = CreatePredefinedMaterial(TypeOfMaterial)
  If IsEntity(hEntity)
    x = EntityPitch(hEntity)
    y = EntityYaw(hEntity)
    z = EntityRoll(hEntity)
    FreeEntity(hEntity)
  EndIf
  hEntity = CreateEntity(#PB_Any, MeshID(hMesh), MaterialID(hMaterial), 0, 0, 0)
  RotateEntity(hEntity, x, y, z);, #PB_Absolute)
  SetWindowTitle(0, "MaterialTest - " + TextureNames(TypeOfMaterial) + " Material")
EndProcedure

Procedure GetTextureNames()
  Shared TextureNames()
  Protected.i n
  Restore TextureNames
  For n = 0 To 24
    Read.s TextureNames(n)
  Next
EndProcedure

Procedure CreateWindowButtons()
  Shared TextureNames()
  Shared WindowBtn()
  Protected.i h, y, n
  h = WindowHeight(0)
  y = h / 25
  Restore TextureNames
  For n = 0 To 23
    WindowBtn(n) = ButtonGadget(#PB_Any, WindowWidth(0)-140, n * y + 5, 130, y-5, TextureNames(n))
  Next
  WindowBtn(24) = ButtonGadget(#PB_Any, WindowWidth(0)-140, 24 * y + 5, 130, y-5, "Close")
EndProcedure

Do(InitEngine3D(), "Can not init 3D Engine")
Do(InitSprite(), "Can not init Sprite")
Do(InitKeyboard(), "Can not init Keyboard")
Do(ExamineDesktops(), "Can not find Desktops")
Do(OpenWindow(0, 0, 0, DesktopWidth(0)/2, DesktopHeight(0)/2, "MaterialTest - EMERALD Material", #PB_Window_ScreenCentered|#PB_Window_SystemMenu), "Can not open window")
Do(OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0)-150, WindowHeight(0), 0, 0, 0, #PB_Screen_SmartSynchronization), "Can not open screen")

GetTextureNames() : CreateWindowButtons()

CreateBackground()

hMaterial = CreatePredefinedMaterial(#MATERIAL_PREDEF_EMERALD)
hMesh     = CreateCylinder(#PB_Any, 300, 500, 32, 1, 0)
hEntity   = CreateEntity(#PB_Any, MeshID(hMesh), MaterialID(hMaterial), 0, 0, 0)

hLight = CreateLight(#PB_Any, RGB(255, 255, 255), 500, 1000, 1000, #PB_Light_Point)
LightLookAt(hLight, 0, 0, 0)

hCamera = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(hCamera, 0, 1000, 1500, #PB_Absolute)
RotateCamera(hCamera, -35, 0, 0)

Repeat
  ; catch all window events
  Repeat
  
    WindowEvt = WindowEvent()
    GadgetEvt = EventGadget()
    
    Select WindowEvt
    
      Case #PB_Event_CloseWindow
        DoLoop = #False
        
      Case #PB_Event_Gadget
        
        Select GadgetEvt
          Case WindowBtn(0)  : ChangeMaterial(#MATERIAL_PREDEF_EMERALD)
          Case WindowBtn(1)  : ChangeMaterial(#MATERIAL_PREDEF_JADE)
          Case WindowBtn(2)  : ChangeMaterial(#MATERIAL_PREDEF_OBSIDIAN)
          Case WindowBtn(3)  : ChangeMaterial(#MATERIAL_PREDEF_PEARL)
          Case WindowBtn(4)  : ChangeMaterial(#MATERIAL_PREDEF_RUBY)
          Case WindowBtn(5)  : ChangeMaterial(#MATERIAL_PREDEF_TURQUOISE)
          Case WindowBtn(6)  : ChangeMaterial(#MATERIAL_PREDEF_BRASS)
          Case WindowBtn(7)  : ChangeMaterial(#MATERIAL_PREDEF_BRONZE)
          Case WindowBtn(8)  : ChangeMaterial(#MATERIAL_PREDEF_CHROME)
          Case WindowBtn(9)  : ChangeMaterial(#MATERIAL_PREDEF_COPPER)
          Case WindowBtn(10) : ChangeMaterial(#MATERIAL_PREDEF_GOLD)
          Case WindowBtn(11) : ChangeMaterial(#MATERIAL_PREDEF_SILVER)
          Case WindowBtn(12) : ChangeMaterial(#MATERIAL_PREDEF_BLACKPLASTIC)
          Case WindowBtn(13) : ChangeMaterial(#MATERIAL_PREDEF_CYANPLASTIC)
          Case WindowBtn(14) : ChangeMaterial(#MATERIAL_PREDEF_GREENPLASTIC)
          Case WindowBtn(15) : ChangeMaterial(#MATERIAL_PREDEF_REDPLASTIC)
          Case WindowBtn(16) : ChangeMaterial(#MATERIAL_PREDEF_WHITEPLASTIC)
          Case WindowBtn(17) : ChangeMaterial(#MATERIAL_PREDEF_YELLOWPLASTIC)
          Case WindowBtn(18) : ChangeMaterial(#MATERIAL_PREDEF_BLACKRUBBER)
          Case WindowBtn(19) : ChangeMaterial(#MATERIAL_PREDEF_CYANRUBBER)
          Case WindowBtn(20) : ChangeMaterial(#MATERIAL_PREDEF_GREENRUBBER)
          Case WindowBtn(21) : ChangeMaterial(#MATERIAL_PREDEF_REDRUBBER)
          Case WindowBtn(22) : ChangeMaterial(#MATERIAL_PREDEF_WHITERUBBER)
          Case WindowBtn(23) : ChangeMaterial(#MATERIAL_PREDEF_YELLOWRUBBER)
          Case WindowBtn(24) : DoLoop = #False
        EndSelect
        
    EndSelect
    
    Delay(1)
    
  Until WindowEvt = 0
  
  ; catch keystrokes
  If ExamineKeyboard()
    
    If KeyboardPushed(#PB_Key_Escape)   ; drücken Sie Esc zum Beenden
      DoLoop = #False
    EndIf

  EndIf
  
  ; rotate cylinder
  If IsEntity(hEntity)
    RotateEntity(hEntity, 1, 1, 0, #PB_Relative)
  EndIf
  
  ; render world
  RenderWorld()
  FlipBuffers() 

Until DoLoop = #False
End

DataSection
  TextureNames:
  Data.s "EMERALD"
  Data.s "JADE"
  Data.s "OBSIDIAN"
  Data.s "PEARL"
  Data.s "RUBY"
  Data.s "TURQUOISE"
  Data.s "BRASS"
  Data.s "BRONZE"
  Data.s "CHROME"
  Data.s "COPPER"
  Data.s "GOLD"
  Data.s "SILVER"
  Data.s "BLACKPLASTIC"
  Data.s "CYANPLASTIC"
  Data.s "GREENPLASTIC"
  Data.s "REDPLASTIC"
  Data.s "WHITEPLASTIC"
  Data.s "YELLOWPLASTIC"
  Data.s "BLACKRUBBER"
  Data.s "CYANRUBBER"
  Data.s "GREENRUBBER"
  Data.s "REDRUBBER"
  Data.s "WHITERUBBER"
  Data.s "YELLOWRUBBER"
  Data.s "QUIT"
EndDataSection
Insgesamt sehen die Farben schon danach aus (der Namen wegen) und gelernt habe ich daraus, das ich mit den Material Scripten das Material beeinflussen kann. Jetzt aber zu den weitergehenden Fragen ist es möglich mit Purebais Mitteln (extreme) Glanzlichtereffekte und ähnliches zu basteln oder ist da das Purebaisc Latein zu ende und ich muss auf Scripte zurück greifen ?

Ich würde z.B. gerne etwas wie Bumpmapping usw. ausprobieren ?!

Wäre nett wenn jemand mir da Tips geben kann.
---
Windows 11 (64 bit)