[DEVELOPMENT ENVIRONMEMNT]

* BUG: ImageEditor: Fix a crash that occurs after something having pasted.

[EXAMPLES]
* NEW: Md2Model example has been redesigned. It now displays a lot of 
  models between six different ones.

[INTERPRETER]
* BUG: Fix a crash when an error is raised while the startup class is not 
  ready.

[GB.GEOM]
* BUG: Fix the conversion from Point/PointF to Float that internally uses
  the Abs() function.

[GB.GTK]
* NEW: Visible trayicons prevent the eventloop from stopping.

[GB.OPENGL.SGE]
* NEW: The component sources are now located inside the gb.opengl 
  directory.
* NEW: The component interface has been redesigned.

[GB.QT4]
* NEW: Visible trayicons prevent the eventloop from stopping.

[GB.QT4.OPENGL]
* BUG: The OpenGL clear color is now taken into account when clearing the 
  area before calling the Draw event handler.


git-svn-id: svn://localhost/gambas/trunk@5836 867c0c6c-44f3-4631-809d-bfa615b0a4ec
This commit is contained in:
Benoît Minisini 2013-09-08 17:15:55 +00:00
parent 812bec445b
commit 0d2256a19d
61 changed files with 971 additions and 713 deletions

View File

@ -33,7 +33,6 @@ SUBDIRS = \
@media_dir@ \
@jit_dir@ \
@httpd_dir@ \
@opengl_sge_dir@ \
@openssl_dir@ \
@openal_dir@ \
comp \

View File

@ -558,7 +558,7 @@ msgstr ""
#: FConnectionEditor.class:294 FCreateFile.form:437 FDebugInfo.form:263
#: FEditor.class:2379 FExportData.class:126 FFieldChooser.form:138
#: FFileProperty.class:140 FFontChooser.form:40 FForm.class:3141
#: FGotoLine.form:23 FHelpBrowser.form:61 FImageEditor.class:346
#: FGotoLine.form:23 FHelpBrowser.form:61 FImageEditor.class:347
#: FImageOffsetSelection.form:33 FImageResize.form:49 FImageRotate.form:32
#: FInfo.class:263 FList.form:121 FMain.class:212 FMakeInstall.class:350
#: FMenu.form:365 FNewConnection.form:255 FNewTable.form:86
@ -1631,7 +1631,7 @@ msgstr ""
msgid "Procedure list"
msgstr ""
#: FEditor.class:2379 FImageEditor.class:346 FTextEditor.class:599
#: FEditor.class:2379 FImageEditor.class:347 FTextEditor.class:599
msgid ""
"The file has been modified.\n"
"\n"

View File

@ -89,6 +89,7 @@ Private Sub ClearSelection()
$hMagnet = Null
$hLastMagnet = Null
$sMagnet = ""
$iChangeAction = CHANGE_NOTHING
RefreshSelection
End
@ -2665,6 +2666,7 @@ Private Sub ClearPaste()
$hPasteSelect = Null
$hPasteCurrent = Null
imvImage.Refresh
$iChangeAction = CHANGE_NOTHING
Endif
End

View File

@ -42,7 +42,6 @@ GB_CONFIG_SUBDIRS(ncurses, gb.ncurses)
GB_CONFIG_SUBDIRS(media, gb.media)
GB_CONFIG_SUBDIRS(jit, gb.jit)
GB_CONFIG_SUBDIRS(httpd, gb.httpd)
GB_CONFIG_SUBDIRS(opengl_sge, gb.opengl.sge)
GB_CONFIG_SUBDIRS(openssl, gb.openssl)
GB_CONFIG_SUBDIRS(openal, gb.openal)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -1,17 +1,18 @@
# Gambas Project File 3.0
# Compiled with Gambas 3.4.0
Title=screen
Startup=MMain
Version=0.0.1
# Compiled with Gambas 3.4.90
Title=Md2Model example
Startup=FMain
Icon=icon.png
Version=3.4.90
VersionFile=1
Component=gb.image
Component=gb.gui
Component=gb.db
Component=gb.db.mysql
Component=gb.image.io
Component=gb.sdl
Component=gb.gui.opengl
Component=gb.opengl
Component=gb.opengl.glu
Component=gb.opengl.sge
Component=gb.sdl.sound
Environment="GB_GUI=gb.qt4"
TabSize=2
Warnings=0
Packager=1

View File

@ -96,9 +96,10 @@ SearchComment=False
SearchString=True
[OpenFile]
Active=1
File[1]=".src/MMain.module:126.2"
Count=1
File[1]=".src/FMain.form"
Active=2
File[2]=".src/FMain.class:147.25"
Count=2
[Watches]
Count=0

View File

@ -0,0 +1,183 @@
' Gambas class file
Private $aModel As Md2Model[]
Private $iFrames As Integer
Private $fTime As Single
Private $fFramerate As Float
Private $iEndWidth As Integer
Private $iEndZ As Integer
Public Sub glaScreen_Open()
Init()
Gl.ClearDepth(100.0) ' Enables clearing of the depth buffer
Glu.ClearColor(&H3398C3) ' This will clear the background color to blue
Gl.DepthFunc(Gl.LESS) ' The type of depth test to do
Gl.Enable(Gl.DEPTH_TEST) ' Enables depth testing
Gl.ShadeModel(Gl.SMOOTH) ' Enables smooth color shading
$fTime = Timer
timAnim.Enabled = True
End
Public Sub glaScreen_Resize()
Gl.Viewport(0, 0, glaScreen.Width, glaScreen.Height)
Gl.MatrixMode(Gl.PROJECTION)
Gl.LoadIdentity() 'Reset The Projection Matrix
Glu.Perspective(45.0, glaScreen.Width / glaScreen.Height, 0.1, 3000.0) 'Calculate The Aspect Ratio Of The Window
Glu.Lookat(0, 100, 120, 0, 0, -300, 0, 100, 0)
Gl.MatrixMode(Gl.MODELVIEW)
End
Public Sub Init()
Dim X, D, Z As Float
Dim sModel As String
Dim I As Integer
Dim aModel As String[] = ["bauul", "goblin", "knight", "ogro", "rat", "rhino"]
$aModel = New Md2Model[]
D = 100
X = - D
Z = -100
For I = 1 To 189
sModel = aModel[Int(Rnd(0, aModel.Count))]
$aModel.Add(Md2Model.Load(sModel & ".md2"))
$aModel[$aModel.Max].Texture = LoadTexture(sModel & ".jpg")
'Print "Model #"; $aModel.Max; ": "; $aModel[$aModel.Max].Count; " frames"
$aModel[$aModel.Max].Move(X, -10, Z)
X += 50
If X > D Then
D += 100
X = - D
Z -= 100
Endif
Next
$iEndWidth = D
$iEndZ = Z
sldFrame.MinValue = 0
sldFrame.MaxValue = $aModel[0].Count
End
Public Sub glaScreen_Draw()
Dim I As Integer
Dim hQuadric As GluQuadric
Gl.Clear(Gl.COLOR_BUFFER_BIT Or Gl.DEPTH_BUFFER_BIT) ' Clear The Screen And The Depth Buffer
Gl.PushMatrix
Glu.Color(&HD96800&)
Gl.Begin(Gl.QUADS)
Gl.Vertex3f(-100, -34.2, -100)
Gl.Vertex3f(100, -34.2, -100)
Gl.Vertex3f($iEndWidth, -34.2, $iEndZ)
Gl.Vertex3f(- $iEndWidth, -34.2, $iEndZ)
Gl.End
'Drawing model is as easy as this - frame number, interpolation between frames (0-1), texture identificator)
'
Gl.Color3f(1, 1, 1)
For I = 0 To $aModel.Max
$aModel[I].Draw
Next
For I = 0 To $aModel.Max
Glu.Color(Color.Lighter(&HD96800&))
hQuadric = Glu.NewQuadric()
Gl.PushMatrix()
Gl.Translatef($aModel[I].X, -34, $aModel[I].Z)
Gl.Rotatef(90, 1, 0, 0)
Glu.Disk(hQuadric, 0, 20, 20, 8)
Gl.PopMatrix()
Next
' You can use this code to get FPS printed in terminal
Inc $iFrames
If Timer >= ($fTime + 1) Then
$fFrameRate = $iFrames / (Timer - $fTime)
$iFrames = 0
Inc $fTime
Endif
lblInfo.Text = Format($aModel[0].Pos, "0.00") & " / " & $aModel[0].Count & " ( " & CInt($fFramerate) & " FPS )"
Gl.PopMatrix
End
Public Sub Form_KeyPress()
If Key.code = Key.F1 Then
Me.FullScreen = Not Me.FullScreen
sldFrame.Visible = Not Me.FullScreen
Else If Key.Code = Key.Esc Then
Me.Close
Else If Key.code = Key.Space Then
timAnim.Enabled = Not timAnim.Enabled
Else If LCase(Key.Text) = "w" Then
Gl.PolygonMode(Gl.FRONT_AND_BACK, Gl.LINE)
Else If LCase(Key.Text) = "f" Then
Gl.PolygonMode(Gl.FRONT_AND_BACK, Gl.FILL)
Endif
End
Public Sub timAnim_Timer()
' At every timer call we increase interpolation. It makes Frame number increase every 10 calls.
' You can control frame flow any way you want. The smaller incrementation, the smoother movement.
Dim I As Integer
For I = 0 To $aModel.Max
$aModel[I].Pos += 0.1
If $aModel[I].Pos >= $aModel[I].Count Then $aModel[I].Pos = 0
Next
Object.Lock(sldFrame)
sldFrame.Value = CInt($aModel[0].Pos)
Object.Unlock(sldFrame)
glaScreen.Refresh
End
' Just the subroutine to load textures for our models
Private Sub LoadTexture(sPath As String) As Integer
Dim iTex As Integer
Dim hImage As Image
iTex = Gl.GenTextures(1)[0]
hImage = Image.Load(sPath)
Gl.BindTexture(Gl.TEXTURE_2D, iTex)
Gl.TexImage2D(hImage)
Glu.Build2DMipmaps(hImage)
Gl.Texparameteri(Gl.TEXTURE_2D, Gl.TEXTURE_MIN_FILTER, Gl.LINEAR_MIPMAP_LINEAR)
Gl.Texparameteri(Gl.TEXTURE_2D, Gl.TEXTURE_MAG_FILTER, Gl.LINEAR)
Return iTex
End
Public Sub sldFrame_Change()
$aModel[0].Pos = sldFrame.Value
End

View File

@ -0,0 +1,28 @@
# Gambas Form File 3.0
{ Form Form
MoveScaled(0,0,160,72)
Arrangement = Arrange.Vertical
{ Panel1 HBox
MoveScaled(1,2,116,4)
Spacing = True
{ sldFrame Slider
MoveScaled(0,0,24,4)
Expand = True
}
{ Separator1 Separator
MoveScaled(54,0,0,4)
}
{ lblInfo Label
MoveScaled(64,0,18,4)
}
}
{ timAnim #Timer
#MoveScaled(51,13)
Delay = 20
}
{ glaScreen GLArea
MoveScaled(4,14,16,16)
Expand = True
}
}

View File

@ -1,138 +0,0 @@
' Gambas module file
'This example shows how to use new experimental component gb.sge (Simple Game Engine)
'New class Md2Model alows to load and render quake md2 models.
'
' Gambas module file
Private screen As New Window(True) As "Screen"
Private frames As Integer
Private CTime As Single
Private hTimer As New Timer As "Timer1"
Private ogre As Md2Model
Private gun As Md2Model
Private interp As Float
Public f_no As Integer
Private texture As New Integer[2]
Public Sub Main()
' Standard OpenGL screen init
With screen
.Width = 640
.Height = 480
' .Framerate = 50
.Show()
End With
CTime = Timer()
hTimer.Delay = 20
hTimer.Enabled = True
End
Public Sub Screen_Open()
init()
Gl.ClearDepth(100.0) 'Enables Clearing Of The Depth Buffer
gl.ClearColor(0.1, 0.1, 0.6, 0.0) 'This Will Clear The Background Color To Blue
gl.DepthFunc(GL.LESS) 'The Type Of Depth Test To Do
gl.Enable(GL.DEPTH_TEST) 'Enables Depth Testing
gl.ShadeModel(GL.SMOOTH) 'Enables Smooth Color Shading
End
Public Sub Screen_resize()
Dim i As Integer
Gl.Viewport(0, 0, Screen.Width, Screen.Height)
Gl.MatrixMode(GL.PROJECTION)
Gl.LoadIdentity() 'Reset The Projection Matrix
glu.Perspective(45.0, screen.Width / screen.Height, 0.1, 400.0) 'Calculate The Aspect Ratio Of The Window
Gl.MatrixMode(GL.MODELVIEW)
End
Public Sub init()
Dim s As String
gl.Enable(gl.TEXTURE_2D) ' Enable Texture Mapping
texture = Gl.GenTextures(3) ' reserve memory for textures
load_textures(0, "igdosh.png") 'Ogre body texture
load_textures(1, "Weapon.png") 'Weapon texture
ogre = Md2Model.Load("Ogros.md2") 'ogre model loading - it's static method use md2model.load(name)
ogre.SetPosition(0, -10, -100) 'Set position for model
gun = Md2Model.Load("Weapon.md2")
gun.SetPosition(0, -10, -100)
'That's it - model ready to be rendered frame count and looping in timer sub
End
Public Sub Screen_Draw()
Dim calc, i As Integer
gl.Clear(GL.COLOR_BUFFER_BIT Or GL.DEPTH_BUFFER_BIT) ' Clear The Screen And The Depth Buffer
gl.LoadIdentity()
gl.Color3f(1, 1, 1)
'Drawing model is as easy as this - frame number, interpolation between frames (0-1), texture identificator)
ogre.DrawInterFrame(f_no, interp, texture[0])
gun.DrawInterFrame(f_no, interp, texture[1])
'Now some info on the screen - it slows down rendering by more than 50%!!! Uncomment and see.
'gl.Translatef(-3, 3, -8)
'gl.Rotatef(180, 1, 0, 0)
'gl.Scalef(1 / 50, 1 / 50, 1 / 50)
'Draw.Text(Screen.Framerate & " FPS, " & "Frame no " & f_no & " " & Trim(ogre.GetFrameName(f_no)), 0, 0) '" - 10,800 squares. SPACE - turn shader on/off", 0, 0)
'You can use this code to get FPS printed in terminal
Inc (Frames)
If (Timer() > CTime + 5) Then
calc = Timer() - CTime
Print CStr(Frames) & " frames in " & Format$(calc, "#.0") & " seconds = " & Format$((Frames / calc), "######.000") & " FPS"
Frames = 0
CTime = Timer()
Endif
End
Public Sub Screen_keyPress()
Dim i, j As Integer
If (key.code = key.F1) Then screen.FullScreen = Not screen.FullScreen
If (key.Code = key.Esc) Then Screen.Close()
If (Key.code = Key.Space) Then hTimer.Enabled = Not hTimer.Enabled
If (key.Text = "w") Then gl.PolygonMode(gl.FRONT_and_back, gl.line)
If (key.Text = "f") Then gl.PolygonMode(gl.FRONT_and_back, gl.fill)
End
Public Sub Timer1_Timer()
' At every timer call we increase interpolation. It makes Frame number increase every 20 calls.
' You can control frame flow any way you want. The smaller iterp, the smoother movement.
interp += 0.05
If interp >= 1 Then
Inc f_no
If f_no > ogre.GetFramesNo() Then f_no = 0 'use ogre.getframesno() to get number of frames in model animation
interp = 0
Endif
End
' Just the subroutine to load textures for our models
Public Sub load_textures(no As Integer, name As String)
Dim texture_image As Image
Dim i As Integer
texture_image = Image.Load(name)
Gl.BindTexture(gl.TEXTURE_2D, texture[no])
Gl.TexImage2D(texture_image)
Glu.Build2DMipmaps(texture_image)
Gl.Texparameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.linear_mipmap_linear)
Gl.Texparameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)
End

View File

@ -1,16 +1,15 @@
MMain
screen
FMain
Md2Model example
0
0
0.0.1
3.4.90
gb.image
gb.gui
gb.db
gb.db.mysql
gb.image.io
gb.sdl
gb.gui.opengl
gb.opengl
gb.opengl.glu
gb.opengl.sge
gb.sdl.sound

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

View File

@ -180,13 +180,20 @@ END_METHOD
BEGIN_METHOD_VOID(CTRAYICON_hide)
TRAYICON->hide();
MAIN_check_quit();
END_METHOD
BEGIN_PROPERTY(CTRAYICON_visible)
if (READ_PROPERTY) { GB.ReturnBoolean(TRAYICON->isVisible()); return; }
TRAYICON->setVisible(VPROP(GB_BOOLEAN));
if (READ_PROPERTY)
GB.ReturnBoolean(TRAYICON->isVisible());
else
{
TRAYICON->setVisible(VPROP(GB_BOOLEAN));
if (!VPROP(GB_BOOLEAN))
MAIN_check_quit();
}
END_PROPERTY

View File

@ -28,13 +28,16 @@
#include "gtrayicon.h"
#include "CPicture.h"
#ifndef __CTRAYICON_CPP
extern GB_DESC CTrayIconDesc[];
extern GB_DESC CTrayIconsDesc[];
#else
#define THIS ((CTRAYICON *)_object)
#define TRAYICON ((gTrayIcon *)(THIS->base.widget))
#endif
typedef

View File

@ -47,6 +47,7 @@
#define OPCODE "_NET_SYSTEM_TRAY_OPCODE"
int gTrayIcon::_visible_count = 0;
/*****************************************************************************
@ -425,6 +426,8 @@ void gTrayIcon::setVisible(bool vl)
updateTooltip();
refresh();
_visible_count++;
}
}
@ -433,6 +436,7 @@ void gTrayIcon::setVisible(bool vl)
if (plug)
{
gtk_widget_destroy(plug);
_visible_count--;
}
}
}

View File

@ -66,6 +66,7 @@ public:
//"Static"
static int count() { return g_list_length(trayicons); }
static int visibleCount() { return _visible_count; }
static gTrayIcon *get(int index) { return (gTrayIcon *)g_list_nth_data(trayicons, index); }
static void exit();
static gPicture *defaultIcon();
@ -87,6 +88,7 @@ public:
private:
static int _visible_count;
GtkStyle *_style;
};

View File

@ -475,7 +475,7 @@ static int my_loop()
{
if (_must_check_quit)
{
if (CWINDOW_must_quit() && CWatcher::count() == 0)
if (CWINDOW_must_quit() && CWatcher::count() == 0 && gTrayIcon::visibleCount() == 0)
break;
_must_check_quit = false;
}

View File

View File

@ -1 +0,0 @@
../COPYING

View File

@ -1 +0,0 @@
../INSTALL

View File

@ -1,3 +0,0 @@
ACLOCAL_AMFLAGS = -I m4 --install
SUBDIRS = @OPENGL_SGE_DIR@
EXTRA_DIST = reconf gambas.h gb*.h

View File

View File

View File

@ -1 +0,0 @@
../acinclude.m4

View File

@ -1 +0,0 @@
../component.am

View File

@ -1,20 +0,0 @@
dnl ---- configure.ac for gb.opengl.sge
AC_INIT(configure.ac)
AC_CONFIG_MACRO_DIR([m4])
GB_INIT(gb.opengl.sge)
AC_PROG_LIBTOOL
GB_CHECK_XWINDOW
GB_COMPONENT(
opengl_sge,
OPENGL_SGE,
gb.opengl.sge,
[src],
[GB_FIND(gl.h glu.h glew.h, /usr/local/lib /usr/local /usr/lib /usr, opengl.sge/include include opengl.sge*/include opengl.sge)],
[GB_FIND(libGL.$SHLIBEXT libGLEW.$SHLIBEXT libGLU.$SHLIBEXT, /usr/local /usr, lib)],
[$C_LIB $THREAD_LIB -ljpeg -lpng -lGL -lGLEW -lGLU],
[$THREAD_INC -ljpeg -lpng -lGL -lGLEW -lGLU])
AC_OUTPUT( Makefile src/Makefile )
GB_PRINT_MESSAGES

View File

@ -1 +0,0 @@
../main/share/gambas.h

View File

@ -1 +0,0 @@
../main/share/gb_common.h

View File

@ -1 +0,0 @@
../m4

View File

@ -1 +0,0 @@
../missing

View File

@ -1 +0,0 @@
../reconf

View File

@ -1,477 +0,0 @@
/***************************************************************************
CMD2MODEL.c
(c) 2012 Tomasz Kołodziejczyk "Tommyline"
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA.
***************************************************************************/
#define __CMD2MODEL_C
#include "gb_common.h"
#include "cmd2model.h"
#include <stdio.h>
#define THIS OBJECT(MD2MODEL)
/* Table of precalculated normals */
GLfloat anorms_table[162][3] = {
{ -0.525731f, 0.000000f, 0.850651f },
{ -0.442863f, 0.238856f, 0.864188f },
{ -0.295242f, 0.000000f, 0.955423f },
{ -0.309017f, 0.500000f, 0.809017f },
{ -0.162460f, 0.262866f, 0.951056f },
{ 0.000000f, 0.000000f, 1.000000f },
{ 0.000000f, 0.850651f, 0.525731f },
{ -0.147621f, 0.716567f, 0.681718f },
{ 0.147621f, 0.716567f, 0.681718f },
{ 0.000000f, 0.525731f, 0.850651f },
{ 0.309017f, 0.500000f, 0.809017f },
{ 0.525731f, 0.000000f, 0.850651f },
{ 0.295242f, 0.000000f, 0.955423f },
{ 0.442863f, 0.238856f, 0.864188f },
{ 0.162460f, 0.262866f, 0.951056f },
{ -0.681718f, 0.147621f, 0.716567f },
{ -0.809017f, 0.309017f, 0.500000f },
{ -0.587785f, 0.425325f, 0.688191f },
{ -0.850651f, 0.525731f, 0.000000f },
{ -0.864188f, 0.442863f, 0.238856f },
{ -0.716567f, 0.681718f, 0.147621f },
{ -0.688191f, 0.587785f, 0.425325f },
{ -0.500000f, 0.809017f, 0.309017f },
{ -0.238856f, 0.864188f, 0.442863f },
{ -0.425325f, 0.688191f, 0.587785f },
{ -0.716567f, 0.681718f, -0.147621f },
{ -0.500000f, 0.809017f, -0.309017f },
{ -0.525731f, 0.850651f, 0.000000f },
{ 0.000000f, 0.850651f, -0.525731f },
{ -0.238856f, 0.864188f, -0.442863f },
{ 0.000000f, 0.955423f, -0.295242f },
{ -0.262866f, 0.951056f, -0.162460f },
{ 0.000000f, 1.000000f, 0.000000f },
{ 0.000000f, 0.955423f, 0.295242f },
{ -0.262866f, 0.951056f, 0.162460f },
{ 0.238856f, 0.864188f, 0.442863f },
{ 0.262866f, 0.951056f, 0.162460f },
{ 0.500000f, 0.809017f, 0.309017f },
{ 0.238856f, 0.864188f, -0.442863f },
{ 0.262866f, 0.951056f, -0.162460f },
{ 0.500000f, 0.809017f, -0.309017f },
{ 0.850651f, 0.525731f, 0.000000f },
{ 0.716567f, 0.681718f, 0.147621f },
{ 0.716567f, 0.681718f, -0.147621f },
{ 0.525731f, 0.850651f, 0.000000f },
{ 0.425325f, 0.688191f, 0.587785f },
{ 0.864188f, 0.442863f, 0.238856f },
{ 0.688191f, 0.587785f, 0.425325f },
{ 0.809017f, 0.309017f, 0.500000f },
{ 0.681718f, 0.147621f, 0.716567f },
{ 0.587785f, 0.425325f, 0.688191f },
{ 0.955423f, 0.295242f, 0.000000f },
{ 1.000000f, 0.000000f, 0.000000f },
{ 0.951056f, 0.162460f, 0.262866f },
{ 0.850651f, -0.525731f, 0.000000f },
{ 0.955423f, -0.295242f, 0.000000f },
{ 0.864188f, -0.442863f, 0.238856f },
{ 0.951056f, -0.162460f, 0.262866f },
{ 0.809017f, -0.309017f, 0.500000f },
{ 0.681718f, -0.147621f, 0.716567f },
{ 0.850651f, 0.000000f, 0.525731f },
{ 0.864188f, 0.442863f, -0.238856f },
{ 0.809017f, 0.309017f, -0.500000f },
{ 0.951056f, 0.162460f, -0.262866f },
{ 0.525731f, 0.000000f, -0.850651f },
{ 0.681718f, 0.147621f, -0.716567f },
{ 0.681718f, -0.147621f, -0.716567f },
{ 0.850651f, 0.000000f, -0.525731f },
{ 0.809017f, -0.309017f, -0.500000f },
{ 0.864188f, -0.442863f, -0.238856f },
{ 0.951056f, -0.162460f, -0.262866f },
{ 0.147621f, 0.716567f, -0.681718f },
{ 0.309017f, 0.500000f, -0.809017f },
{ 0.425325f, 0.688191f, -0.587785f },
{ 0.442863f, 0.238856f, -0.864188f },
{ 0.587785f, 0.425325f, -0.688191f },
{ 0.688191f, 0.587785f, -0.425325f },
{ -0.147621f, 0.716567f, -0.681718f },
{ -0.309017f, 0.500000f, -0.809017f },
{ 0.000000f, 0.525731f, -0.850651f },
{ -0.525731f, 0.000000f, -0.850651f },
{ -0.442863f, 0.238856f, -0.864188f },
{ -0.295242f, 0.000000f, -0.955423f },
{ -0.162460f, 0.262866f, -0.951056f },
{ 0.000000f, 0.000000f, -1.000000f },
{ 0.295242f, 0.000000f, -0.955423f },
{ 0.162460f, 0.262866f, -0.951056f },
{ -0.442863f, -0.238856f, -0.864188f },
{ -0.309017f, -0.500000f, -0.809017f },
{ -0.162460f, -0.262866f, -0.951056f },
{ 0.000000f, -0.850651f, -0.525731f },
{ -0.147621f, -0.716567f, -0.681718f },
{ 0.147621f, -0.716567f, -0.681718f },
{ 0.000000f, -0.525731f, -0.850651f },
{ 0.309017f, -0.500000f, -0.809017f },
{ 0.442863f, -0.238856f, -0.864188f },
{ 0.162460f, -0.262866f, -0.951056f },
{ 0.238856f, -0.864188f, -0.442863f },
{ 0.500000f, -0.809017f, -0.309017f },
{ 0.425325f, -0.688191f, -0.587785f },
{ 0.716567f, -0.681718f, -0.147621f },
{ 0.688191f, -0.587785f, -0.425325f },
{ 0.587785f, -0.425325f, -0.688191f },
{ 0.000000f, -0.955423f, -0.295242f },
{ 0.000000f, -1.000000f, 0.000000f },
{ 0.262866f, -0.951056f, -0.162460f },
{ 0.000000f, -0.850651f, 0.525731f },
{ 0.000000f, -0.955423f, 0.295242f },
{ 0.238856f, -0.864188f, 0.442863f },
{ 0.262866f, -0.951056f, 0.162460f },
{ 0.500000f, -0.809017f, 0.309017f },
{ 0.716567f, -0.681718f, 0.147621f },
{ 0.525731f, -0.850651f, 0.000000f },
{ -0.238856f, -0.864188f, -0.442863f },
{ -0.500000f, -0.809017f, -0.309017f },
{ -0.262866f, -0.951056f, -0.162460f },
{ -0.850651f, -0.525731f, 0.000000f },
{ -0.716567f, -0.681718f, -0.147621f },
{ -0.716567f, -0.681718f, 0.147621f },
{ -0.525731f, -0.850651f, 0.000000f },
{ -0.500000f, -0.809017f, 0.309017f },
{ -0.238856f, -0.864188f, 0.442863f },
{ -0.262866f, -0.951056f, 0.162460f },
{ -0.864188f, -0.442863f, 0.238856f },
{ -0.809017f, -0.309017f, 0.500000f },
{ -0.688191f, -0.587785f, 0.425325f },
{ -0.681718f, -0.147621f, 0.716567f },
{ -0.442863f, -0.238856f, 0.864188f },
{ -0.587785f, -0.425325f, 0.688191f },
{ -0.309017f, -0.500000f, 0.809017f },
{ -0.147621f, -0.716567f, 0.681718f },
{ -0.425325f, -0.688191f, 0.587785f },
{ -0.162460f, -0.262866f, 0.951056f },
{ 0.442863f, -0.238856f, 0.864188f },
{ 0.162460f, -0.262866f, 0.951056f },
{ 0.309017f, -0.500000f, 0.809017f },
{ 0.147621f, -0.716567f, 0.681718f },
{ 0.000000f, -0.525731f, 0.850651f },
{ 0.425325f, -0.688191f, 0.587785f },
{ 0.587785f, -0.425325f, 0.688191f },
{ 0.688191f, -0.587785f, 0.425325f },
{ -0.955423f, 0.295242f, 0.000000f },
{ -0.951056f, 0.162460f, 0.262866f },
{ -1.000000f, 0.000000f, 0.000000f },
{ -0.850651f, 0.000000f, 0.525731f },
{ -0.955423f, -0.295242f, 0.000000f },
{ -0.951056f, -0.162460f, 0.262866f },
{ -0.864188f, 0.442863f, -0.238856f },
{ -0.951056f, 0.162460f, -0.262866f },
{ -0.809017f, 0.309017f, -0.500000f },
{ -0.864188f, -0.442863f, -0.238856f },
{ -0.951056f, -0.162460f, -0.262866f },
{ -0.809017f, -0.309017f, -0.500000f },
{ -0.681718f, 0.147621f, -0.716567f },
{ -0.681718f, -0.147621f, -0.716567f },
{ -0.850651f, 0.000000f, -0.525731f },
{ -0.688191f, 0.587785f, -0.425325f },
{ -0.587785f, 0.425325f, -0.688191f },
{ -0.425325f, 0.688191f, -0.587785f },
{ -0.425325f, -0.688191f, -0.587785f },
{ -0.587785f, -0.425325f, -0.688191f },
{ -0.688191f, -0.587785f, -0.425325f }
};
MD2MODEL *Md2Model__create()
{
return (MD2MODEL*)GB.New(GB.FindClass("Md2Model"), NULL, NULL);
};
/*
This method creates and loads new Md2 model. To use this in the program you should declare
it first as ie.
Public model as Md2Model
Then initiate it loading
model = Md2Model.Load(name as string)
*/
BEGIN_METHOD(Md2Model_Load, GB_STRING name)
MD2MODEL *mdl = Md2Model__create();
char *filename = GB.ToZeroString (ARG(name));
FILE *fp;
int i,fi;
fp = fopen (filename, "rb");
if (!fp)
{
GB.Error ("Error: couldn't open \"%s\"!\n", filename);
return ;
}
// Read header
fi=fread (&mdl->ident, 1, sizeof (int), fp);
fi=fread (&mdl->version, 1, sizeof (int), fp);
fi=fread (&mdl->skinwidth, 1, sizeof (int), fp);
fi=fread (&mdl->skinheight, 1, sizeof (int), fp);
fi=fread (&mdl->framesize, 1, sizeof (int), fp);
fi=fread (&mdl->num_skins, 1, sizeof (int), fp);
fi=fread (&mdl->num_vertices, 1, sizeof (int), fp);
fi=fread (&mdl->num_st, 1, sizeof (int), fp);
fi=fread (&mdl->num_tris, 1, sizeof (int), fp);
fi=fread (&mdl->num_glcmds, 1, sizeof (int), fp);
fi=fread (&mdl->num_frames, 1, sizeof (int), fp);
fi=fread (&mdl->offset_skins, 1, sizeof (int), fp);
fi=fread (&mdl->offset_st, 1, sizeof (int), fp);
fi=fread (&mdl->offset_tris, 1, sizeof (int), fp);
fi=fread (&mdl->offset_frames, 1, sizeof (int), fp);
fi=fread (&mdl->offset_glcmds, 1, sizeof (int), fp);
fi=fread (&mdl->offset_end, 1, sizeof (int), fp);
if ((mdl->ident != 844121161) || (mdl->version != 8))
{
// Error!
GB.Error ("Error: bad version or identifier\n");
fclose (fp);
return;
}
// Memory allocations
GB.Alloc ((void *) &mdl->skins, sizeof (skinmd2) * mdl->num_skins );
GB.Alloc ((void *) &mdl->texcoords, sizeof (texCoordmd2) * mdl->num_st);
GB.Alloc ((void *) &mdl->triangles, sizeof (trianglemd2) * mdl->num_tris);
GB.Alloc ((void *) &mdl->frames, sizeof (framemd2) * mdl->num_frames);
GB.Alloc ((void *) &mdl->glcmds, sizeof (int) * mdl->num_glcmds);
// Read model data
fseek (fp, mdl->offset_skins, SEEK_SET);
fi=fread (mdl->skins, sizeof (skinmd2), mdl->num_skins, fp);
fseek (fp, mdl->offset_st, SEEK_SET);
fi=fread (mdl->texcoords, sizeof (texCoordmd2), mdl->num_st, fp);
fseek (fp, mdl->offset_tris, SEEK_SET);
fi=fread (mdl->triangles, sizeof (trianglemd2), mdl->num_tris, fp);
fseek (fp, mdl->offset_glcmds, SEEK_SET);
fi=fread (mdl->glcmds, sizeof (int), mdl->num_glcmds, fp);
// Read frames
fseek (fp, mdl->offset_frames, SEEK_SET);
for (i = 0; i < mdl->num_frames; ++i)
{
// Memory allocation for vertices of this frame
GB.Alloc ((void *) &mdl->frames[i].verts, sizeof (vertexmd2) * mdl->num_vertices);
// Read frame data
fi=fread (mdl->frames[i].scale, sizeof (float)*3, 1, fp);
fi=fread (mdl->frames[i].translate, sizeof (float)*3, 1, fp);
fi=fread (mdl->frames[i].name, sizeof (char), 16, fp);
fi=fread (mdl->frames[i].verts, sizeof (vertexmd2), mdl->num_vertices, fp);
}
i=fi;
mdl->scale[0]=1;
mdl->scale[1]=1;
mdl->scale[2]=1;
fclose (fp);
GB.ReturnObject(mdl);
END_METHOD
BEGIN_METHOD(Md2Model_SetPosition, GB_FLOAT x; GB_FLOAT y; GB_FLOAT z)
THIS->position[0]=VARG(x);
THIS->position[1]=VARG(y);
THIS->position[2]=VARG(z);
END_METHOD
BEGIN_METHOD(Md2Model_DrawFrame, GB_INTEGER f_no; GB_INTEGER texture)
int n = VARG(f_no);
int i, *pglcmds;
GLfloat v[3];
framemd2 *pframe;
vertexmd2 *pvert;
glcmd *packet;
// Check if n is in a valid range
if ((n < 0) || (n >= THIS->num_frames )) n=0;
glPushMatrix();
glTranslatef(THIS->position[0], THIS->position[1], THIS->position[2]);
glRotatef(-90, 1, 0, 0);
glRotatef(-90, 0, 0, 1);
glScalef(THIS->scale[0], THIS->scale[1], THIS->scale[2]);
// Enable model's texture
glBindTexture (GL_TEXTURE_2D, VARG(texture));
// pglcmds points at the start of the command list
pglcmds = THIS->glcmds;
// Draw the model
while ((i = *(pglcmds++)) != 0)
{
if (i < 0)
{
glBegin (GL_TRIANGLE_FAN);
i = -i;
}
else
{
glBegin (GL_TRIANGLE_STRIP);
}
// Draw each vertex of this group
for (/* Nothing */ ; i > 0; --i, pglcmds += 3)
{
packet = (glcmd *)pglcmds;
pframe = &THIS->frames[n];
pvert = &pframe->verts[packet->index];
// Pass texture coordinates to OpenGL
glTexCoord2f (packet->s, packet->t);
// Normal vector
glNormal3fv (anorms_table[pvert->normalIndex]);
// Calculate vertex real position
v[0] = (pframe->scale[0] * pvert->v[0]) + pframe->translate[0];
v[1] = (pframe->scale[1] * pvert->v[1]) + pframe->translate[1];
v[2] = (pframe->scale[2] * pvert->v[2]) + pframe->translate[2];
glVertex3fv (v);
}
glEnd ();
}
glScalef(1/THIS->scale[0], 1/THIS->scale[1], 1/THIS->scale[2]);
glPopMatrix();
END_METHOD
BEGIN_METHOD(Md2Model_DrawInterFrame, GB_INTEGER f_no; GB_FLOAT inter; GB_INTEGER texture)
int i, j, n=VARG(f_no);
GLfloat s, t, v_curr[3], v_next[3], v[3], norm[3];
float *n_curr, *n_next, interp = VARG(inter);
framemd2 *pframe1, *pframe2;
vertexmd2 *pvert1, *pvert2;
if ((n < 0) || (n >= THIS->num_frames-1)) {
n=0;
interp = 0;
}
glPushMatrix();
glTranslatef(THIS->position[0], THIS->position[1], THIS->position[2]);
glRotatef(-90, 1, 0, 0);
glRotatef(-90, 0, 0, 1);
glScalef(THIS->scale[0], THIS->scale[1], THIS->scale[2]);
glBindTexture (GL_TEXTURE_2D, VARG(texture));
glBegin (GL_TRIANGLES);
for (i = 0; i < THIS->num_tris; ++i)
{
for (j = 0; j < 3; ++j)
{
pframe1 = &THIS->frames[n];
pframe2 = &THIS->frames[n + 1];
pvert1 = &pframe1->verts[THIS->triangles[i].vertex[j]];
pvert2 = &pframe2->verts[THIS->triangles[i].vertex[j]];
s = (GLfloat)THIS->texcoords[THIS->triangles[i].st[j]].s / THIS->skinwidth;
t = (GLfloat)THIS->texcoords[THIS->triangles[i].st[j]].t / THIS->skinheight;
glTexCoord2f (s, t);
n_curr = anorms_table[pvert1->normalIndex];
n_next = anorms_table[pvert2->normalIndex];
norm[0] = n_curr[0] + interp * (n_next[0] - n_curr[0]);
norm[1] = n_curr[1] + interp * (n_next[1] - n_curr[1]);
norm[2] = n_curr[2] + interp * (n_next[2] - n_curr[2]);
glNormal3fv (norm);
v_curr[0] = pframe1->scale[0] * pvert1->v[0] + pframe1->translate[0];
v_curr[1] = pframe1->scale[1] * pvert1->v[1] + pframe1->translate[1];
v_curr[2] = pframe1->scale[2] * pvert1->v[2] + pframe1->translate[2];
v_next[0] = pframe2->scale[0] * pvert2->v[0] + pframe2->translate[0];
v_next[1] = pframe2->scale[1] * pvert2->v[1] + pframe2->translate[1];
v_next[2] = pframe2->scale[2] * pvert2->v[2] + pframe2->translate[2];
v[0] = v_curr[0] + interp * (v_next[0] - v_curr[0]);
v[1] = v_curr[1] + interp * (v_next[1] - v_curr[1]);
v[2] = v_curr[2] + interp * (v_next[2] - v_curr[2]);
glVertex3fv (v);
}
}
glEnd ();
glScalef(1/THIS->scale[0], 1/THIS->scale[1], 1/THIS->scale[2]);
glPopMatrix();
END_METHOD
BEGIN_METHOD_VOID(Md2Model_GetNoFrames)
GB.ReturnInteger(THIS->num_frames);
END_METHOD
BEGIN_METHOD(Md2Model_GetFrameName, GB_INTEGER fn )
GB.ReturnNewString(THIS->frames[VARG(fn)].name, 16);
END_METHOD
BEGIN_METHOD(Md2Model_Scale, GB_FLOAT sx; GB_FLOAT sy; GB_FLOAT sz)
THIS->scale[0] = VARG(sx);
THIS->scale[1] = VARG(sy);
THIS->scale[2] = VARG(sz);
END_METHOD
BEGIN_METHOD_VOID(Md2Model_free)
int i;
GB.Free ((void *) &THIS->skins);
GB.Free ((void *) &THIS->texcoords);
GB.Free ((void *) &THIS->triangles);
for (i = 0; i < THIS->num_frames; ++i) GB.Free ((void *) &THIS->frames[i].verts);
GB.Free ((void *) &THIS->frames);
GB.Free ((void *) &THIS->glcmds);
END_METHOD
GB_DESC Md2ModelDesc[] =
{
GB_DECLARE("Md2Model", sizeof(MD2MODEL)),
GB_NOT_CREATABLE(),
GB_STATIC_METHOD("Load", "Md2Model" , Md2Model_Load, "(Name)s"),
GB_METHOD("SetPosition", NULL, Md2Model_SetPosition, "(X)f(Y)f(Z)f" ),
GB_METHOD("DrawFrame", NULL, Md2Model_DrawFrame, "(Frame_No)i(Texture)i" ),
GB_METHOD("DrawInterFrame", NULL, Md2Model_DrawInterFrame, "(Frame_No)i(InterFrame)f(Texture)i" ),
GB_METHOD("GetFramesNo", "i", Md2Model_GetNoFrames, NULL ),
GB_METHOD("GetFrameName", "s", Md2Model_GetFrameName, "(FrameNumber)i" ),
GB_METHOD("Scale", NULL, Md2Model_Scale, "(Scale_x)f(Scale_y)f(Scale_z)f" ),
GB_METHOD("_free", NULL, Md2Model_free, NULL ),
GB_END_DECLARE
};

View File

@ -17,11 +17,16 @@ GB_COMPONENT_PKG_CONFIG(
glu, GLU, gb.opengl.glu, [glu],
[glu])
GB_COMPONENT_PKG_CONFIG(
sge, SGE, gb.opengl.sge, [sge],
[gl glew])
AC_OUTPUT( \
Makefile \
src/Makefile \
src/glu/Makefile \
src/glsl/Makefile \
src/sge/Makefile
)
GB_PRINT_MESSAGES

View File

@ -1,7 +1,7 @@
COMPONENT = gb.opengl
include $(top_srcdir)/component.am
SUBDIRS = . @GLSL_DIR@ @GLU_DIR@
SUBDIRS = . @GLSL_DIR@ @GLU_DIR@ @SGE_DIR@
gblib_LTLIBRARIES = gb.opengl.la

View File

@ -23,6 +23,8 @@
#define __GLU_C
#include "gb.image.h"
#include "GLU.h"
#include "GLUcoordTransf.h"
@ -31,6 +33,30 @@
#include "GLUnurb.h"
#include "GLUproject.h"
//---------------------------------------------------------------------------
BEGIN_METHOD(Glu_Color, GB_INTEGER color)
int r, g, b, a;
GB_COLOR_SPLIT(VARG(color), r, g, b, a);
//fprintf(stderr, "Glu_Color: %d %d %d %d\n", r, g, b, a);
if (a == 0)
glColor3d(r / 255.0, g / 255.0, b / 255.0);
else
glColor4d(r / 255.0, g / 255.0, b / 255.0, a / 255.0);
END_METHOD
BEGIN_METHOD(Glu_ClearColor, GB_INTEGER color)
int r, g, b, a;
GB_COLOR_SPLIT(VARG(color), r, g, b, a);
glClearColor(r / 255.0, g / 255.0, b / 255.0, a / 255.0);
END_METHOD
BEGIN_METHOD(GLUERRORSTRING, GB_INTEGER code)
const GLubyte *errStr = gluErrorString(VARG(code));
@ -38,7 +64,7 @@ BEGIN_METHOD(GLUERRORSTRING, GB_INTEGER code)
END_METHOD
/**************************************************************************/
//---------------------------------------------------------------------------
GB_DESC Cglu[] =
{
@ -86,6 +112,10 @@ GB_DESC Cglu[] =
GB_STATIC_METHOD("UnProject", "Float[]", GLUUNPROJECT, "(WindowX)f(WindowY)f(WindowZ)f(Modelview)Float[];(Projection)Float[];(Viewport)Integer[];"),
GB_STATIC_METHOD("UnProject4", "Float[]", GLUUNPROJECT4, "(WindowX)f(WindowY)f(WindowZ)f(ClipW)f(Modelview)Float[];(Projection)Float[];(Viewport)Integer[];(NearValue)f(FarValue)f"),
/* Setting a Gambas color */
GB_STATIC_METHOD("ClearColor", NULL, Glu_ClearColor, "(Color)i"),
GB_STATIC_METHOD("Color", NULL, Glu_Color, "(Color)i"),
/********************/
/* opengl constants */
/********************/

View File

@ -3,9 +3,9 @@ include $(top_srcdir)/component.am
gblib_LTLIBRARIES = gb.opengl.sge.la
gb_opengl_sge_la_LIBADD = @OPENGL_SGE_LIB@
gb_opengl_sge_la_LDFLAGS = -module @LD_FLAGS@ @OPENGL_SGE_LDFLAGS@
gb_opengl_sge_la_CPPFLAGS = @OPENGL_SGE_INC@
gb_opengl_sge_la_LIBADD = @SGE_LIB@
gb_opengl_sge_la_LDFLAGS = -module @LD_FLAGS@ @SGE_LDFLAGS@
gb_opengl_sge_la_CPPFLAGS = @SGE_INC@
gb_opengl_sge_la_SOURCES = \
main.c main.h \

View File

@ -0,0 +1,630 @@
/***************************************************************************
cmd2model.c
(c) 2012 Tomasz Kołodziejczyk "Tommyline"
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA.
***************************************************************************/
#define __CMD2MODEL_C
#include "gb_common.h"
#include "cmd2model.h"
#include <stdio.h>
#define THIS OBJECT(CMD2MODEL)
/* Table of precalculated normals */
GLfloat anorms_table[162][3] =
{
{ -0.525731f, 0.000000f, 0.850651f },
{ -0.442863f, 0.238856f, 0.864188f },
{ -0.295242f, 0.000000f, 0.955423f },
{ -0.309017f, 0.500000f, 0.809017f },
{ -0.162460f, 0.262866f, 0.951056f },
{ 0.000000f, 0.000000f, 1.000000f },
{ 0.000000f, 0.850651f, 0.525731f },
{ -0.147621f, 0.716567f, 0.681718f },
{ 0.147621f, 0.716567f, 0.681718f },
{ 0.000000f, 0.525731f, 0.850651f },
{ 0.309017f, 0.500000f, 0.809017f },
{ 0.525731f, 0.000000f, 0.850651f },
{ 0.295242f, 0.000000f, 0.955423f },
{ 0.442863f, 0.238856f, 0.864188f },
{ 0.162460f, 0.262866f, 0.951056f },
{ -0.681718f, 0.147621f, 0.716567f },
{ -0.809017f, 0.309017f, 0.500000f },
{ -0.587785f, 0.425325f, 0.688191f },
{ -0.850651f, 0.525731f, 0.000000f },
{ -0.864188f, 0.442863f, 0.238856f },
{ -0.716567f, 0.681718f, 0.147621f },
{ -0.688191f, 0.587785f, 0.425325f },
{ -0.500000f, 0.809017f, 0.309017f },
{ -0.238856f, 0.864188f, 0.442863f },
{ -0.425325f, 0.688191f, 0.587785f },
{ -0.716567f, 0.681718f, -0.147621f },
{ -0.500000f, 0.809017f, -0.309017f },
{ -0.525731f, 0.850651f, 0.000000f },
{ 0.000000f, 0.850651f, -0.525731f },
{ -0.238856f, 0.864188f, -0.442863f },
{ 0.000000f, 0.955423f, -0.295242f },
{ -0.262866f, 0.951056f, -0.162460f },
{ 0.000000f, 1.000000f, 0.000000f },
{ 0.000000f, 0.955423f, 0.295242f },
{ -0.262866f, 0.951056f, 0.162460f },
{ 0.238856f, 0.864188f, 0.442863f },
{ 0.262866f, 0.951056f, 0.162460f },
{ 0.500000f, 0.809017f, 0.309017f },
{ 0.238856f, 0.864188f, -0.442863f },
{ 0.262866f, 0.951056f, -0.162460f },
{ 0.500000f, 0.809017f, -0.309017f },
{ 0.850651f, 0.525731f, 0.000000f },
{ 0.716567f, 0.681718f, 0.147621f },
{ 0.716567f, 0.681718f, -0.147621f },
{ 0.525731f, 0.850651f, 0.000000f },
{ 0.425325f, 0.688191f, 0.587785f },
{ 0.864188f, 0.442863f, 0.238856f },
{ 0.688191f, 0.587785f, 0.425325f },
{ 0.809017f, 0.309017f, 0.500000f },
{ 0.681718f, 0.147621f, 0.716567f },
{ 0.587785f, 0.425325f, 0.688191f },
{ 0.955423f, 0.295242f, 0.000000f },
{ 1.000000f, 0.000000f, 0.000000f },
{ 0.951056f, 0.162460f, 0.262866f },
{ 0.850651f, -0.525731f, 0.000000f },
{ 0.955423f, -0.295242f, 0.000000f },
{ 0.864188f, -0.442863f, 0.238856f },
{ 0.951056f, -0.162460f, 0.262866f },
{ 0.809017f, -0.309017f, 0.500000f },
{ 0.681718f, -0.147621f, 0.716567f },
{ 0.850651f, 0.000000f, 0.525731f },
{ 0.864188f, 0.442863f, -0.238856f },
{ 0.809017f, 0.309017f, -0.500000f },
{ 0.951056f, 0.162460f, -0.262866f },
{ 0.525731f, 0.000000f, -0.850651f },
{ 0.681718f, 0.147621f, -0.716567f },
{ 0.681718f, -0.147621f, -0.716567f },
{ 0.850651f, 0.000000f, -0.525731f },
{ 0.809017f, -0.309017f, -0.500000f },
{ 0.864188f, -0.442863f, -0.238856f },
{ 0.951056f, -0.162460f, -0.262866f },
{ 0.147621f, 0.716567f, -0.681718f },
{ 0.309017f, 0.500000f, -0.809017f },
{ 0.425325f, 0.688191f, -0.587785f },
{ 0.442863f, 0.238856f, -0.864188f },
{ 0.587785f, 0.425325f, -0.688191f },
{ 0.688191f, 0.587785f, -0.425325f },
{ -0.147621f, 0.716567f, -0.681718f },
{ -0.309017f, 0.500000f, -0.809017f },
{ 0.000000f, 0.525731f, -0.850651f },
{ -0.525731f, 0.000000f, -0.850651f },
{ -0.442863f, 0.238856f, -0.864188f },
{ -0.295242f, 0.000000f, -0.955423f },
{ -0.162460f, 0.262866f, -0.951056f },
{ 0.000000f, 0.000000f, -1.000000f },
{ 0.295242f, 0.000000f, -0.955423f },
{ 0.162460f, 0.262866f, -0.951056f },
{ -0.442863f, -0.238856f, -0.864188f },
{ -0.309017f, -0.500000f, -0.809017f },
{ -0.162460f, -0.262866f, -0.951056f },
{ 0.000000f, -0.850651f, -0.525731f },
{ -0.147621f, -0.716567f, -0.681718f },
{ 0.147621f, -0.716567f, -0.681718f },
{ 0.000000f, -0.525731f, -0.850651f },
{ 0.309017f, -0.500000f, -0.809017f },
{ 0.442863f, -0.238856f, -0.864188f },
{ 0.162460f, -0.262866f, -0.951056f },
{ 0.238856f, -0.864188f, -0.442863f },
{ 0.500000f, -0.809017f, -0.309017f },
{ 0.425325f, -0.688191f, -0.587785f },
{ 0.716567f, -0.681718f, -0.147621f },
{ 0.688191f, -0.587785f, -0.425325f },
{ 0.587785f, -0.425325f, -0.688191f },
{ 0.000000f, -0.955423f, -0.295242f },
{ 0.000000f, -1.000000f, 0.000000f },
{ 0.262866f, -0.951056f, -0.162460f },
{ 0.000000f, -0.850651f, 0.525731f },
{ 0.000000f, -0.955423f, 0.295242f },
{ 0.238856f, -0.864188f, 0.442863f },
{ 0.262866f, -0.951056f, 0.162460f },
{ 0.500000f, -0.809017f, 0.309017f },
{ 0.716567f, -0.681718f, 0.147621f },
{ 0.525731f, -0.850651f, 0.000000f },
{ -0.238856f, -0.864188f, -0.442863f },
{ -0.500000f, -0.809017f, -0.309017f },
{ -0.262866f, -0.951056f, -0.162460f },
{ -0.850651f, -0.525731f, 0.000000f },
{ -0.716567f, -0.681718f, -0.147621f },
{ -0.716567f, -0.681718f, 0.147621f },
{ -0.525731f, -0.850651f, 0.000000f },
{ -0.500000f, -0.809017f, 0.309017f },
{ -0.238856f, -0.864188f, 0.442863f },
{ -0.262866f, -0.951056f, 0.162460f },
{ -0.864188f, -0.442863f, 0.238856f },
{ -0.809017f, -0.309017f, 0.500000f },
{ -0.688191f, -0.587785f, 0.425325f },
{ -0.681718f, -0.147621f, 0.716567f },
{ -0.442863f, -0.238856f, 0.864188f },
{ -0.587785f, -0.425325f, 0.688191f },
{ -0.309017f, -0.500000f, 0.809017f },
{ -0.147621f, -0.716567f, 0.681718f },
{ -0.425325f, -0.688191f, 0.587785f },
{ -0.162460f, -0.262866f, 0.951056f },
{ 0.442863f, -0.238856f, 0.864188f },
{ 0.162460f, -0.262866f, 0.951056f },
{ 0.309017f, -0.500000f, 0.809017f },
{ 0.147621f, -0.716567f, 0.681718f },
{ 0.000000f, -0.525731f, 0.850651f },
{ 0.425325f, -0.688191f, 0.587785f },
{ 0.587785f, -0.425325f, 0.688191f },
{ 0.688191f, -0.587785f, 0.425325f },
{ -0.955423f, 0.295242f, 0.000000f },
{ -0.951056f, 0.162460f, 0.262866f },
{ -1.000000f, 0.000000f, 0.000000f },
{ -0.850651f, 0.000000f, 0.525731f },
{ -0.955423f, -0.295242f, 0.000000f },
{ -0.951056f, -0.162460f, 0.262866f },
{ -0.864188f, 0.442863f, -0.238856f },
{ -0.951056f, 0.162460f, -0.262866f },
{ -0.809017f, 0.309017f, -0.500000f },
{ -0.864188f, -0.442863f, -0.238856f },
{ -0.951056f, -0.162460f, -0.262866f },
{ -0.809017f, -0.309017f, -0.500000f },
{ -0.681718f, 0.147621f, -0.716567f },
{ -0.681718f, -0.147621f, -0.716567f },
{ -0.850651f, 0.000000f, -0.525731f },
{ -0.688191f, 0.587785f, -0.425325f },
{ -0.587785f, 0.425325f, -0.688191f },
{ -0.425325f, 0.688191f, -0.587785f },
{ -0.425325f, -0.688191f, -0.587785f },
{ -0.587785f, -0.425325f, -0.688191f },
{ -0.688191f, -0.587785f, -0.425325f }
};
CMD2MODEL *MD2MODEL_create(void)
{
return (CMD2MODEL*)GB.New(GB.FindClass("Md2Model"), NULL, NULL);
};
static void draw_frame_inter(CMD2MODEL *_object, int n, float interp, int texture)
{
int i, j;
GLfloat s, t, v_curr[3], v_next[3], v[3], norm[3];
float *n_curr, *n_next;
framemd2 *pframe1, *pframe2;
vertexmd2 *pvert1, *pvert2;
bool enabled;
int *pglcmds;
framemd2 *pframe;
vertexmd2 *pvert;
glcmd *packet;
if (texture < 0)
return;
if ((n < 0) || (n >= THIS->num_frames-1))
{
n=0;
interp = 0;
}
enabled = glIsEnabled(GL_TEXTURE_2D);
if (!enabled)
glEnable(GL_TEXTURE_2D);
glPushMatrix();
glTranslatef(THIS->position[0], THIS->position[1], THIS->position[2]);
glRotatef(-90, 1, 0, 0);
glRotatef(-90, 0, 0, 1);
glScalef(THIS->scale[0], THIS->scale[1], THIS->scale[2]);
glBindTexture (GL_TEXTURE_2D, texture);
if (interp == 0)
{
// pglcmds points at the start of the command list
pglcmds = THIS->glcmds;
// Draw the model
while ((i = *(pglcmds++)) != 0)
{
if (i < 0)
{
glBegin (GL_TRIANGLE_FAN);
i = -i;
}
else
{
glBegin (GL_TRIANGLE_STRIP);
}
// Draw each vertex of this group
for (/* Nothing */ ; i > 0; --i, pglcmds += 3)
{
packet = (glcmd *)pglcmds;
pframe = &THIS->frames[n];
pvert = &pframe->verts[packet->index];
// Pass texture coordinates to OpenGL
glTexCoord2f (packet->s, packet->t);
// Normal vector
glNormal3fv (anorms_table[pvert->normalIndex]);
// Calculate vertex real position
v[0] = (pframe->scale[0] * pvert->v[0]) + pframe->translate[0];
v[1] = (pframe->scale[1] * pvert->v[1]) + pframe->translate[1];
v[2] = (pframe->scale[2] * pvert->v[2]) + pframe->translate[2];
glVertex3fv (v);
}
glEnd ();
}
}
else
{
glBegin (GL_TRIANGLES);
for (i = 0; i < THIS->num_tris; ++i)
{
for (j = 0; j < 3; ++j)
{
pframe1 = &THIS->frames[n];
pframe2 = &THIS->frames[n + 1];
pvert1 = &pframe1->verts[THIS->triangles[i].vertex[j]];
pvert2 = &pframe2->verts[THIS->triangles[i].vertex[j]];
s = (GLfloat)THIS->texcoords[THIS->triangles[i].st[j]].s / THIS->skinwidth;
t = (GLfloat)THIS->texcoords[THIS->triangles[i].st[j]].t / THIS->skinheight;
glTexCoord2f (s, t);
n_curr = anorms_table[pvert1->normalIndex];
n_next = anorms_table[pvert2->normalIndex];
norm[0] = n_curr[0] + interp * (n_next[0] - n_curr[0]);
norm[1] = n_curr[1] + interp * (n_next[1] - n_curr[1]);
norm[2] = n_curr[2] + interp * (n_next[2] - n_curr[2]);
glNormal3fv (norm);
v_curr[0] = pframe1->scale[0] * pvert1->v[0] + pframe1->translate[0];
v_curr[1] = pframe1->scale[1] * pvert1->v[1] + pframe1->translate[1];
v_curr[2] = pframe1->scale[2] * pvert1->v[2] + pframe1->translate[2];
v_next[0] = pframe2->scale[0] * pvert2->v[0] + pframe2->translate[0];
v_next[1] = pframe2->scale[1] * pvert2->v[1] + pframe2->translate[1];
v_next[2] = pframe2->scale[2] * pvert2->v[2] + pframe2->translate[2];
v[0] = v_curr[0] + interp * (v_next[0] - v_curr[0]);
v[1] = v_curr[1] + interp * (v_next[1] - v_curr[1]);
v[2] = v_curr[2] + interp * (v_next[2] - v_curr[2]);
glVertex3fv (v);
}
}
glEnd();
}
//glScalef(1/THIS->scale[0], 1/THIS->scale[1], 1/THIS->scale[2]);
glPopMatrix();
if (!enabled)
glDisable(GL_TEXTURE_2D);
}
// // Generate one list for each frame
//
// static void make_lists(CMD2MODEL *mdl)
// {
// int i;
//
// mdl->list = glGenLists(mdl->num_frames);
//
// for (i = 0; i < mdl->num_frames; i++)
// {
// glNewList(mdl->list + i, GL_COMPILE);
// draw_frame_inter(mdl, i, 0, mdl->texture);
// glEndList();
// }
// }
//---------------------------------------------------------------------------
BEGIN_METHOD_VOID(Md2Model_new)
THIS->texture = -1;
END_METHOD
BEGIN_METHOD_VOID(Md2Model_free)
int i;
GB.Free ((void *) &THIS->skins);
GB.Free ((void *) &THIS->texcoords);
GB.Free ((void *) &THIS->triangles);
for (i = 0; i < THIS->num_frames; ++i)
GB.Free ((void *) &THIS->frames[i].verts);
GB.Free ((void *) &THIS->frames);
GB.Free ((void *) &THIS->glcmds);
END_METHOD
/*
This method creates and loads new Md2 model. To use this in the program you should declare
it first as ie.
Public model as Md2Model
Then initiate it loading
model = Md2Model.Load(name as string)
*/
BEGIN_METHOD(Md2Model_Load, GB_STRING name)
char *addr;
int len;
CMD2MODEL *mdl = NULL;
int i;
if (GB.LoadFile(STRING(name), LENGTH(name), &addr, &len))
return;
mdl = MD2MODEL_create();
// Read header
{
int *p = (int *)addr;
mdl->ident = *p++;
mdl->version = *p++;
mdl->skinwidth = *p++;
mdl->skinheight = *p++;
mdl->framesize = *p++;
mdl->num_skins = *p++;
mdl->num_vertices = *p++;
mdl->num_st = *p++;
mdl->num_tris = *p++;
mdl->num_glcmds = *p++;
mdl->num_frames = *p++;
mdl->offset_skins = *p++;
mdl->offset_st = *p++;
mdl->offset_tris = *p++;
mdl->offset_frames = *p++;
mdl->offset_glcmds = *p++;
mdl->offset_end = *p++;
}
if ((mdl->ident != 844121161) || (mdl->version != 8))
{
// Error!
GB.Error("Bad version or identifier");
goto __ERROR;
}
// Memory allocations
GB.Alloc ((void *) &mdl->skins, sizeof (skinmd2) * mdl->num_skins );
GB.Alloc ((void *) &mdl->texcoords, sizeof (texCoordmd2) * mdl->num_st);
GB.Alloc ((void *) &mdl->triangles, sizeof (trianglemd2) * mdl->num_tris);
GB.Alloc ((void *) &mdl->frames, sizeof (framemd2) * mdl->num_frames);
GB.Alloc ((void *) &mdl->glcmds, sizeof (int) * mdl->num_glcmds);
// Read model data
memcpy(mdl->skins, &addr[mdl->offset_skins], sizeof(skinmd2) * mdl->num_skins);
//fseek (fp, mdl->offset_st, SEEK_SET);
//fi=fread (mdl->texcoords, sizeof (texCoordmd2), mdl->num_st, fp);
memcpy(mdl->texcoords, &addr[mdl->offset_st], sizeof(texCoordmd2) * mdl->num_st);
//fseek (fp, mdl->offset_tris, SEEK_SET);
//fi=fread (mdl->triangles, sizeof (trianglemd2), mdl->num_tris, fp);
memcpy(mdl->triangles, &addr[mdl->offset_tris], sizeof(trianglemd2) * mdl->num_tris);
//fseek (fp, mdl->offset_glcmds, SEEK_SET);
//fi=fread (mdl->glcmds, sizeof (int), mdl->num_glcmds, fp);
memcpy(mdl->glcmds, &addr[mdl->offset_glcmds], sizeof(int) * mdl->num_glcmds);
// Read frames
//fseek (fp, mdl->offset_frames, SEEK_SET);
{
char *p = &addr[mdl->offset_frames];
for (i = 0; i < mdl->num_frames; ++i)
{
// Memory allocation for vertices of this frame
GB.Alloc((void *) &mdl->frames[i].verts, sizeof (vertexmd2) * mdl->num_vertices);
// Read frame data
memcpy(mdl->frames[i].scale, p, sizeof(float) * 3); p += sizeof(float) * 3;
memcpy(mdl->frames[i].translate, p, sizeof(float) * 3); p += sizeof(float) * 3;
memcpy(mdl->frames[i].name, p, 16); p += 16;
memcpy(mdl->frames[i].verts, p, sizeof(vertexmd2) * mdl->num_vertices); p += sizeof(vertexmd2) * mdl->num_vertices;
//fi=fread (mdl->frames[i].scale, sizeof (float)*3, 1, fp);
//fi=fread (mdl->frames[i].translate, sizeof (float)*3, 1, fp);
//fi=fread (mdl->frames[i].name, sizeof (char), 16, fp);
//fi=fread (mdl->frames[i].verts, sizeof (vertexmd2), mdl->num_vertices, fp);
}
}
mdl->scale[0] = 1;
mdl->scale[1] = 1;
mdl->scale[2] = 1;
GB.ReleaseFile(addr, len);
GB.ReturnObject(mdl);
return;
__ERROR:
GB.ReleaseFile(addr, len);
GB.Unref(POINTER(&mdl));
END_METHOD
BEGIN_METHOD(Md2Model_Move, GB_FLOAT x; GB_FLOAT y; GB_FLOAT z)
THIS->position[0] = VARG(x);
THIS->position[1] = VARG(y);
THIS->position[2] = VARG(z);
END_METHOD
BEGIN_PROPERTY(Md2Model_X)
if (READ_PROPERTY)
GB.ReturnFloat(THIS->position[0]);
else
THIS->position[0] = VPROP(GB_FLOAT);
END_PROPERTY
BEGIN_PROPERTY(Md2Model_Y)
if (READ_PROPERTY)
GB.ReturnFloat(THIS->position[1]);
else
THIS->position[1] = VPROP(GB_FLOAT);
END_PROPERTY
BEGIN_PROPERTY(Md2Model_Z)
if (READ_PROPERTY)
GB.ReturnFloat(THIS->position[2]);
else
THIS->position[2] = VPROP(GB_FLOAT);
END_PROPERTY
BEGIN_METHOD(Md2Model_Scale, GB_FLOAT sx; GB_FLOAT sy; GB_FLOAT sz)
THIS->scale[0] = VARG(sx);
THIS->scale[1] = VARG(sy);
THIS->scale[2] = VARG(sz);
END_METHOD
BEGIN_PROPERTY(Md2Model_Count)
GB.ReturnInteger(THIS->num_frames);
END_PROPERTY
BEGIN_METHOD(Md2Model_get, GB_INTEGER frame)
int frame = VARG(frame);
if (frame < 0 || frame >= THIS->num_frames)
{
GB.Error(GB_ERR_BOUND);
return;
}
THIS->frame = frame;
RETURN_SELF();
END_METHOD
BEGIN_PROPERTY(Md2Model_Texture)
if (READ_PROPERTY)
GB.ReturnInteger(THIS->texture);
else
THIS->texture = VPROP(GB_INTEGER);
END_PROPERTY
BEGIN_PROPERTY(Md2Model_Pos)
if (READ_PROPERTY)
GB.ReturnFloat(THIS->pos);
else
THIS->pos = VPROP(GB_FLOAT);
END_PROPERTY
BEGIN_METHOD_VOID(Md2Model_Draw)
draw_frame_inter(THIS, (int)THIS->pos, THIS->pos - (int)THIS->pos, THIS->texture);
END_METHOD
//---------------------------------------------------------------------------
BEGIN_METHOD(Md2Model_Frame_Draw, GB_INTEGER texture)
draw_frame_inter(THIS, THIS->frame, 0, VARG(texture));
END_METHOD
BEGIN_METHOD(Md2Model_Frame_DrawInter, GB_FLOAT inter; GB_INTEGER texture)
draw_frame_inter(THIS, THIS->frame, VARG(inter), VARG(texture));
END_METHOD
BEGIN_PROPERTY(Md2Model_Frame_Name)
GB.ReturnNewZeroString(THIS->frames[THIS->frame].name);
END_METHOD
//---------------------------------------------------------------------------
GB_DESC Md2ModelFrameDesc[] =
{
GB_DECLARE_VIRTUAL(".Md2Model.Frame"),
GB_PROPERTY_READ("Name", "s", Md2Model_Frame_Name),
GB_METHOD("Draw", NULL, Md2Model_Frame_Draw, "(Texture)i"),
GB_METHOD("DrawInter", NULL, Md2Model_Frame_DrawInter, "(InterFrame)f(Texture)i"),
GB_END_DECLARE
};
GB_DESC Md2ModelDesc[] =
{
GB_DECLARE("Md2Model", sizeof(CMD2MODEL)), GB_NOT_CREATABLE(),
GB_METHOD("_new", NULL, Md2Model_new, NULL),
GB_METHOD("_free", NULL, Md2Model_free, NULL),
GB_STATIC_METHOD("Load", "Md2Model" , Md2Model_Load, "(Name)s"),
GB_METHOD("Move", NULL, Md2Model_Move, "(X)f(Y)f(Z)f"),
GB_PROPERTY_READ("X", "f", Md2Model_X),
GB_PROPERTY_READ("Y", "f", Md2Model_Y),
GB_PROPERTY_READ("Z", "f", Md2Model_Z),
GB_PROPERTY_READ("Count", "i", Md2Model_Count),
GB_METHOD("_get", ".Md2Model.Frame", Md2Model_get, "(Frame)i"),
GB_METHOD("Scale", NULL, Md2Model_Scale, "(ScaleX)f(ScaleY)f(ScaleZ)f" ),
GB_PROPERTY("Texture", "i", Md2Model_Texture),
GB_PROPERTY("Pos", "f", Md2Model_Pos),
GB_METHOD("Draw", NULL, Md2Model_Draw, NULL),
GB_END_DECLARE
};

View File

@ -58,6 +58,10 @@
#include "gambas.h"
#include "main.h"
#ifndef __CMD2MODEL_C
extern GB_DESC Md2ModelFrameDesc[];
extern GB_DESC Md2ModelDesc[];
#endif
/* Vector */
typedef float vec3[3];
@ -114,54 +118,54 @@ struct md2_glcmd
}glcmd;
extern GB_DESC Md2ModelDesc[] ;
typedef
struct {
GB_BASE ob;
//Header
int ident;
int version;
int version;
int skinwidth;
int skinheight;
int skinwidth;
int skinheight;
int framesize;
int framesize;
int num_skins;
int num_vertices;
int num_st;
int num_tris;
int num_glcmds;
int num_frames;
int num_skins;
int num_vertices;
int num_st;
int num_tris;
int num_glcmds;
int num_frames;
int offset_skins;
int offset_st;
int offset_tris;
int offset_frames;
int offset_glcmds;
int offset_end;
int offset_skins;
int offset_st;
int offset_tris;
int offset_frames;
int offset_glcmds;
int offset_end;
//End header
skinmd2 *skins;
texCoordmd2 *texcoords;
trianglemd2 *triangles;
framemd2 *frames;
int *glcmds;
texCoordmd2 *texcoords;
trianglemd2 *triangles;
framemd2 *frames;
int *glcmds;
GLuint tex_id;
GLuint tex_id;
//Model specific data
float position[3];
float scale[3];
int f_no;
float inter_frame;
int frame; // frame being accessed with the [] operator
int texture;
double pos;
//End model specific data
}
MD2MODEL;
CMD2MODEL;
MD2MODEL *MD2MODEL_create();
CMD2MODEL *MD2MODEL_create(void);
#endif

View File

@ -32,6 +32,7 @@ GB_INTERFACE GB EXPORT;
GB_DESC *GB_CLASSES[] EXPORT =
{
Md2ModelFrameDesc,
Md2ModelDesc,
NULL

View File

@ -63,6 +63,8 @@ DECLARE_EVENT(EVENT_GotFocus);
DECLARE_EVENT(EVENT_LostFocus);
DECLARE_EVENT(EVENT_Menu);
int TRAYICON_count = 0;
static int _state;
static QList<CTRAYICON *> _list;
static QImage _default_trayicon;
@ -115,6 +117,8 @@ static void destroy_widget(CTRAYICON *_object)
{
delete WIDGET;
THIS->widget = NULL;
TRAYICON_count--;
MAIN_check_quit();
}
}
@ -260,6 +264,7 @@ BEGIN_METHOD_VOID(CTRAYICON_show)
wid->installEventFilter(&CTrayIcon::manager);
THIS->widget = wid;
TRAYICON_count++;
//QObject::connect(WIDGET, SIGNAL(embedded()), &CTrayIcon::manager, SLOT(embedded()));
//QObject::connect(WIDGET, SIGNAL(containerClosed()), &CTrayIcon::manager, SLOT(closed()));

View File

@ -38,6 +38,7 @@
#ifndef __CTRAYICON_CPP
extern GB_DESC CTrayIconDesc[];
extern GB_DESC CTrayIconsDesc[];
extern int TRAYICON_count;
#else
#define THIS ((CTRAYICON *)_object)

View File

@ -571,7 +571,7 @@ static bool must_quit(void)
#if DEBUG_WINDOW
qDebug("must_quit: Window = %d Watch = %d in_event_loop = %d", CWindow::count, CWatch::count, in_event_loop);
#endif
return CWINDOW_must_quit() && CWatch::count == 0 && in_event_loop && MAIN_in_message_box == 0;
return CWINDOW_must_quit() && CWatch::count == 0 && in_event_loop && MAIN_in_message_box == 0 && TRAYICON_count == 0;
}
static void check_quit_now(intptr_t param)

View File

@ -176,7 +176,7 @@ void GLarea::paintGL()
{
// clear to avoid garbage
CleanupOnFirstShow = true;
qglClearColor(Qt::black);
//qglClearColor(Qt::black);
glClear(GL_COLOR_BUFFER_BIT);
}

View File

@ -711,7 +711,7 @@ void ERROR_hook(void)
if (no_rec)
return;
if (PROJECT_class)
if (PROJECT_class && PROJECT_class->state)
{
handle_error = (CLASS_DESC_METHOD *)CLASS_get_symbol_desc_kind(PROJECT_class, "Application_Error", CD_STATIC_METHOD, 0);

View File

@ -134,7 +134,7 @@ static bool _convert_##__name(void *a, GB_TYPE type, GB_VALUE *conv)
{ \
if (a) \
{ \
double norm = _abs_##__name(a); \
double norm = _fabs_##__name(a); \
\
switch (type) \
{ \

View File

@ -111,12 +111,13 @@ typedef
// Split a color into its component. Uninvert the alpha component
#define GB_COLOR_SPLIT(_color, _r, _g, _b, _a) \
{ \
_b = (_color) & 0xFF; \
_g = ((_color) >> 8) & 0xFF; \
_r = ((_color) >> 16) & 0xFF; \
_a = ((_color) >> 24) ^ 0xFF; \
}
({ \
uint _c = (uint)(_color); \
_b = _c & 0xFF; \
_g = (_c >> 8) & 0xFF; \
_r = (_c >> 16) & 0xFF; \
_a = (_c >> 24) ^ 0xFF; \
})
// Create a GB_COLOR from rgba components