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
Ich würde z.B. gerne etwas wie Bumpmapping usw. ausprobieren ?!
Wäre nett wenn jemand mir da Tips geben kann.