Page 1 of 1

OpenGL leveleditor, help me please(objectproblem)

Posted: Mon Jun 02, 2003 9:27 am
by DarkDragon
Hello,

I have made a small OpenGL LevelEditortest, but it doesn't make the cube on the right position:

Code: Select all

#GL_COLOR_BUFFER_BIT = $00004000
#GL_TRIANGLES = $0004
#GL_QUADS = $0007

#Window_0 = 0
#Window_1 = 1

#Gadget_0 = 0
#Gadget_1 = 1
#Gadget_2 = 2
#Gadget_3 = 3
#Gadget_4 = 4
#Gadget_5 = 5
#Gadget_6 = 6

Procedure DrawTriangle(ID, X, Y, Z, Size)
  OpenFile(0, "curlev")
   FileSeek(Lof())
   WriteStringN("Cube,"+Str(X)+","+Str(Y)+","+Str(Z)+","+Str(Size))
  CloseFile(0)
EndProcedure

Procedure Update()
  OpenFile(0, "curlev")
   While Eof(0) = 0
    String$ = ReadString()
    If StringField(String$, 1, ",") = "Cube"
     Wert1 = ValF(StringField(String$, 2, ","))
     Wert2 = ValF(StringField(String$, 3, ","))
     Wert3 = ValF(StringField(String$, 4, ","))
     Size = ValF(StringField(String$, 4, ","))
     SizeZ1 = Size-0.25
     SizeZ2 = Size+0.25
     glClear_(#GL_COLOR_BUFFER_BIT)
  glBegin_(#GL_QUADS)

  ;Front Back
   glColor4f_(0.0, 0.0, 1.0, 1.0)
   glNormal3f_ (0, 0, 1.0)
   glVertex3f_(Size+0.25, Size+0.25, SizeZ1)
   glVertex3f_(Size-0.25, Size+0.25, SizeZ1)
   glVertex3f_(Size-0.25, Size-0.25, SizeZ1)
   glVertex3f_(Size+0.25, Size-0.25, SizeZ1)
   
   glNormal3f_ (0, 0, -1.0)
   glVertex3f_(Size+0.25, Size+0.25, SizeZ2)
   glVertex3f_(Size-0.25, Size+0.25, SizeZ2)
   glVertex3f_(Size-0.25, Size-0.25, SizeZ2)
   glVertex3f_(Size+0.25, Size-0.25, SizeZ2)
   
   ;Top Bottom
   glNormal3f_(0, -1.0, 0)
   glVertex3f_(Size+0.25, Size+0.25, SizeZ2)
   glVertex3f_(Size+0.25, Size+0.25, SizeZ1)
   glVertex3f_(Size-0.25, Size+0.25, SizeZ1)
   glVertex3f_(Size-0.25, Size+0.25, SizeZ2)
   
   glNormal3f_ (0, 1.0, 0)
   glVertex3f_ (Size-0.25, Size-0.25, SizeZ1)
   glVertex3f_ (Size+0.25, Size-0.25, SizeZ1)
   glVertex3f_ (Size+0.25, Size-0.25, SizeZ2)
   glVertex3f_ (Size-0.25, Size-0.25, SizeZ2)
   
   ;Left Right
   glNormal3f_ (1.0, 0, 0)
   glVertex3f_ (Size+0.25, Size+0.25, SizeZ2)
   glVertex3f_ (Size+0.25, Size-0.25, SizeZ2)
   glVertex3f_ (Size+0.25, Size-0.25, SizeZ1)
   glVertex3f_ (Size+0.25, Size+0.25, SizeZ1)
   
   glNormal3f_ (-1.0, 0, 0)
   glVertex3f_ (Size-0.25, Size-0.25, SizeZ1)
   glVertex3f_ (Size-0.25, Size-0.25, SizeZ2)
   glVertex3f_ (Size-0.25, Size+0.25, SizeZ2)
   glVertex3f_ (Size-0.25, Size+0.25, SizeZ1)
  glEnd_()
  
  glTranslatef_(Wert1, Wert2, Wert3)
  glRotatef_(0.5, 0, 0, 0)
    EndIf
   Wend
  CloseFile(0)
EndProcedure

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 215, 100, 600, 500, #PB_Window_SizeGadget | #PB_Window_SystemMenu | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered , "View")
    InitOpenGLContext(#Window_0)
  EndIf
EndProcedure

Procedure Open_Window_1()
  If OpenWindow(#Window_1, 820, 100, 180, 120, #PB_Window_TitleBar , "Add Cube")
    If CreateGadgetList(WindowID())
      StringGadget(#Gadget_0, 10, 10, 160, 20, "X")
      StringGadget(#Gadget_1, 10, 30, 160, 20, "Y")
      StringGadget(#Gadget_2, 10, 50, 160, 20, "Z")
      StringGadget(#Gadget_3, 10, 70, 160, 20, "Size")
      ButtonGadget(#Gadget_6, 10, 100, 160, 20, "Create")

    EndIf
   MakeToolWindow(WindowID(#Window_1), #TRUE)
  EndIf
EndProcedure


Open_Window_0()
Open_Window_1()

Repeat
  SwapOpenGLContext(#Window_0)
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_Gadget
     Select EventGadgetID()
      Case #Gadget_6
       GadgetX = ValF("0."+GetGadgetText(#Gadget_0))
       GadgetY = ValF("0."+GetGadgetText(#Gadget_1))
       GadgetZ = ValF("0."+GetGadgetText(#Gadget_2))
       GadgetSize = ValF("0."+GetGadgetText(#Gadget_3))
       DrawTriangle(ID, GadgetX, GadgetY, GadgetZ, GadgetSize)
       Update()
       ID + 1
     EndSelect
  EndSelect
Until Event = #PB_EventCloseWindow
FreeOpenGLContext(#Window_0)
End
Please, can you help me? :(

cu
Daniel

Posted: Mon Jun 02, 2003 10:00 am
by dmoc
At a quick glance...

1) your not doing any Z translation (try -0.5 at least)
2) IIRC you need to use glDepthRange_()... which needs doubles
3) You are waiting on events so *not* redrawing every frame. OpenGL uses "immediate mode" which means you either don't use WaitWindowEvent() or use some other method to enable you to draw every frame (threads?).

Posted: Mon Jun 02, 2003 2:50 pm
by DarkDragon
what is IIRC?
Can you help me in the code?
Or can you say me, what I can do to create a 3dcube on a fixed position, I can choose with gadgets?

Posted: Mon Jun 02, 2003 4:53 pm
by dmoc
IIRC - If I Remember Correctly

DarkDragon, if it was simply a case of pointing to an error here and there then I could help. Although I understand generally what you are trying to do, the code indicates that you maybe need a little more OpenGL knowledge. For instance you appear to be doing several things differently to the typical opengl program, which usually has this structure (read these as function calls)...

InitOpenGL
InitModel
Repeat
..UpdateModel
..DrawGL
..FlipBuffers
Until (whatever)

The DrawGL function...

ClearBuffers
LoadIdentity
For Each primative
..(PushMatrix?)
..Translate
..Rotate
..Scale
..(do your triangle/quad calls here)
..(PopMatrix?)
next

And another reason for maybe doing more reading is that there is no camera as such in OpenGL. The view point is defined as where ever the last op leaves it. Have a look at some of the demos on the resource site (eg, PureGL) and head over to NeHe's site (http://nehe.gamedev.net/).

Posted: Wed Jun 04, 2003 7:56 am
by DarkDragon
thx for your help :)
I know it is hard, but who don't try something, learn nothing