|
#include "StdAfx.h"
#include "GLSpectrumRender.h"
GLSpectrumRender::GLSpectrumRender() :
m_bAllowedToRender(false),
m_bIsRunning(false),
m_bIsInitialized(false),
m_rgbColors(0),
m_xyzVertices(0)
{
}
GLSpectrumRender::~GLSpectrumRender()
{
if(!m_bAllowedToRender)
return;
glBindBuffer( 1, m_rgbColors);
glDeleteBuffers( 1, &m_rgbColors);
glBindBuffer( GL_ARRAY_BUFFER, 0);
glBindBuffer( 1, m_xyzVertices);
glDeleteBuffers( 1, &m_xyzVertices);
glBindBuffer( GL_ARRAY_BUFFER, 0);
}
void GLSpectrumRender::Initialize()
{
if(m_bIsRunning)
return;
m_bIsRunning = true;
m_hRenderThread = (HANDLE)_beginthread( &GLSpectrumRender::Run, 0, this );
}
void GLSpectrumRender::Destroy()
{
DWORD dwExitCode = STILL_ACTIVE;
while(dwExitCode == STILL_ACTIVE)
{
m_bIsRunning = false;
if ( GetExitCodeThread(m_hRenderThread, &dwExitCode) )
{
if(dwExitCode == STILL_ACTIVE)
Sleep(1);
}
else
{
dwExitCode = 0;
}
}
}
void GLSpectrumRender::SubmitData(unsigned char* pucLeft, unsigned char* pucRight, HDC dc)
{
if(m_bIsInitialized == false)
{
m_bIsInitialized = true;
m_bAllowedToRender = true;
GLRenderContext::Initialize(dc);
glBindBuffer = NULL;
glDeleteBuffers = NULL;
glGenBuffers = NULL;
glIsBuffer = NULL;
glBufferData = NULL;
glBufferSubData = NULL;
glGetBufferSubData = NULL;
glMapBuffer = NULL;
glUnmapBuffer = NULL;
glGetBufferParameteriv = NULL;
glGetBufferPointerv = NULL;
glBindBuffer = (PFNGLBINDBUFFERARBPROC)wglGetProcAddress("glBindBufferARB");
glDeleteBuffers = (PFNGLDELETEBUFFERSARBPROC)wglGetProcAddress("glDeleteBuffersARB");
glGenBuffers = (PFNGLGENBUFFERSARBPROC)wglGetProcAddress("glGenBuffersARB");
glIsBuffer = (PFNGLISBUFFERARBPROC)wglGetProcAddress("glIsBufferARB");
glBufferData = (PFNGLBUFFERDATAARBPROC)wglGetProcAddress("glBufferDataARB");
glBufferSubData = (PFNGLBUFFERSUBDATAARBPROC)wglGetProcAddress("glBufferSubDataARB");
glGetBufferSubData = (PFNGLGETBUFFERSUBDATAARBPROC)wglGetProcAddress("glGetBufferSubDataARB");
glMapBuffer = (PFNGLMAPBUFFERARBPROC)wglGetProcAddress("glMapBufferARB");
glUnmapBuffer = (PFNGLUNMAPBUFFERARBPROC)wglGetProcAddress("glUnmapBufferARB");
glGetBufferParameteriv= (PFNGLGETBUFFERPARAMETERIVARBPROC)wglGetProcAddress("glGetBufferParameterivARB");
glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVARBPROC)wglGetProcAddress("glGetBufferPointervARB");
if( !glBindBuffer|| !glDeleteBuffers|| !glGenBuffers||
!glIsBuffer|| !glBufferData|| !glBufferSubData||
!glGetBufferSubData|| !glMapBuffer|| !glUnmapBuffer||
!glGetBufferParameteriv|| !glGetBufferPointerv)
{
m_bIsInitialized = true; // Don't allow further initialization since this failed.
}
unsigned int size = 1024 * 1024 * 3 * sizeof( float);
glGenBuffers( 1, &m_rgbColors);
glBindBuffer( GL_ARRAY_BUFFER, m_rgbColors);
glBufferData( GL_ARRAY_BUFFER, size, 0, GL_DYNAMIC_DRAW);
glBindBuffer( GL_ARRAY_BUFFER, 0);
glGenBuffers( 1, &m_xyzVertices);
glBindBuffer( GL_ARRAY_BUFFER, m_xyzVertices);
glBufferData( GL_ARRAY_BUFFER, size, 0, GL_DYNAMIC_DRAW);
glBindBuffer( GL_ARRAY_BUFFER, 0);
}
if(!m_bAllowedToRender)
return;
m_buffer.InsertData(pucLeft, pucRight);
glBindBuffer( GL_ARRAY_BUFFER, m_rgbColors);
glMapBuffer( GL_ARRAY_BUFFER, GL_WRITE_ONLY );
glUnmapBuffer( GL_ARRAY_BUFFER );
glBindBuffer( GL_ARRAY_BUFFER, 0 );
glBindBuffer( GL_ARRAY_BUFFER, m_xyzVertices);
glMapBuffer( GL_ARRAY_BUFFER, GL_WRITE_ONLY );
glUnmapBuffer( GL_ARRAY_BUFFER );
glBindBuffer( GL_ARRAY_BUFFER, 0 );
Render(dc);
}
void GLSpectrumRender::Run(void* context)
{
GLSpectrumRender &This = *(GLSpectrumRender*)context;
while(This.m_bIsRunning)
{
}
}
void GLSpectrumRender::Render(HDC hDC)
{
if(m_bAllowedToRender == false)
return;
GLRenderContext::Begin(hDC, FALSE);
GLRenderContext::End(hDC);
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
I'm a Microsoft Certified Professional (MCP) in C++. I'm fluent in C/C++, C# and many other languages.