| 
									
										
										
										
											2006-04-02 21:04:20 +00:00
										 |  |  | //
 | 
					
						
							|  |  |  | #include <iostream>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "RAS_ListRasterizer.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef WIN32
 | 
					
						
							|  |  |  | #include <windows.h>
 | 
					
						
							|  |  |  | #endif // WIN32
 | 
					
						
							|  |  |  | #ifdef __APPLE__
 | 
					
						
							|  |  |  | #define GL_GLEXT_LEGACY 1
 | 
					
						
							|  |  |  | #include <OpenGL/gl.h>
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #include <GL/gl.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "RAS_TexVert.h"
 | 
					
						
							|  |  |  | #include "RAS_GLExtensionManager.h"
 | 
					
						
							|  |  |  | #include "MT_assert.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef NDEBUG
 | 
					
						
							| 
									
										
										
										
											2006-04-03 01:28:43 +00:00
										 |  |  | #ifdef WIN32
 | 
					
						
							| 
									
										
										
										
											2006-04-02 21:04:20 +00:00
										 |  |  | #define spit(x) std::cout << x << std::endl;
 | 
					
						
							| 
									
										
										
										
											2006-04-03 01:28:43 +00:00
										 |  |  | #endif //WIN32
 | 
					
						
							| 
									
										
										
										
											2006-04-02 21:04:20 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | #define spit(x)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | RAS_ListSlot::RAS_ListSlot() | 
					
						
							|  |  |  | :	KX_ListSlot(), | 
					
						
							|  |  |  | 	m_flag(LIST_MODIFY|LIST_CREATE), | 
					
						
							|  |  |  | 	m_list(0) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | RAS_ListSlot::~RAS_ListSlot() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	RemoveList(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void RAS_ListSlot::RemoveList() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if(m_list != 0) { | 
					
						
							|  |  |  | 		spit("Releasing display list (" << m_list << ")"); | 
					
						
							|  |  |  | 		glDeleteLists((GLuint)m_list, 1); | 
					
						
							|  |  |  | 		m_list =0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void RAS_ListSlot::DrawList() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if(m_flag &LIST_STREAM || m_flag& LIST_NOCREATE) { | 
					
						
							|  |  |  | 		RemoveList(); | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if(m_flag &LIST_MODIFY) { | 
					
						
							|  |  |  | 		if(m_flag &LIST_CREATE) { | 
					
						
							|  |  |  | 			if(m_list == 0) { | 
					
						
							|  |  |  | 				m_list = (unsigned int)glGenLists(1); | 
					
						
							|  |  |  | 				m_flag =  m_flag &~ LIST_CREATE; | 
					
						
							|  |  |  | 				spit("Created display list (" << m_list << ")"); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if(m_list != 0) | 
					
						
							|  |  |  | 			glNewList((GLuint)m_list, GL_COMPILE_AND_EXECUTE); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 		m_flag |= LIST_BEGIN; | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	glCallList(m_list); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void RAS_ListSlot::EndList() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if(m_flag & LIST_BEGIN) { | 
					
						
							|  |  |  | 		glEndList(); | 
					
						
							|  |  |  | 		m_flag = m_flag &~(LIST_BEGIN|LIST_MODIFY); | 
					
						
							|  |  |  | 		m_flag |= LIST_END; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void RAS_ListSlot::SetModified(bool mod) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if(mod && !(m_flag & LIST_MODIFY)) { | 
					
						
							|  |  |  | 		spit("Modifying list (" << m_list << ")"); | 
					
						
							|  |  |  | 		m_flag = m_flag &~ LIST_END; | 
					
						
							|  |  |  | 		m_flag |= LIST_MODIFY; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool RAS_ListSlot::End() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return (m_flag &LIST_END)!=0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | RAS_ListRasterizer::RAS_ListRasterizer(RAS_ICanvas* canvas) | 
					
						
							|  |  |  | :	RAS_OpenGLRasterizer(canvas) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	// --
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | RAS_ListRasterizer::~RAS_ListRasterizer()  | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	ReleaseAlloc(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | RAS_ListSlot* RAS_ListRasterizer::FindOrAdd(const vecVertexArray& vertexarrays, KX_ListSlot** slot) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 Keep a copy of constant lists submitted for rendering, | 
					
						
							|  |  |  | 		this guards against (replicated)new...delete every frame, | 
					
						
							|  |  |  | 		and we can reuse lists! | 
					
						
							|  |  |  | 		:: sorted by vertex array | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	RAS_ListSlot* localSlot = (RAS_ListSlot*)*slot; | 
					
						
							|  |  |  | 	if(!localSlot) { | 
					
						
							|  |  |  | 		RAS_Lists::iterator it = mLists.find(vertexarrays); | 
					
						
							|  |  |  | 		if(it == mLists.end()) { | 
					
						
							|  |  |  | 			localSlot = new RAS_ListSlot(); | 
					
						
							|  |  |  | 			mLists.insert(std::pair<vecVertexArray, RAS_ListSlot*>(vertexarrays, localSlot)); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			localSlot = it->second; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	MT_assert(localSlot); | 
					
						
							|  |  |  | 	return localSlot; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void RAS_ListRasterizer::ReleaseAlloc() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	RAS_Lists::iterator it = mLists.begin(); | 
					
						
							|  |  |  | 	while(it != mLists.end()) { | 
					
						
							|  |  |  | 		delete it->second; | 
					
						
							|  |  |  | 		it++; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	mLists.clear(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void RAS_ListRasterizer::IndexPrimitives( | 
					
						
							|  |  |  | 	const vecVertexArray & vertexarrays, | 
					
						
							|  |  |  | 	const vecIndexArrays & indexarrays, | 
					
						
							|  |  |  | 	int mode, | 
					
						
							|  |  |  | 	class RAS_IPolyMaterial* polymat, | 
					
						
							|  |  |  | 	class RAS_IRenderTools* rendertools, | 
					
						
							|  |  |  | 	bool useObjectColor, | 
					
						
							|  |  |  | 	const MT_Vector4& rgbacolor, | 
					
						
							|  |  |  | 	class KX_ListSlot** slot) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	RAS_ListSlot* localSlot =0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// useObjectColor(are we updating every frame?)
 | 
					
						
							|  |  |  | 	if(!useObjectColor) { | 
					
						
							|  |  |  | 		localSlot = FindOrAdd(vertexarrays, slot); | 
					
						
							|  |  |  | 		localSlot->DrawList(); | 
					
						
							|  |  |  | 		if(localSlot->End())  | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	RAS_OpenGLRasterizer::IndexPrimitives( | 
					
						
							|  |  |  | 			vertexarrays, indexarrays, | 
					
						
							|  |  |  | 			mode, polymat, | 
					
						
							|  |  |  | 			rendertools, useObjectColor, | 
					
						
							|  |  |  | 			rgbacolor,slot | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(!useObjectColor) { | 
					
						
							|  |  |  | 		localSlot->EndList(); | 
					
						
							|  |  |  | 		*slot = localSlot; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void RAS_ListRasterizer::IndexPrimitivesMulti( | 
					
						
							|  |  |  | 		const vecVertexArray& vertexarrays, | 
					
						
							|  |  |  | 		const vecIndexArrays & indexarrays, | 
					
						
							|  |  |  | 		int mode, | 
					
						
							|  |  |  | 		class RAS_IPolyMaterial* polymat, | 
					
						
							|  |  |  | 		class RAS_IRenderTools* rendertools, | 
					
						
							|  |  |  | 		bool useObjectColor, | 
					
						
							|  |  |  | 		const MT_Vector4& rgbacolor, | 
					
						
							|  |  |  | 		class KX_ListSlot** slot) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	RAS_ListSlot* localSlot =0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// useObjectColor(are we updating every frame?)
 | 
					
						
							|  |  |  | 	if(!useObjectColor) { | 
					
						
							|  |  |  | 		localSlot = FindOrAdd(vertexarrays, slot); | 
					
						
							|  |  |  | 		localSlot->DrawList(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if(localSlot->End())  | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	RAS_OpenGLRasterizer::IndexPrimitivesMulti( | 
					
						
							|  |  |  | 			vertexarrays, indexarrays, | 
					
						
							|  |  |  | 			mode, polymat, | 
					
						
							|  |  |  | 			rendertools, useObjectColor, | 
					
						
							|  |  |  | 			rgbacolor,slot | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | 	if(!useObjectColor) { | 
					
						
							|  |  |  | 		localSlot->EndList(); | 
					
						
							|  |  |  | 		*slot = localSlot; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // eof
 |