133
RAS_ListSlot* RAS_ListRasterizer::FindOrAdd(const vecVertexArray& vertexarrays, KX_ListSlot** slot)
129
RAS_ListSlot* RAS_ListRasterizer::FindOrAdd(RAS_MeshSlot& ms)
136
132
Keep a copy of constant lists submitted for rendering,
137
133
this guards against (replicated)new...delete every frame,
138
134
and we can reuse lists!
139
:: sorted by vertex array
135
:: sorted by mesh slot
141
RAS_ListSlot* localSlot = (RAS_ListSlot*)*slot;
137
RAS_ListSlot* localSlot = (RAS_ListSlot*)ms.m_DisplayList;
143
RAS_Lists::iterator it = mLists.find(vertexarrays);
139
RAS_Lists::iterator it = mLists.find(&ms);
144
140
if(it == mLists.end()) {
145
141
localSlot = new RAS_ListSlot(this);
146
mLists.insert(std::pair<vecVertexArray, RAS_ListSlot*>(vertexarrays, localSlot));
142
mLists.insert(std::pair<RAS_MeshSlot*, RAS_ListSlot*>(&ms, localSlot));
148
144
localSlot = static_cast<RAS_ListSlot*>(it->second->AddRef());
166
void RAS_ListRasterizer::IndexPrimitives(
167
const vecVertexArray & vertexarrays,
168
const vecIndexArrays & indexarrays,
170
class RAS_IPolyMaterial* polymat,
171
class RAS_IRenderTools* rendertools,
173
const MT_Vector4& rgbacolor,
174
class KX_ListSlot** slot)
161
void RAS_ListRasterizer::IndexPrimitives(RAS_MeshSlot& ms)
176
163
RAS_ListSlot* localSlot =0;
178
// useObjectColor(are we updating every frame?)
179
if(!useObjectColor) {
180
localSlot = FindOrAdd(vertexarrays, slot);
165
if(ms.m_bDisplayList) {
166
localSlot = FindOrAdd(ms);
181
167
localSlot->DrawList();
182
168
if(localSlot->End()) {
183
169
// save slot here too, needed for replicas and object using same mesh
184
170
// => they have the same vertexarray but different mesh slot
171
ms.m_DisplayList = localSlot;
190
if (mUseVertexArrays) {
191
RAS_VAOpenGLRasterizer::IndexPrimitives(
192
vertexarrays, indexarrays,
194
rendertools, useObjectColor,
198
RAS_OpenGLRasterizer::IndexPrimitives(
199
vertexarrays, indexarrays,
201
rendertools, useObjectColor,
176
if (mUseVertexArrays)
177
RAS_VAOpenGLRasterizer::IndexPrimitives(ms);
179
RAS_OpenGLRasterizer::IndexPrimitives(ms);
206
if(!useObjectColor) {
181
if(ms.m_bDisplayList) {
207
182
localSlot->EndList();
183
ms.m_DisplayList = localSlot;
213
void RAS_ListRasterizer::IndexPrimitivesMulti(
214
const vecVertexArray& vertexarrays,
215
const vecIndexArrays & indexarrays,
217
class RAS_IPolyMaterial* polymat,
218
class RAS_IRenderTools* rendertools,
220
const MT_Vector4& rgbacolor,
221
class KX_ListSlot** slot)
188
void RAS_ListRasterizer::IndexPrimitivesMulti(RAS_MeshSlot& ms)
223
190
RAS_ListSlot* localSlot =0;
225
// useObjectColor(are we updating every frame?)
226
if(!useObjectColor) {
227
localSlot = FindOrAdd(vertexarrays, slot);
192
if(ms.m_bDisplayList) {
193
localSlot = FindOrAdd(ms);
228
194
localSlot->DrawList();
230
196
if(localSlot->End()) {
231
197
// save slot here too, needed for replicas and object using same mesh
232
198
// => they have the same vertexarray but different mesh slot
199
ms.m_DisplayList = localSlot;
238
if (mUseVertexArrays) {
239
RAS_VAOpenGLRasterizer::IndexPrimitivesMulti(
240
vertexarrays, indexarrays,
242
rendertools, useObjectColor,
246
RAS_OpenGLRasterizer::IndexPrimitivesMulti(
247
vertexarrays, indexarrays,
249
rendertools, useObjectColor,
204
// workaround: note how we do not use vertex arrays for making display
205
// lists, since glVertexAttribPointerARB doesn't seem to work correct
206
// in display lists on ATI? either a bug in the driver or in Blender ..
207
if (mUseVertexArrays && !localSlot)
208
RAS_VAOpenGLRasterizer::IndexPrimitivesMulti(ms);
210
RAS_OpenGLRasterizer::IndexPrimitivesMulti(ms);
254
if(!useObjectColor) {
212
if(ms.m_bDisplayList) {
255
213
localSlot->EndList();
214
ms.m_DisplayList = localSlot;