1 /***************************************************************************
2 model.cpp - description
3 -------------------
4 begin : may 22th, 2004
5 copyright : (C) 2004-2007 by Duong Khang NGUYEN
6 email : neoneurone @ gmail com
7
8 $Id: model.cpp 450 2010-11-21 19:11:43Z neoneurone $
9 ***************************************************************************/
10
11 /***************************************************************************
12 * *
13 * This program is free software; you can redistribute it and/or modify *
14 * it under the terms of the GNU General Public License as published by *
15 * the Free Software Foundation; either version 2 of the License, or *
16 * any later version. *
17 * *
18 ***************************************************************************/
19
20 #include "model.h"
21
22
23 /*=====================================================================*/
Model(GLuint dlOpaqueOneSide,GLuint dlOpaqueTwoSide,GLuint dlAlpha)24 Model::Model
25 (
26 GLuint dlOpaqueOneSide,
27 GLuint dlOpaqueTwoSide,
28 GLuint dlAlpha
29 ):
30 _uiOpaqueOneSide( dlOpaqueOneSide ),
31 _uiOpaqueTwoSide( dlOpaqueTwoSide ),
32 _uiAlpha( dlAlpha )
33 {
34 OPENCITY_DEBUG( "Pctor 1" );
35 }
36
37
38 /*=====================================================================*/
Model(GLuint dlOpaqueOneSide,GLuint dlOpaqueTwoSide,GLuint dlAlpha,const string & rcsTextureFile)39 Model::Model
40 (
41 GLuint dlOpaqueOneSide,
42 GLuint dlOpaqueTwoSide,
43 GLuint dlAlpha,
44 const string& rcsTextureFile
45 ):
46 _uiOpaqueOneSide( dlOpaqueOneSide ),
47 _uiOpaqueTwoSide( dlOpaqueTwoSide ),
48 _uiAlpha( dlAlpha ),
49 moTexture( rcsTextureFile )
50 {
51 OPENCITY_DEBUG( "Pctor 2" );
52 }
53
54
55 /*=====================================================================*/
~Model()56 Model::~Model()
57 {
58 OPENCITY_DEBUG( "dtor" );
59
60 // Delete display lists
61 if (glIsList( _uiOpaqueOneSide ))
62 glDeleteLists( _uiOpaqueOneSide, 1 );
63 if (glIsList( _uiOpaqueTwoSide ))
64 glDeleteLists( _uiOpaqueTwoSide, 1 );
65 if (glIsList( _uiAlpha ))
66 glDeleteLists( _uiAlpha, 1 );
67 }
68
69
70 /*=====================================================================*/
71 void
DisplayList() const72 Model::DisplayList() const
73 {
74 assert( _uiOpaqueOneSide != 0 );
75 assert( _uiOpaqueTwoSide != 0 );
76
77 glCallList( _uiOpaqueOneSide );
78 glCallList( _uiOpaqueTwoSide );
79 if (glIsList( _uiAlpha ))
80 glCallList( _uiAlpha );
81 }
82
83
84 /*=====================================================================*/
85 void
DisplayList(const OC_FLOAT & rcfW,const OC_FLOAT & rcfL,const signed char tabY[]) const86 Model::DisplayList
87 (
88 const OC_FLOAT & rcfW,
89 const OC_FLOAT & rcfL,
90 const signed char tabY[]
91 ) const
92 {
93 assert( tabY != NULL );
94 assert( _uiOpaqueOneSide != 0 );
95 assert( _uiOpaqueTwoSide != 0 );
96
97 // Call the opaque list first, then the alpha list
98 // glMatrixMode( GL_MODELVIEW ); // default matrix mode
99 glPushMatrix();
100 glTranslatef( rcfW, tabY[0], rcfL );
101 glCallList( _uiOpaqueOneSide );
102 glCallList( _uiOpaqueTwoSide );
103 if (glIsList( _uiAlpha ))
104 glCallList( _uiAlpha );
105 glPopMatrix();
106 }
107
108
109 /*=====================================================================*/
110 void
DisplayList(const OC_FLOAT & rcfW,const OC_FLOAT & rcfL,const signed char tabY[],const uint dlMask) const111 Model::DisplayList
112 (
113 const OC_FLOAT & rcfW,
114 const OC_FLOAT & rcfL,
115 const signed char tabY[],
116 const uint dlMask
117 ) const
118 {
119 assert( tabY != NULL );
120 assert( _uiOpaqueOneSide != 0 );
121 assert( _uiOpaqueTwoSide != 0 );
122
123 // Call the selected lists
124 // glMatrixMode( GL_MODELVIEW ); // default matrix mode
125 glPushMatrix();
126
127 // Correct for a 1x1 model
128 GLdouble matrix[16] = {
129 1,tabY[3]-tabY[0],0,0,
130 0,1,0,0,
131 0,tabY[1]-tabY[0],1,0,
132 0,0,0,1
133 };
134 glMultMatrixd(matrix);
135
136 glTranslatef( rcfW, tabY[0]-rcfW*(tabY[3]-tabY[0])-rcfL*(tabY[1]-tabY[0]), rcfL );
137 // glTranslatef( rcfW, tabY[0], rcfL );
138 if (dlMask & OC_OPAQUE_ONESIDE_LIST)
139 glCallList( _uiOpaqueOneSide );
140 if (dlMask & OC_OPAQUE_TWOSIDE_LIST)
141 glCallList( _uiOpaqueTwoSide );
142 if (dlMask & OC_ALPHA_LIST and glIsList( _uiAlpha ))
143 glCallList( _uiAlpha );
144 glPopMatrix();
145 }
146