Editeur de Scène 3D (ou 3Dmap Editor)

Généralités sur la programmation 3D
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Editeur de Scène 3D (ou 3Dmap Editor)

Message par blendman »

StrombreTrooper : merci ;) D'ailleurs, je suis en traind e retravailler l'éditeur 2D de 3Arks en même temps, car j'ai vu une vidéo d'un éditeur de map/gameplay qui était pas mal du tout, et ça m'a donné des idées pour faciliter la création de map et l'ajout de gameplay (2D ou 3D).
Donc, je bosse sur les 2 en parallèle (je fais des copier-coller ^^)
G-Rom a écrit :le problème est interne à ogre , de mémoire, j'avais le même soucis quand je codais mon propre moteur avec les objets & l'alpha , la seule solution pour moi était de trier les objets à rendre , faire un rendu des objets alpha en dernier.
Dans ton cas , ce n'est pas possible , tu n'as pas de contrôle la dessus
ah mince.
la seule solution c'est de faire un pixel lighting via un shader ( me demande pas comment , je me suis pas encore penché dessus )
ah et pourquoi ça résolverait le problème (je n'y connais rien en pixel lighting ^^).
Par contre, j'ai vu qu'il y avait des paramètres d'alpha, comme

Code : Tout sélectionner

alpha_rejection greater 5
Si j'ajoute ça , en désactivant les ombres portées sur la plante, ça fonctionne à peu près (sur la scène avec la maison) :)

et de désactivé les shadows d'ogre de base qui ne sont pas terrible.
on peut mettre d'autres ombres en ogre, via un shader ? (je pense que oui, mais je ne sais pas encore comment on fait ça ^^).
En tout cas, on voit qu'on peut faire des choses en purebasic avec la 3D, mais qu'il faudrait que plus d'utilisateurs s'y mettent, ça permettrait d'avoir plus d'exemples intéressants.

Je ne comprends pas pourquoi il y a tellement peu d'utilisateurs qui se servent de purebasic en 3D, peut être est-ce la concurrence avec dbpro ou unity.

Au fait, tu sais s'il est prévu d'ajouter 2 options aux lights : power et atténuation ?
car ce serait vraiment pratique et ça manque un peu ^^ (à moins qu'on puisse le faire, mais je n'ai pas trouvé).
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Editeur de Scène 3D (ou 3Dmap Editor)

Message par G-Rom »

de mémoire , pour les lights j'ai déjà ajouté ces fonctions , regarde dans les exemples , il me semble que comtois en a fait un.
les ombres de bases sont des "volumes 3D" , l'ombre est faites via la géométrie de l'objet. c'est rapide , mais pas terrible...
le top c'est le pixel lighting , via un shader. il faut rajouté une passe à tout les matériaux pour prendre en compte le shader.

Pass 1 : Affichage de la texture ( diffuse color )
Pass 2 : Application du shader sur le diffuse color

j'ai dégrossi , mais le principe est là.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Editeur de Scène 3D (ou 3Dmap Editor)

Message par blendman »

G-Rom a écrit :de mémoire , pour les lights j'ai déjà ajouté ces fonctions , regarde dans les exemples , il me semble que comtois en a fait un.
J'ai regardé mais je n'ai rien trouvé.
Cela dit, je parlai pour tous les types de light car je sais que pour le spot, on peut régler le range, mais pour les 2 autres on peut régler l'atténuation et l'intensité ?
les ombres de bases sont des "volumes 3D" , l'ombre est faites via la géométrie de l'objet. c'est rapide , mais pas terrible...
J'avais effectivement vu ça, avec le mode wireframe, on voit la projection :).
le top c'est le pixel lighting , via un shader. il faut rajouté une passe à tout les matériaux pour prendre en compte le shader.

Pass 1 : Affichage de la texture ( diffuse color )
Pass 2 : Application du shader sur le diffuse color

j'ai dégrossi , mais le principe est là.
ok, bon, ben je vais essayer de trouvé ça sur le forum d'ogre.
c'est la même chose que le shadow mapping ou rien à voir ?

En tout cas, si j'arrive à trouer un exemple, ça va être sympa (mais bon, j'ai des doutes d'y parvenir ^^).
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Editeur de Scène 3D (ou 3Dmap Editor)

Message par blendman »

salut

J'ai pas mal modifié mon level editor 2D (pour les jeux Arkeos et 3Arks) et j'en ai profité pour ajouté dans l'éditeur 3D (celui-ci) le même genre de fonctions :
- treegadget (pour le rangement et la sélection des objets, ainsi qu'un début de gestion de drag&drop)
- une sorte de property box qui s'affiche par type d'élément sélectionné.
- ajout d'une toolbar (avec la lib toolbar plus) pour avoir des options plus facilement accessibles.

Pour ceux que ça intéressent, voici le code simplifié du treegadget/propertybox :

Code : Tout sélectionner

;{ Treegadget : for leveleditor  2D ou 3D (or other)
; - with sort of Property box
; - creation of objects /assets
; - edition of properties
; date : 15/05/2012
; pb : 4.60 +
; dev : blendman
; For the games 3arks / Arkeos
;}

;{ constantes 
#win = 0
#PanelSceneWidth = 180
#PanelPropertyWidth = 190

#StatusBar = 0

#fileSave = 0
#fileOpen = 1

Enumeration ; menu
  #MenuMain
  #Menupopup1
  #Menupopup2
EndEnumeration
Enumeration ; images
  ; icones for treegadgets
  #Assets
  #pnj
  #LightDyn
  #Lightstatic  
  #Effects
  #Action
  #Fontain
  #Drop
  #FX
  #Obj_Block
  #Obj_Move
  #Obj_Destroy
  #Camera
  ; other
  #file =50
  #lightcolordif
  #lightcolorspec
EndEnumeration
Enumeration ; gadget
  ; layout - outliner / scene
  #PanelTreeGadget
  #Treegadget_Scene
  #Drop_Private
  
  ; property box - general
  #PanelProperty 
  #Property_Frame1
  #Property_Frame2
  #Property_Frame3
  #Property_Frame4
  #Property_Frame5
  #Property_Frame6
  #Property_Frame7
  ; the objets properties 
  #Property_Name
  #Property_PosX
  #Property_PosY
  #Property_PosZ
  #Property_RotX
  #Property_RotY
  #Property_RotZ
  #Property_ScaleX
  #Property_ScaleY
  #Property_ScaleZ
  #Prop_CastShado
  
  ; object editor property
  #property_id
  #Property_cb_freeze  
  #Property_cb_hide
  #Property_comb_lookTo
  #Property_sg_LookTo
  #Property_btn_LookTo
  ; light property
  #Prop_ColDif_img
  #Prop_ColDif_btn
  #Prop_ColSpec_img
  #Prop_ColSpec_btn
  #Prop_LightType_ccb
EndEnumeration
;}

;{ structure
Structure StVector3
  x.w : y.w : z.w
EndStructure

Structure StAsset ; les objets 3D de base (décors, arbres..)
  ;{ general
  names$ : type.a
  ;}
  ;{ 2D
  sprite.w
  ;}  
  ;{ 3D mesh, material 
  meshname$ : meshId.w
  material$ : matId.w
  ;}
  ;{ transformation
  dimension.StVector3
  pos.StVector3
  rot.StVector3
  scale.StVector3
  ;}
  ;{ editor
  block.a : hide.a : lookTo.a
  id.w
  ;}
  ;{ motion  
  ;}
  ;{ light
  colDif.i : colSpec.i
  ;}
EndStructure
Global NewList Asset.stAsset()

Structure StLevel
  ; 3D
  NbMesh.w
  NbMaterial.w  
  NbLight.w
  ; 2D
  NbSprite.w
  ; other
  NbEntity.w
EndStructure
Global Level.Stlevel

Structure StSceneTree
  name$
EndStructure
Global Dim SceneTree.StSceneTree(12)
;}

;{ procedures new panel

Procedure AddPanelItem()
  OpenGadgetList(#PanelProperty)
  AddGadgetItem(#PanelProperty,0,"Properties")
  AddGadgetItem(#PanelProperty,1,"Options")
EndProcedure

; macros
Macro SetGadget(gadget,h,chp,val,valmax)
  For i=0 To 2
    SpinGadget(gadget+i,10+i*(3+(w-16)/3),h,(w-16)/3,20,val,valmax,#PB_Spin_Numeric)
  Next i
  SetGadgetText(gadget,Str(asset()\chp\x))
  SetGadgetText(gadget+1,Str(asset()\chp\y))
  SetGadgetText(gadget+2,Str(asset()\chp\z))     
EndMacro

; drag & drop (not used)
Procedure TreeDrag()
  item = GetGadgetState(#Treegadget_Scene)
  If GetGadgetItemAttribute(#Treegadget_Scene,item,#PB_Tree_SubLevel)>0
    DragPrivate(#Drop_Private, #PB_Drag_Move)  
  EndIf  
EndProcedure
Procedure TreeDrop()
   item = GetGadgetState(#Treegadget_Scene)
  If GetGadgetItemAttribute(#Treegadget_Scene,item,#PB_Tree_SubLevel)>0
    sText.s = GetGadgetItemText(#Treegadget_Scene, sItem)
    Text.s = GetGadgetItemText(#Treegadget_Scene, Item)
    SetGadgetItemText(#Treegadget_Scene, sItem, Text)
    SetGadgetItemText(#Treegadget_Scene, Item, sText)         
  EndIf  
EndProcedure
; property
Procedure PropertyBox(type=0)
  item = GetGadgetState(#Treegadget_Scene)
  If GetGadgetItemAttribute(#Treegadget_Scene,item,#PB_Tree_SubLevel)>0
    ClearGadgetItems(#PanelProperty)
    w = #PanelPropertyWidth-20
    AddPanelItem() 
    OpenGadgetList(#PanelProperty,0)
    With asset()
      Frame3DGadget(#Property_Frame1,5,5,w,40,"General")
      StringGadget(#Property_Name,10,20,w-10,20,\names$)
      Frame3DGadget(#Property_Frame2,5,60,w,40,"Position")
      SetGadget(#Property_PosX,75,pos,-10000,10000)
      dee = 100
      ; on ajoute les generalité
      Select \type 
        Case 0,1,6,7,9,10,11,12
          Frame3DGadget(#Property_Frame3,5,100,w,40,"Rotation")
          SetGadget(#Property_RotX,115,rot,-180,180)
          Frame3DGadget(#Property_Frame4,5,140,w,40,"Scale")
          SetGadget(#Property_ScaleX,155,scale,1,1000)          
          dee = 190
          Frame3DGadget(#Property_Frame6,5,dee,w,100,"Editor")
          CheckBoxGadget(#property_cb_freeze,10,dee+15,50,15,"Freeze")
          CheckBoxGadget(#property_cb_hide,70,dee+15,40,15,"Hide")
          TextGadget(#property_id,120,dee+15,40,15,"ID : "+Str(Asset()\id),#PB_Text_Center)
          SetGadgetColor(#property_id,2,$E6E6E6)
          DisableGadget(#property_id,1)
          ComboBoxGadget(#property_comb_lookTo,10,dee+35,60,20)
          GadgetToolTip(#property_comb_lookTo,"Object Look at...")
          AddGadgetItem(#property_comb_lookTo,-1,"Object")
          AddGadgetItem(#property_comb_lookTo,-1,"Player")
          AddGadgetItem(#property_comb_lookTo,-1,"Camera")
          StringGadget(#Property_sg_LookTo,75,dee+35,70,20,"")
          GadgetToolTip(#Property_sg_LookTo,"The Cible of the 'look at'..")
          ButtonGadget(#Property_btn_LookTo,150,dee+35,20,20,"...")
          dee+110
          Frame3DGadget(#Property_Frame5,5,dee,w,50,"Properties")
          CheckBoxGadget(#Prop_CastShado,10,dee+15,w-10,20,"Cast Shadow")
          dee +120          
      EndSelect
      
      Select type
        Case 0 ; assets          
          Frame3DGadget(#Property_Frame7,5,dee,w,50,"Motion")
          
        Case 1 ; pnj
          
        Case 2 ; light dynamic 
          dee+10
          Frame3DGadget(#Property_Frame3,5,dee,w,100,"Editor")
          CheckBoxGadget(#property_cb_freeze,10,dee+15,50,15,"Freeze")
          CheckBoxGadget(#property_cb_hide,70,dee+15,50,15,"Hide")
          TextGadget(#property_id,120,dee+15,40,15,"ID : "+Str(Asset()\id),#PB_Text_Center)
          SetGadgetColor(#property_id,2,$E6E6E6)
          DisableGadget(#property_id,1)
          ComboBoxGadget(#property_comb_lookTo,10,dee+35,60,20)
          GadgetToolTip(#property_comb_lookTo,"Object Look To...")
          AddGadgetItem(#property_comb_lookTo,-1,"Object")
          AddGadgetItem(#property_comb_lookTo,-1,"Player")
          AddGadgetItem(#property_comb_lookTo,-1,"Camera")
          StringGadget(#Property_sg_LookTo,75,dee+35,70,20,"")
          ButtonGadget(#Property_btn_LookTo,150,dee+35,20,20,"...")
          dee +110
          Frame3DGadget(#Property_Frame4,5,dee,w,80,"Properties")
          StartDrawing(ImageOutput(#lightcolordif))
          Box(0,0,15,15,asset()\colDif)
          StopDrawing()
          ImageGadget(#Prop_ColDif_img,15,dee+17,15,15,ImageID(#lightcolordif))
          GadgetToolTip(#Prop_ColDif_img,"Diffuse Color of the light")
          ButtonGadget(#Prop_ColDif_btn,35,dee+15,20,20,"...")
          StartDrawing(ImageOutput(#lightcolordif))
          Box(0,0,15,15,asset()\colSpec)
          StopDrawing()
          ImageGadget(#Prop_ColSpec_img,65,dee+17,15,15,ImageID(#lightcolorspec))
          GadgetToolTip(#Prop_ColSpec_img,"Specular Color of the ight")
          ButtonGadget(#Prop_ColSpec_btn,85,dee+15,20,20,"...")
          CheckBoxGadget(#Prop_CastShado,110,dee+15,55,20,"Shadow")
          
          ComboBoxGadget(#Prop_LightType_ccb,15,dee+40,w-60,20)
          AddGadgetItem(#Prop_LightType_ccb,0,"Point Light")
          AddGadgetItem(#Prop_LightType_ccb,1,"Directionnal Light")
          AddGadgetItem(#Prop_LightType_ccb,2,"Spot Light")
          SetGadgetState(#Prop_LightType_ccb,0)
          
        Case 3 ; lights static
          Frame3DGadget(#Property_Frame4,5,120,130,50,"Properties")
          
        Case 4 ;effects
          
        Case 5;actions
          
        Case 6;fontain
          
        Case 7 ;Drop
          
        Case 8 ;Fx
          
        Case 9 ;Obj block
          
        Case 10 ;Obj move
          
        Case 11 ;Obj destroy
          
        Case 12 ;camera
          FreeGadget(#Property_Frame5)
          FreeGadget(#Prop_CastShado)
          
      EndSelect
    EndWith
  EndIf
EndProcedure
Procedure UpdateTreeGadget()
  ClearGadgetItems(#Treegadget_Scene)
  pos = GetGadgetState(#Treegadget_Scene)
  For i = 0 To ArraySize(SceneTree())
    If IsImage(i)
      AddGadgetItem (#Treegadget_Scene, -1, SceneTree(i)\name$, ImageID(i),0) 
    Else
      AddGadgetItem (#Treegadget_Scene, -1, SceneTree(i)\name$, ImageID(#Assets),0) 
    EndIf    
    ForEach Asset()
      If asset()\type = i      
        AddGadgetItem(#Treegadget_Scene, pos, asset()\names$, ImageID(asset()\type), 1) 
        SetGadgetItemData(#Treegadget_Scene,CountGadgetItems(#Treegadget_Scene)-1,-1)
      EndIf    
    Next 
  Next i
EndProcedure
Procedure CheckProperty(nom$)
  ForEach Asset()
    If Asset()\names$ = nom$
      PropertyBox(Asset()\type)
      Break
    EndIf    
  Next  
EndProcedure
Procedure AddAsset(name$="",x=0,y=0,z=0,type=0)
  Level\NbEntity+1
  AddElement(asset())  
  With Asset()
    \names$ = name$
    \pos\x = x
    \pos\y = y
    \pos\z = z
    \id = Level\NbEntity
    \type = type
    If \type = 2 Or \type = 3 ; light
      \colDif = Random(#White)
      \colSpec = Random(#White)
    EndIf    
  EndWith  
EndProcedure


; open save, scene
Procedure OpenScene()
  file$=OpenFileRequester("Open","","(*.ale)|*.ale",0)
  If file$ <>""
    ; read you own format, here
    If OpenFile(#fileOpen,file$)
      ClearList(asset())
      While Eof(#fileOpen)=0
        a$=ReadString(#fileOpen)        
        obj$ = StringField(a$,1,"|")
        compt= CountString (a$,"|")
        If compt > 0
          AddElement(Asset())
          With Asset()         
            ; the parameters which are for all objects
            \names$ = StringField(a$,2,"|")
            \pos\x = Val(StringField(a$,3,"|")) 
            \pos\y = Val(StringField(a$,4,"|")) 
            \pos\z = Val(StringField(a$,5,"|")) 
            Select obj$            
              Case "obj"            
                \type = 0               
              Case "npc"
                \type = 1 
              Case "light_dyn"
                \type = 2 
              Case "camera"
                \type = 12
                ; add the other case  here...            
            EndSelect 
            
          EndWith 
        EndIf
      Wend
      CloseFile(#fileOpen)
      UpdateTreeGadget()
    EndIf
  EndIf  
EndProcedure
Procedure SaveScene()
  file$=OpenFileRequester("Open","","(*.ale)|*.ale",0)
  If file$ <>""
    file$ = RemoveString(file$,".ale")+".ale"
    ; save your own format here
    If OpenFile(#fileSave,file$)
      WriteStringN(#fileSave,"Created with the 3Arks/Arkeos Level Editor, by Blendman 2012")
      ForEach Asset()
        With asset()
          Select \type
            Case 0 ; assets, object normal
              param$ = "obj|"+\names$+"|"+Str(\pos\x)+"|"+Str(\pos\y)+"|"+Str(\pos\z)+"|"; etc....
              WriteStringN(#fileSave, param$)
            Case 1 ; NPC (pnj)
              param$ = "npc|"+\names$+"|"+Str(\pos\x)+"|"+Str(\pos\y)+"|"+Str(\pos\z)+"|"; etc....
              WriteStringN(#fileSave, param$)
            Case 2 ; light dyn
              param$ = "light_dyn|"+\names$+"|"+Str(\pos\x)+"|"+Str(\pos\y)+"|"+Str(\pos\z)+"|"; etc....
              WriteStringN(#fileSave, param$)
              ; case 3 , case 4,  etc....
            Case 12 ; camera
              param$ = "camera|"+\names$+"|"+Str(\pos\x)+"|"+Str(\pos\y)+"|"+Str(\pos\z)+"|"; etc....
              WriteStringN(#fileSave, param$)
          EndSelect
        EndWith      
      Next
      CloseFile(#fileSave)
    EndIf
  EndIf
EndProcedure
; drawing screen
Procedure DrawScreen()
  Start3D()
  ForEach Asset()
    DisplaySprite3D(asset()\sprite,Asset()\pos\x,Asset()\pos\y)
  Next 
  Stop3D()
EndProcedure

;}

;{ open widnows
;{ init
ExamineDesktops()
winW = DesktopWidth(0)
winH = DesktopHeight(0)-32
InitSprite() : InitSprite3D()
;}
flag = #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_Maximize|#PB_Window_MinimizeGadget
If OpenWindow(#win, 0, 0, winW, WinH, "Arkeos Level Editor", flag) 
  ;{ images
  UsePNGImageDecoder()
  ; icones
  ;{ catch
  CatchImage(#Assets,?ImgAsset)
  CatchImage(#PNJ,?ImgPnj)
  CatchImage(#LightDyn,?ImgLightDyn)
  CatchImage(#Lightstatic,?ImgLightStat)
  CatchImage(#action,?ImgAction)
  CatchImage(#Effects,?ImgEffects)
  CatchImage(#Drop,?ImgDrop)
  CatchImage(#Obj_Move,?ImgObj_Move)
  CatchImage(#Obj_Block,?ImgObj_Block)
  CatchImage(#Obj_Destroy,?ImgObj_Destroy)
  CatchImage(#Camera,?ImgCamera)
  CatchImage(#Fontain,?ImgFontain)
  CatchImage(#FX,?ImgFX)
  ;}
  ;{ images
  ;LoadImage(#Assets,"assets.ico")
  ;LoadImage(#PNJ,"pnj.ico")
  ;LoadImage(#LightDyn,"light.png")
  ;LoadImage(#Lightstatic,"lightstat.ico")
  ;LoadImage(#action,"actions.ico")
  ;LoadImage(#Effects,"effects.ico")
  ;LoadImage(#Drop,"drop.ico")
  ;LoadImage(#Obj_Move,"obj_move.ico")
  ;LoadImage(#Obj_Block,"obj_block.ico")
  ;LoadImage(#Obj_Destroy,"obj_destroy.ico")
  ;LoadImage(#Camera,"camera.ico")
  ;LoadImage(#Fontain,"fontain.ico")
  ;LoadImage(#FX,"fx.ico")
  ;}
  ; image for property
  CreateImage(#lightcolordif,15,15)
  CreateImage(#lightcolorspec,15,15)
  ;}
  ;{ menu
  CreateImageMenu(#MenuMain,WindowID(0),#PB_Menu_ModernLook)
  MenuTitle("File") ;0->20
  MenuItem(0,"New"+Chr(9)+"Ctrl+N")
  MenuBar()
  MenuItem(1,"Open"+Chr(9)+"Ctrl+O")
  MenuItem(2,"Save"+Chr(9)+"Ctrl+S")
  MenuBar()
  MenuItem(3,"Exit"+Chr(9)+"Esc")
  
  MenuTitle("Object")
  MenuItem(100,"Assets",ImageID(#Assets))
  MenuItem(101,"PNJ",ImageID(#PNJ))  
  MenuBar()
  MenuItem(102,"Light Dyn",ImageID(#LightDyn))
  MenuItem(103,"Light Stat",ImageID(#Lightstatic))  
  MenuBar()
  MenuItem(104,"Effects",ImageID(#Effects))
  MenuItem(108,"Fx",ImageID(#FX))
  MenuBar()
  MenuItem(105,"Add Actions",ImageID(#action))
  MenuItem(106,"Add Fontain",ImageID(#Fontain))
  MenuItem(107,"Add Drop",ImageID(#Drop))
  MenuBar()
  MenuItem(109,"Add Object Blocking",ImageID(#Obj_Block))
  MenuItem(110,"Add Object To Move",ImageID(#Obj_Move))
  MenuItem(111,"Add Object to destroy",ImageID(#Obj_Destroy))
  MenuBar()
  MenuItem(112,"Add Camera",ImageID(#Camera))
  MenuTitle("Edit"); 21-> 40
  MenuTitle("Help") ; 60->70
  MenuItem(60,"Preferences")
  MenuBar()
  MenuItem(61,"Help")
  MenuItem(62,"About")
  ;}
  ;{ status bar
  CreateStatusBar(#StatusBar,WindowID(#win))
  AddStatusBarField(200)
  AddStatusBarField(300)
  AddStatusBarField(300)
  ;}
  ;{ toolbar
  ;CreateToolBar(0,WindowID(#win))
  ;ToolBarStandardButton(0,#PB_ToolBarIcon_Open)
  ;}  
  ;{ gadgets
  If PanelGadget(#PanelTreeGadget, 5, 0, #PanelSceneWidth, winH-60-StatusBarHeight(#StatusBar))
    AddGadgetItem(#PanelTreeGadget,0,"Scene")    
    TreeGadget(#Treegadget_Scene, 5, 5, #PanelSceneWidth-20, winH-60-StatusBarHeight(#StatusBar)-400); , #PB_Tree_CheckBoxes)
    AddGadgetItem(#PanelTreeGadget,1,"Bank")
    CloseGadgetList()
    
    EnableGadgetDrop( #Treegadget_Scene, #PB_Drop_Private, #PB_Drag_Move, #Drop_Private )

  EndIf
  If OpenPreferences("preferences.ini")
    n = ReadPreferenceInteger("nb",12)
    ReDim SceneTree(n)
    Restore SceneTree
    For i = 0 To n    
      Read.s nom$
      SceneTree(i)\name$ = ReadPreferenceString("element"+Str(i),nom$)
    Next i      
    ClosePreferences()
  Else
    Restore SceneTree
    For i = 0 To 12     
      Read.s SceneTree(i)\name$
    Next i      
  EndIf    
  UpdateTreeGadget()  
  If PanelGadget(#PanelProperty,winW-#PanelPropertyWidth-5,10,#PanelPropertyWidth,winH-60-StatusBarHeight(#StatusBar))
    AddPanelItem()
  EndIf
  ;}
  ;{ shortcut
  AddKeyboardShortcut(#win,#PB_Shortcut_N|#PB_Shortcut_Control,0)
  AddKeyboardShortcut(#win,#PB_Shortcut_O|#PB_Shortcut_Control,1)
  AddKeyboardShortcut(#win,#PB_Shortcut_S|#PB_Shortcut_Control,2)
  AddKeyboardShortcut(#win,#PB_Shortcut_Escape,3)
  ;}  
  ;{ init gadget
  AddAsset("Tree01",54,68)
  AddAsset("house01",Random(2000),Random(2000))
  AddAsset("Plant01",Random(2000),Random(2000))
  AddAsset("Tree02",Random(2000),Random(2000))
  AddAsset("Plant02",Random(2000),Random(2000))
  AddAsset("Plant03",Random(2000),Random(2000))
  AddAsset("Plant04",Random(2000),Random(2000))
  
  AddAsset("Roberto",64,89,0,1)
  AddAsset("CameraMain",200,400,300,12)
  AddAsset("Light01",50,300,250,2)
  
  UpdateTreeGadget()
  ;}
  ;{ menu popup 1
  CreatePopupImageMenu(#Menupopup1)
  MenuItem(99,"Add Object")
  MenuBar()
  For i = 0 To ArraySize(SceneTree())
    MenuItem(100+i,SceneTree(i)\name$,ImageID(i))
  Next i
  ;}
  ;{ add screen
  ScreenW = winW - #PanelSceneWidth - #PanelPropertyWidth -20
  ScreenH = winH - 85  
  If OpenWindowedScreen(WindowID(#win),#PanelSceneWidth+10,10,ScreenW,ScreenH,0,0,80)
  EndIf
  ;}
  ;}
  
;{ loop 
  Repeat 
  ;{ event (gadget, menu..)
    Repeat 
      event = WaitWindowEvent() 
      
      Select event
          
        Case #PB_Event_CloseWindow
          If GetActiveWindow() = #win
            quit =1
          EndIf
          
        Case #PB_Event_Menu
          Select EventMenu()
            Case 1
              OpenScene()
              
            Case 2
              SaveScene()
              
            Case 3
              quit = 1
              
            Case 62 ; about
              MessageRequester("About","Level Editor Made by Blendman")
              
            Case 100 To 100+ArraySize(SceneTree())
              nom$ = InputRequester("Name","Add an element","")
              If nom$ <>""
                AddAsset(nom$,Random(500),Random(500),Random(500),EventMenu()-100)
                UpdateTreeGadget()
              EndIf
          EndSelect
          
        Case #PB_Event_Gadget
          
          Select EventGadget()
              
            Case #Treegadget_Scene
              
              Select EventType()
                  
                Case #PB_EventType_LeftClick
                  CheckProperty(GetGadgetText(#Treegadget_Scene))
                  
                Case #PB_EventType_RightClick               
                  DisplayPopupMenu(1,WindowID(0))
                  
                Case #PB_EventType_DragStart ; drag
                  sItem = GetGadgetState(#Treegadget_Scene)                 
                  If GetGadgetItemAttribute(#Treegadget_Scene,sItem,#PB_Tree_SubLevel)>0  
                    sText.s = GetGadgetItemText(#Treegadget_Scene, sItem)
                    ForEach asset()
                      If asset()\names$ = sText
                        sType = asset()\type                       
                        Break
                      EndIf
                    Next    
                    DragPrivate(#Drop_Private, #PB_Drag_Move)  
                  EndIf  
                  
              EndSelect
              
;               For i = 0 To ArraySize(SceneTree())-1
;                 If GetGadgetText(#Treegadget_Scene) = scenetree(i)\name$
;                    PropertyBox(i)
;                   Break
;                 EndIf
;               Next i              
              
          EndSelect
          
        Case #PB_Event_GadgetDrop ; event drop
          
          Select EventDropType()
              
            Case #PB_Drop_Private
              tItem = GetGadgetState(#Treegadget_Scene)
              If GetGadgetItemAttribute(#Treegadget_Scene,tItem,#PB_Tree_SubLevel)>0
                tText.s = GetGadgetItemText(#Treegadget_Scene, tItem)
                ForEach asset()
                  If asset()\names$ = tText                    
                    If asset()\type = sType
                      SetGadgetItemText(#Treegadget_Scene, sItem, tText)
                      SetGadgetItemText(#Treegadget_Scene, tItem, sText)
                    EndIf
                    Break
                  EndIf
                Next                
              EndIf  

              
              
          EndSelect
          
      EndSelect  
    Until event = 0 Or quit = 1
    ;}
  ;{ Screen
  ClearScreen(RGB(125,125,125))
  
  FlipBuffers()
  ;}
  Until quit = 1
EndIf
;}

;{ data
DataSection
  ImgAsset: IncludeBinary "assets.ico"
  ImgPnj: IncludeBinary "pnj.ico"
  ImgLightDyn: IncludeBinary "light.png"
  ImgLightStat: IncludeBinary "lightstat.ico"
  ImgAction: IncludeBinary "actions.ico"
  ImgEffects: IncludeBinary "effects.ico"
  ImgDrop: IncludeBinary "drop.ico"
  ImgObj_Move: IncludeBinary "obj_move.ico"
  ImgObj_Block: IncludeBinary "obj_block.ico"
  ImgObj_Destroy: IncludeBinary "obj_destroy.ico"
  ImgCamera: IncludeBinary "camera.ico"
  ImgFontain: IncludeBinary "fontain.ico"
  ImgFX: IncludeBinary "fx.ico"
  
  SceneTree: ; you can change here to have your langage:
  Data.s "Assets","NPC","Light Dyn","Light Static","Effects","Actions","Fontain","Drop","FX","Obj_Block","Obj_Move","Obj_Destroy","Camera"
EndDataSection
;}
Vous pouvez trouver les icônes ici : http://findicons.com/

Sinon, dites-le moi, et je ferai un zip ;)


Et sinon, voici un screenshot wip de l’éditeur 3D (je n'ai pas encore eu le temps de finir, vu que je termine en priorité l'éditeur 2D pour Arkeos ainsi qu'Arkeos et 3Arlks (jeu 2D) ;).

Image

J'essaierai de proposer une nouvelle version de l'éditeur lorsque j'aurai terminé tout le système (avec drag & drop des éléments du treegadget et ajout de dossier dans chaque sous partie, etc.. bref, ce ne sera pas pour tout de suite :)).
Mesa
Messages : 1098
Inscription : mer. 14/sept./2011 16:59

Re: Editeur de Scène 3D (ou 3Dmap Editor)

Message par Mesa »

C'est bizarre, je n'ai pas de toolbar.
Elle est absente du code on dirait.

Mesa.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Editeur de Scène 3D (ou 3Dmap Editor)

Message par blendman »

Mesa a écrit :C'est bizarre, je n'ai pas de toolbar.
Elle est absente du code on dirait.
Tu parles du code que j'ai donné juste au dessus ?
si oui, celui-ci n'a comme élément que la treegadget et un début de propertybox par sélection d'un élément du treegadget.

Pour la toolbar, je ne l'ai pas incluse pour ne pas faire un code trop gros.
J'utilise "toolbarplus" il y a un exemple sur le forum Anglais), c'est vraiment pas mal :).
Fred
Site Admin
Messages : 2652
Inscription : mer. 21/janv./2004 11:03

Re: Editeur de Scène 3D (ou 3Dmap Editor)

Message par Fred »

C'est la derniere version que tu as mis dans le premier post ? J'ai 0.05864 dans la barre de titre. Et pour recharger une scene, tu as une procedure PureBasic pret à l'emploi ?
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Editeur de Scène 3D (ou 3Dmap Editor)

Message par blendman »

Salut Fred :)
Fred a écrit :C'est la derniere version que tu as mis dans le premier post ? J'ai 0.05864 dans la barre de titre.
Non, la dernière version est la 0.2159.
Il y a eu plusieurs améliorations/modifications, mais j'attendais les quelques corrections en 3D (camera projection, light), qui sont corrigées si j'ai bien suivi.
Je n'avais pas retesté ce code depuis quelques mois pour tout dire ^^.

Je l'ai retesté ce matin, et j'ai quelques erreurs, notamment un "procedure stack has been corrupted" ou ima sur cameraprojection()

Et pour recharger une scene, tu as une procedure PureBasic pret à l'emploi ?
Pour sauvegarder et recharger une scène oui, j'ai une procédure qui fait ça. Il faudrait que je la revois un peu, car il doit rester un ou 2 bricoles à régler.

En gros, je sauvegarde (et je charge) :
- le "wolrd" : fog, skybox, skydom, le type de shadow
- les lights : position, couleur (spec, dif), cast shadow
- les mesh (+material+texture)
- ensuite, je crée les "objet"s : entity ou particules avec leurs attributs position, rotation, scale et je leur attribue le mesh (+mat) du fichier.
Par la suite, je comptais leur attribuer un "type" : pnj, téléporteur, coffre, fx, piège, block collisions, etc...

Si tu le souhaites, je peux t'envoyer le dernier code, et si cela t'intéresse, tu pourrais même le fournir (ou fournir l'éditeur de map) avec purebasic ;).
Fred
Site Admin
Messages : 2652
Inscription : mer. 21/janv./2004 11:03

Re: Editeur de Scène 3D (ou 3Dmap Editor)

Message par Fred »

Je prefere que ca reste 'indépendant', tu pourrais meme le proposer sur le forum d'OGRE, je suis sur que certains en serait content :). N'hesite pas a mettre le source avec, comme ca il peut etre amélioré/adapté par d'autre personnes.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Editeur de Scène 3D (ou 3Dmap Editor)

Message par blendman »

salut

J'ai finalement "libérer" les sources de cet éditeur (non terminé).
Vous pouvez donc le tester, l'utiliser, le modifier, mais pas revendre le code ou une partie sans mon accord (sauf Fred si tu veux ;)).
https://sourceforge.net/projects/arkeossceneedit/

Pour infos, ce n'est pas encore terminé, et il reste 2 bugs (dont un peut être lié à Purebasic) :
- camera orthogonal (plantage)
- sauvegarde de la camera (les angles ne sont pas bons)

Si vous le modifiez, n'hésitez pas à poster le code ici, et je l'ajouterai sur sourceforge.
Si vous voulez participer au dev, dites-le moi, et je vous ajouterai en tant que dev sur sourceforge.

Personnellement, je n'ai plus le temps de travailler dessus (pour au moins quelques mois ^^).

le lien :
https://sourceforge.net/projects/arkeossceneedit/
Avatar de l’utilisateur
Atlante
Messages : 337
Inscription : mer. 29/juin/2011 18:35
Localisation : Paris

Re: Editeur de Scène 3D (ou 3Dmap Editor)

Message par Atlante »

C'est vraiment bien ;) Bravo, je vais me pencher sur ton éditeur la semaine prochaine.
Je te tiens au jus ;)
Modérateur
Config : Intel I5 4670K, Nvidia Geforce GTX 1060, 16go RAM, SSD 256go, DD 2000go
comtois
Messages : 5172
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Editeur de Scène 3D (ou 3Dmap Editor)

Message par comtois »

J'ai téléchargé pour jeter un oeil, c'est sympa de partager.
Je suis impressionné par le boulot accompli. Je n'ai pas le temps de regarder en profondeur, mais ça peut servir pour y piocher des idées à l'occasion :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Editeur de Scène 3D (ou 3Dmap Editor)

Message par blendman »

SAlut

Content que ça puisse être utile :).
Il reste 1 ou 2 bugs, dont un lié à la caméra (les rotations ne sont pas les mêmes lors de l'enregistrement et lors de la réouverture du programme).

Mais bon, ça peut être une base plutôt utile pour ceux qui veulent créer un éditeur de scène 3D.
comtois
Messages : 5172
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Editeur de Scène 3D (ou 3Dmap Editor)

Message par comtois »

blendman a écrit :Il reste 1 ou 2 bugs, dont un lié à la caméra (les rotations ne sont pas les mêmes lors de l'enregistrement et lors de la réouverture du programme).
C'est le même problème que cederavic ici

En fait Ogre permet de faire le calcul de l'angle selon 2 méthodes, PB utilise la méthode par défaut d'ogre (en principe celle qui est la plus utilisée).
Mais il s'avère qu'on a très souvent besoin de la deuxième méthode :)

La première méthode est une projection de l'axe concerné sur le plan, ogre appelle ça la méthode intuitive.
La seconde méthode renvoie l'angle nécessaire pour obtenir la même orientation.

Je cite de mémoire, je n'ai pas le nez dans les codes là. :)

ce sera fait rapidement, après la sortie de la 5.00.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Répondre