GetScriptMaterial() et mise à jour du material
Publié : lun. 30/avr./2012 13:53
Salut
Je suis en train de créer un petit éditeur de material, histoire de pouvoir modifier un material et de voir en temps réel les modifications.
Je me suis donc concoter la procedure suivante pour charger mes material :
Et ça marche très bien sur les material pré-chargés.
Mais par contre, si je change un paramètre du material pour le moment avec notepad++, la modification n'est pas effective si je recharge ce material.
J'ai essayé de créer un nouveau material de la manière suivante :
mais là, paf le chien mon objet devient tout noir, quelque soit le material sélectionné..
D'où ma question :
comment puis-je mettre à jour mon *.material ou en charger un qui n'était pas à la base dans le dossier défini par :
Merci beaucoup
.
Voici le code de mon éditeur de material si vous voulez testé directement.
C'est très loin d'être terminé bien entendu
.
Il faudra créer un répertoire : data\texture, dans lequel vous devez mettre une texture à vous, et mettre le nom ici :
EDIT :
il faut dans les options du compilateur :
- menu compilateur
- option du compilateur
- cocher #pb_compile_count
Je suis en train de créer un petit éditeur de material, histoire de pouvoir modifier un material et de voir en temps réel les modifications.
Je me suis donc concoter la procedure suivante pour charger mes material :
Code : Tout sélectionner
Procedure MaterialLoad()
mat$=OpenFileRequester("Get a Material","","*.material",0)
If mat$ <>"" And GetExtensionPart(mat$)="material"
; Parse3DScripts() ; pour essayer d'actualiser le material
mat$=RemoveString(GetFilePart(mat$),".material")
GetScriptMaterial(#material,mat$)
SetEntityMaterial(#Entity,MaterialID(#material))
Else
MessageRequester("Error","Please, select a valid *.material")
EndIf
EndProcedure
Mais par contre, si je change un paramètre du material pour le moment avec notepad++, la modification n'est pas effective si je recharge ce material.
J'ai essayé de créer un nouveau material de la manière suivante :
Code : Tout sélectionner
mat$=OpenFileRequester("Get a Material","","*.material",0)
If mat$ <>"" And GetExtensionPart(mat$)="material"
CreateTexture(#Texture,256,256)
texture = GetScriptTexture(#Texture, mat$)
mat$=RemoveString(GetFilePart(mat$),".material")
;CreateMaterial(#material,TextureID(texture))
GetScriptMaterial(#material,mat$)
SetEntityMaterial(#Entity,MaterialID(#material))
Else
MessageRequester("Error","Please, select a valid *.material")
EndIf
mais là, paf le chien mon objet devient tout noir, quelque soit le material sélectionné..
D'où ma question :
comment puis-je mettre à jour mon *.material ou en charger un qui n'était pas à la base dans le dossier défini par :
Code : Tout sélectionner
Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
Add3DArchive("Data/Material", #PB_3DArchive_FileSystem)
Parse3DScripts()

Voici le code de mon éditeur de material si vous voulez testé directement.
C'est très loin d'être terminé bien entendu

Code : Tout sélectionner
;{ Infos
; Pure Material Editor
; To create and /or modify a *.material and see the result in real time
; a simple viewer of object3D (mesh) and material/shader for PureOgre (ogre in purebasic ^^)
; date : 30 april 2012
; author : blendman
; pb : 4.61b2 win xp x32
;}
;{ constantes, enumeration
; UI
#WindowMain = 0
#statusbar= 0
#MainMenu=0
Enumeration ; gadget window
;{ panel lieft
#PanelLeft
; Material
#MaterialLoad
#TextureInSameDir
#MaterialName
#MaterialCastShadow
; panel Bank
#panelBank
#gadget_bank_List
#gadget_bank_Theme
#gadget_bank_Group
;}
;{ panel right
#PanelRight
#Gadget_WorldShadow
#Gadget_ViewZoom
#cameraLookAt
#Gadget_SizeMesh
;}
EndEnumeration
;{ 3D
#Camera=0
#CameraSpeed = 5
#MeshSphere =0
#Entity=0
#material =0
#texture = 0
Enumeration ; light
#light1
#light2
#light3
EndEnumeration
;}
;}
;{ structures
Structure Stcamera
lookat.a : ViewZoom.a
SizeMesh.a : typeobj.a
EndStructure
Global camera.Stcamera
camera\ViewZoom = 1
camera\SizeMesh = 10
;}
;{ variables
VersionNum.s{6} = StrD(#pb_Editor_CompileCount/10000+0.1) : Version$ = VersionNum
PanelParameterH.w = 400 : PanelTexture.a= 200 : BottomSpace=60
Global PanelParameter.a = 200 ,TopSpace.a = 35
Global ScreenHeight.w,ScreenWidth.w,inscreen.a
;}
;{ declare
Declare Error(message$)
Declare EventKeyboard() : Declare GestionMouse()
Declare ChangeObject(mode=0)
Declare.a Screen3DEvents()
;}
;{ macros
;}
;{ init
If InitEngine3D() = 0 Or InitSprite()=0 Or InitKeyboard()=0 Or InitMouse() = 0
Error("Unable To initialize DirectX")
Else
Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
Add3DArchive("Data/Material", #PB_3DArchive_FileSystem)
Parse3DScripts()
EndIf
;}
;{ window
;{ openWindow
If ExamineDesktops()
ScreenX = DesktopWidth(0) : ScreenY = DesktopHeight(0)-32
ScreenD = DesktopDepth(0) : ScreenF = DesktopFrequency(0)
EndIf
flag= #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_Maximize
If OpenWindow(#WindowMain, 0, 0, ScreenX, ScreenY, "Pure Shader Editor (Version "+Version$+")", flag)=0
Error("Unable To open a Window")
Else
;}
;{ create the menu
If CreateMenu(#MainMenu, WindowID(#WindowMain))
MenuTitle("File"); 0 -> 40
MenuItem(1,"New Material")
MenuBar()
MenuItem(2,"Open Material (.material)")
MenuItem(3,"Import Material")
MenuBar()
MenuItem(4,"Save Material")
MenuItem(5,"Save Material as ...")
MenuBar()
MenuItem(0, "Quit")
MenuTitle("Object");301-> 350
MenuItem(304, "Sphere"+Chr(9)+"(S)")
MenuItem(302, "Cube"+Chr(9)+"(C)")
MenuItem(303, "Plane"+Chr(9)+"(P)")
MenuItem(301, "Load Object"+Chr(9)+"(A)")
MenuItem(305, "Suzanne"+Chr(9)+"(Z)")
MenuBar()
MenuTitle("World");401-> 440
MenuItem(401,"Ambient Color")
MenuTitle("Help");81-> 120
MenuItem(81, "About")
MenuItem(82, "Informations")
EndIf
;}
;{ shortcut
AddKeyboardShortcut(#WindowMain,#PB_Shortcut_A,301)
AddKeyboardShortcut(#WindowMain,#PB_Shortcut_C,302)
AddKeyboardShortcut(#WindowMain,#PB_Shortcut_P,303)
AddKeyboardShortcut(#WindowMain,#PB_Shortcut_S,304)
AddKeyboardShortcut(#WindowMain,#PB_Shortcut_Z,305)
;}
;{ create the status bar
If CreateStatusBar(#statusbar,WindowID(#WindowMain))
AddStatusBarField(50)
AddStatusBarField(200)
AddStatusBarField(400)
EndIf
;}
;{ the gadget
If PanelGadget(#PanelLeft,5,30,PanelParameter+5,PanelParameterH)
AddGadgetItem(#PanelLeft,0,"Material")
CheckBoxGadget(#TextureInSameDir,5,5,130,20,"Same Dir for texture")
ButtonGadget(#MaterialLoad,5,25,60,20,"Load Mat")
AddGadgetItem(#PanelLeft,1,"Texture")
CloseGadgetList()
EndIf
If PanelGadget(#PanelRight,DesktopWidth(0)-5-PanelTexture,30,PanelTexture+5,PanelParameterH)
AddGadgetItem(#PanelRight,0,"Shader")
AddGadgetItem(#PanelRight,1,"Option")
CheckBoxGadget(#cameraLookAt,5,5,140,20,"Camera Look At Object")
SpinGadget(#Gadget_ViewZoom,5,25,30,20,1,500,#PB_Spin_Numeric)
GadgetToolTip(#Gadget_ViewZoom,"View Zoom")
SetGadgetState(#Gadget_ViewZoom,camera\ViewZoom)
SpinGadget(#Gadget_SizeMesh,5,50,30,20,1,500,#PB_Spin_Numeric)
GadgetToolTip(#Gadget_SizeMesh,"Size of the Mesh")
SetGadgetState(#Gadget_SizeMesh,camera\SizeMesh)
CloseGadgetList()
EndIf
;}
;{ open a screen
ScreenWidth = ScreenX - PanelParameter - PanelTexture -30
ScreenHeight = ScreenY - MenuHeight() - StatusBarHeight(#statusbar)-TopSpace-BottomSpace
If OpenWindowedScreen(WindowID(#WindowMain),PanelParameter+15, TopSpace, ScreenWidth, ScreenHeight, 0, 0, 0)=0
Error("Unable To open a Screen")
EndIf
;}
;{ others things
ShowCursor_(1) ; window only
;}
EndIf
;{ engine 3D - world, camera.
;{ world
AmbientColor(RGB(80,80,80))
;}.
;{ camera
CreateCamera(#Camera, 0, 0, 100, 100)
CameraLocate(#Camera, 70, 100, 230)
RotateCamera(#Camera, -15, 15, -100)
CameraLookAt(#camera,0,0,0)
CameraBackColor(#Camera, RGB(125,125,125))
;}
;{ entity to test the shader/material
LoadTexture(#Texture,"PERLREFL.JPG")
CreateMaterial(#material,TextureID(#texture))
ChangeObject()
;}
;{ light
CreateLight(#light1,RGB(255,255,255),50,0,0)
LightSpecularColor(#light1,RGB(255,255,255))
;}
;}
;}
;{ loop
Repeat
quit = Screen3DEvents()
;{ keyboard
EventKeyboard()
If KeyboardReleased(#PB_Any)
MouseX=0
MouseY=0
KeyX = 0
KeyZ = 0
KeyY = 0
EndIf
If KeyboardPushed(#PB_Key_Right)
RotateEntity(#entity,0,1,0,#PB_Relative)
EndIf
If KeyboardPushed(#PB_Key_Left)
RotateEntity(#entity,0,-1,0,#PB_Relative)
EndIf
If KeyboardPushed(#PB_Key_Up)
RotateEntity(#entity,0,0,1,#PB_Relative)
EndIf
If KeyboardPushed(#PB_Key_Down)
RotateEntity(#entity,0,0,-1,#PB_Relative)
EndIf
;}
;{ mouse
If ExamineMouse()
If Not KeyboardPushed(#PB_Key_LeftShift) ;And KeyboardPushed(#PB_Key_LeftAlt))
If KeyboardPushed(#PB_Key_LeftAlt)
If MouseButton(#PB_MouseButton_Left)
MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
Else
MouseX = 0
MouseY = 0
EndIf
KeyZ = -MouseWheel()*#CameraSpeed * camera\ViewZoom
EndIf
KeyZ = -MouseWheel()*#CameraSpeed * camera\ViewZoom
Else
If MouseButton(#PB_MouseButton_Left)
KeyY = MouseDeltaY() * #CameraSpeed * 0.4
KeyX = -MouseDeltaX() * #CameraSpeed * 0.4
Else
KeyY = 0
KeyX = 0
EndIf
KeyZ = -MouseWheel()*#CameraSpeed * camera\ViewZoom
EndIf
EndIf
;}
;{ update the scene
If camera\lookat=1 And IsEntity(#entity)
MoveCamera (#Camera, KeyX, KeyY, KeyZ)
CameraLookAt(#Camera,EntityX(#entity),EntityY(#entity),EntityZ(#entity))
Else
RotateCamera(#Camera, MouseY, MouseX, 0,#PB_Relative)
MoveCamera (#Camera, KeyX, KeyY, KeyZ)
EndIf
RenderWorld()
FlipBuffers()
;}
GestionMouse()
Until quit = 1
;}
;{ procedures
Procedure Error(message$)
MessageRequester("Error",message$,1)
End
EndProcedure
;{ keyboard
Procedure EventKeyboard()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
End
EndIf
EndProcedure
;}
;{ mouse
Procedure GestionMouse()
If inscreen = 1
If (MouseX()<2 XOr MouseX()>(ScreenWidth-14)) Or (MouseY()>ScreenHeight-4 XOr MouseY()<1+TopSpace)
inscreen = 0 ; on n'est plus dans l'écran
ReleaseMouse(1); on libère la souris pour les menus
EndIf
Else
mx = WindowMouseX(0)-PanelParameter-10 : my = WindowMouseY(0)-TopSpace-3
If (mx>PanelParameter+10 And mx <ScreenWidth-14 And my>3+TopSpace And my<ScreenHeight-4)
ReleaseMouse(0) ; on est dans la vue 3D
MouseLocate(mx,my)
EndIf
inscreen = 1
EndIf
StatusBarText(#StatusBar,1, Str(WindowMouseX(0))+"/"+Str(WindowMouseY(0))+" - "+Str(MouseX())+"/"+Str(MouseY()))
StatusBarText(#StatusBar,2, "Triangles : "+Str(CountRenderedTriangles()))
EndProcedure
;}
;{ 3D world
Procedure ChangeObject(mode=0)
FreeMesh(#MeshSphere)
FreeEntity(#Entity)
Select mode
Case 0
CreateSphere(#MeshSphere,10,32,32)
CreateEntity(#Entity,MeshID(#MeshSphere),#PB_Material_None)
ScaleEntity(#entity,3,3,3)
EntityLocate(#Entity,0,0,0)
Case 1
CreateCube(#MeshSphere,15)
CreateEntity(#Entity,MeshID(#MeshSphere),#PB_Material_None)
ScaleEntity(#entity,3,3,3)
EntityLocate(#Entity,0,0,0)
Case 2
CreatePlane(#MeshSphere,10,10,10,10,1,1)
CreateEntity(#Entity,MeshID(#MeshSphere),#PB_Material_None)
ScaleEntity(#entity,8,8,8)
RotateEntity(#entity,90,0,0)
EntityLocate(#Entity,0,0,0)
Case 3 ; suzanne
LoadMesh(#MeshSphere,"Suzanne.mesh")
CreateEntity(#Entity,MeshID(#MeshSphere),#PB_Material_None)
ScaleEntity(#entity,30,30,30)
EntityLocate(#Entity,0,0,0)
Case 4 ; our object
mesh$=OpenFileRequester("Open Your Mesh","","*.mesh",0)
If mesh$ <>"" And GetExtensionPart(mesh$)="mesh"
mesh$=GetFilePart(mesh$)
If LoadMesh(#MeshSphere,mesh$)
CreateEntity(#Entity,MeshID(#MeshSphere),#PB_Material_None)
ScaleEntity(#entity,camera\SizeMesh,camera\SizeMesh,camera\SizeMesh)
EntityLocate(#Entity,0,0,0)
Else
MessageRequester("Error","Your File must to be a valid *.mesh.")
EndIf
EndIf
EndSelect
EndProcedure
Procedure MaterialLoad()
; Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
; Add3DArchive("Data/Material", #PB_3DArchive_FileSystem)
; Parse3DScripts()
mat$=OpenFileRequester("Get a Material","","*.material",0)
If mat$ <>"" And GetExtensionPart(mat$)="material"
mat$=RemoveString(GetFilePart(mat$),".material")
GetScriptMaterial(#material,mat$)
SetEntityMaterial(#Entity,MaterialID(#material))
Else
MessageRequester("Error","Please, select a valid *.material")
EndIf
EndProcedure
;}
Procedure.a Screen3DEvents()
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_Menu
Select EventMenu()
Case 301 ; load object
camera\typeObj = 4
ChangeObject(4)
Case 302 ; cube
camera\typeObj = 1
ChangeObject(1)
Case 303 ; plane
camera\typeObj = 2
ChangeObject(2)
Case 304 ; sphere
camera\typeObj = 0
ChangeObject(0)
Case 305 ; suzanne blender
camera\typeObj = 3
ChangeObject(3)
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
;{ panel left
Case #MaterialLoad
MaterialLoad()
;}
Case #cameraLookAt
camera\lookat = 1-camera\lookat
Case #Gadget_ViewZoom
camera\ViewZoom = GetGadgetState(#Gadget_ViewZoom)
Case #Gadget_SizeMesh
camera\SizeMesh = GetGadgetState(#Gadget_SizeMesh)
ResizeEntity(#entity,camera\SizeMesh,camera\SizeMesh,camera\SizeMesh)
EndSelect
Case #PB_Event_CloseWindow
Quit = 1
EndSelect
If Quit = 1 : ProcedureReturn Quit : EndIf ; Quit the app immediately
Until Event = 0
EndProcedure
;}
Code : Tout sélectionner
;{ entity to test the shader/material
LoadTexture(#Texture,"PERLREFL.JPG") ; -> changer le nom avec votre image ici.
CreateMaterial(#material,TextureID(#texture))
EDIT :
il faut dans les options du compilateur :
- menu compilateur
- option du compilateur
- cocher #pb_compile_count