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