Welcome to mirror list, hosted at ThFree Co, Russian Federation.

RAS_VAOpenGLRasterizer.cpp « RAS_OpenGLRasterizer « Rasterizer « gameengine « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: fe582a3d2ee1629d4029c2163c5c2071d69b0abf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
#ifdef WIN32


#include "RAS_VAOpenGLRasterizer.h"


#include <windows.h>
#include "GL/gl.h"

typedef void (APIENTRY *GLLOCKARRAYSEXTPTR)(GLint first,GLsizei count);
typedef void (APIENTRY *GLUNLOCKARRAYSEXTPTR)(void);
void APIENTRY RAS_lockfunc(GLint first,GLsizei count) {};
void APIENTRY RAS_unlockfunc() {};
GLLOCKARRAYSEXTPTR glLockArraysEXT=RAS_lockfunc;
GLUNLOCKARRAYSEXTPTR glUnlockArraysEXT=RAS_unlockfunc;




#include "STR_String.h"
#include "RAS_TexVert.h"
#include "MT_CmMatrix4x4.h"
#include "RAS_IRenderTools.h" // rendering text

	
RAS_VAOpenGLRasterizer::RAS_VAOpenGLRasterizer(RAS_ICanvas* canvas)
:RAS_OpenGLRasterizer(canvas)
{
	int i = 0;
}



RAS_VAOpenGLRasterizer::~RAS_VAOpenGLRasterizer()
{
}



bool RAS_VAOpenGLRasterizer::Init()
{
	
	bool result = RAS_OpenGLRasterizer::Init();
	
	if (result)
	{
		// if possible, add extensions to other platforms too, if this
		// rasterizer becomes messy just derive one for each platform 
		// (ie. KX_Win32Rasterizer, KX_LinuxRasterizer etc.)
		
		glUnlockArraysEXT = reinterpret_cast<GLUNLOCKARRAYSEXTPTR>(wglGetProcAddress("glUnlockArraysEXT"));
		if (!glUnlockArraysEXT)
			result = false;
		
		glLockArraysEXT = reinterpret_cast<GLLOCKARRAYSEXTPTR>(wglGetProcAddress("glLockArraysEXT"));
		if (!glLockArraysEXT)
			result=false;
		
		glEnableClientState(GL_VERTEX_ARRAY);
		glDisableClientState(GL_TEXTURE_COORD_ARRAY);
		glDisableClientState(GL_NORMAL_ARRAY);
		glDisableClientState(GL_COLOR_ARRAY);

		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	}

	return result;
}



void RAS_VAOpenGLRasterizer::SetDrawingMode(int drawingmode)
{
	m_drawingmode = drawingmode;

		switch (m_drawingmode)
	{
	case KX_BOUNDINGBOX:
		{
		}
	case KX_WIREFRAME:
		{
			glDisable (GL_CULL_FACE);
			break;
		}
	case KX_TEXTURED:
		{
		}
	case KX_SHADED:
		{
			glEnableClientState(GL_COLOR_ARRAY);
		}
	case KX_SOLID:
		{
			break;
		}
	default:
		{
		}
	}
}



void RAS_VAOpenGLRasterizer::Exit()
{
	glDisableClientState(GL_VERTEX_ARRAY);
	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
	glDisableClientState(GL_COLOR_ARRAY);
	glDisableClientState(GL_NORMAL_ARRAY);
	glDisable(GL_COLOR_MATERIAL);

	RAS_OpenGLRasterizer::Exit();
}



void RAS_VAOpenGLRasterizer::IndexPrimitives( const vecVertexArray& vertexarrays,
							const vecIndexArrays & indexarrays,
							int mode,
							class RAS_IPolyMaterial* polymat,
							class RAS_IRenderTools* rendertools,
							bool useObjectColor,
							const MT_Vector4& rgbacolor)
{
	unsigned char* mypointer=NULL;
	static const GLsizei vtxstride = sizeof(RAS_TexVert);
	GLenum drawmode;
	switch (mode)
	{
	case 0:
		{
		drawmode = GL_TRIANGLES;
		break;
		}
	case 2:
		{
		drawmode = GL_QUADS;
		break;
		}
	case 1:	//lines
		{
		}
	default:
		{
		drawmode = GL_LINES;
		break;
		}
	}
	const RAS_TexVert* vertexarray;
	int numindices,vt;
	if (drawmode != GL_LINES)
	{
		if (useObjectColor)
		{
			glDisableClientState(GL_COLOR_ARRAY);
			glColor4d(rgbacolor[0], rgbacolor[1], rgbacolor[2], rgbacolor[3]);
		} else
		{
			glColor4d(0,0,0,1.0);
			glEnableClientState(GL_COLOR_ARRAY);
		}
	}
	else
	{
		glColor3d(0,0,0);
	}
	// use glDrawElements to draw each vertexarray
	for (vt=0;vt<vertexarrays.size();vt++)
	{
		vertexarray = &((*vertexarrays[vt]) [0]);
		const KX_IndexArray & indexarray = (*indexarrays[vt]);
		numindices = indexarray.size();
		int numverts = vertexarrays[vt]->size();

		if (!numindices)
			break;
		
		mypointer = (unsigned char*)(vertexarray);
		glVertexPointer(3,GL_FLOAT,vtxstride,mypointer);
		mypointer+= 3*sizeof(float);
		glTexCoordPointer(2,GL_FLOAT,vtxstride,mypointer);
		mypointer+= 2*sizeof(float);
		glColorPointer(4,GL_UNSIGNED_BYTE,vtxstride,mypointer);
		mypointer += sizeof(int);
		glNormalPointer(GL_SHORT,vtxstride,mypointer);
		glLockArraysEXT(0,numverts);
		// here the actual drawing takes places
		glDrawElements(drawmode,numindices,GL_UNSIGNED_INT,&(indexarray[0]));
		glUnlockArraysEXT();
	}
}


void RAS_VAOpenGLRasterizer::EnableTextures(bool enable)
{
	if (enable)
		glEnableClientState(GL_TEXTURE_COORD_ARRAY);
	else
		glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}

bool RAS_VAOpenGLRasterizer::Stereo()
{
/*
	if(m_stereomode == RAS_STEREO_NOSTEREO)
		return false;
	else
		return true;
*/
	return false;
}


#endif //WIN32