void CHardwareTextureBuffer::UnlockSource(CMemoryBuffer & buf)
{
	//BindBuffer();

	if(!glUnmapBufferARB(mUsage))
	{
		UnbindBuffer();
		throw NOVA_EXP("HardwareVertexBuffer::LockSource(): Can not map v-buffer memory..", BAD_OPERATION);
	}

	UnbindBuffer();
}
Exemplo n.º 2
0
	void Model::Draw(const Matrix4f& transform) const
	{
		if (_vbuffer == 0)
			return;

		auto video = _context->GetModule<Video>();

		if (!video->BindBuffer(_vbuffer, Vertex3::DECLARE.size, Vertex3::DECLARE.types, Vertex3::DECLARE.count))
			return;

		glPushMatrix();
		glMultMatrixf(transform.GetData());

		video->BindTexture(_texture);
		if (_ibuffer && video->BindBuffer(_ibuffer, 0, 0, 0))
		{
			video->DrawIndexedPrimitives(_topology, _icount, VALUE_USHORT);
			video->UnbindBuffer(_ibuffer, 0, 0);
		}
		else video->DrawPrimitives(_topology, _vcount, 0);
		glPopMatrix();

		video->UnbindBuffer(_vbuffer, Vertex3::DECLARE.types, Vertex3::DECLARE.count);
	}
CMemoryBuffer CHardwareTextureBuffer::LockSource(size_t offset, size_t length, THardwareBufferLock opt)
{
	nova::byte *mapper = NULL;
	CMemoryBuffer result;

	if((offset + length) > mSize)
		throw NOVA_EXP("HardwareVertexBuffer::LockSource(): Calling length and size very large..", BAD_OPERATION);

	BindBuffer();


	GLenum method;
	if(mUsage == GL_PIXEL_UNPACK_BUFFER_ARB)
	{
	// Note that glMapBufferARB() causes sync issue.
	// If GPU is working with this buffer, glMapBufferARB() will wait(stall)
	// until GPU to finish its job. To avoid waiting (idle), you can call
	// first glBufferDataARB() with NULL pointer before glMapBufferARB().
	// If you do that, the previous data in PBO will be discarded and
	// glMapBufferARB() returns a new allocated pointer immediately
	// even if GPU is still working with the previous data.
		glBufferDataARB(mUsage, mSize, 0, GL_STREAM_DRAW_ARB);
		method = GL_WRITE_ONLY_ARB;
	}
	else
		method = GL_READ_ONLY_ARB;

	
	if((mapper = static_cast<nova::byte *>(glMapBufferARB(mUsage, method))) != NULL)
	{
		mapper += offset;
		CMemoryBuffer res(mapper, length);

		result = res;
	}
	else
	{
		UnbindBuffer();
		throw NOVA_EXP("HardwareVertexBuffer::LockSource(): Can not map v-buffer memory..", BAD_OPERATION);
	}

	//UnbindBuffer();

	return result;
}
Exemplo n.º 4
0
Buffer::Buffer(GraphicsDevice* graphicsDevice,BufferType bufferType, BufferUsage bufferUsage, 
			   unsigned int elementSize, unsigned int numberOfElements, 
			   GLvoid* bufferData): _graphicsDevice(graphicsDevice),
			   _bufferType(bufferType), _bufferUsage(bufferUsage),
			   _buffer(0), _stride(0), 
			   _elementSize(elementSize), _numberOfElements(numberOfElements)
{
	//Generate the buffer
	_graphicsDevice->GenerateBuffers(1, &_buffer);
    
	//Bind the buffer to the context
	BindBuffer();

	//Set the buffer data
	_graphicsDevice->SetBufferData(_bufferType, (_elementSize * _numberOfElements), bufferData, _bufferUsage);

	//Unbind the buffer
	UnbindBuffer();
}
////////////// Index buffer implementation ////////////////////////////////////
CHardwareTextureBuffer::CHardwareTextureBuffer(size_t size, THardwareBufferLock opt)
{
	if(mBufID > 0)
	{
		if(!CRenderSystem::GetSingelton().CheckCapabilities(BASIC_CATEGORY, CAP_PBO))
			throw NOVA_EXP("CHardwareTextureBuffer: You card do not support pbo extention..", BAD_OPERATION);

		if(size == 0)
			throw NOVA_EXP("CHardwareTextureBuffer(): You trying to create v-buffer with zero length..", BAD_OPERATION);

		BindBuffer();

		GLuint usage;
		switch(opt)
		{
			case HWB_DYNAMIC:
				usage = GL_STREAM_READ_ARB;
				mUsage = GL_PIXEL_PACK_BUFFER_ARB;
				break;
			default:
				usage = GL_STREAM_DRAW_ARB;
				mUsage = GL_PIXEL_UNPACK_BUFFER_ARB;
				break;
		}

		// Preparing pixel buffer
		glBufferDataARB(mUsage, size, 0, usage);

		mReady = true;
		mSize = size;

		UnbindBuffer();
	}
	else
		throw NOVA_EXP("CHardwareTextureBuffer(): v-buffer id not created..", BAD_OPERATION);
}
Exemplo n.º 6
0
void
vsDisplayList::AppendOp(vsDisplayList::op * o)
{
	OpCode type = o->type;

	switch( type )
	{
		case OpCode_SetColor:
			SetColor( o->data.GetColor() );
			break;
		case OpCode_SetColors:
			SetColors( (vsColor*)o->data.p, o->data.GetUInt() );
			break;
		case OpCode_SetColorsBuffer:
			SetColorsBuffer( (vsRenderBuffer*)o->data.p );
			break;
		case OpCode_VertexArray:
			VertexArray( (vsVector3D *)o->data.p, o->data.GetUInt() );
			break;
		case OpCode_NormalArray:
			NormalArray( (vsVector3D *)o->data.p, o->data.GetUInt() );
			break;
		case OpCode_TexelArray:
			TexelArray( (vsVector2D *)o->data.p, o->data.GetUInt() );
			break;
		case OpCode_ColorArray:
			ColorArray( (vsColor *)o->data.p, o->data.GetUInt() );
			break;
		case OpCode_VertexBuffer:
			VertexBuffer( (vsRenderBuffer *)o->data.p );
			break;
		case OpCode_TexelBuffer:
			TexelBuffer( (vsRenderBuffer *)o->data.p );
			break;
		case OpCode_ColorBuffer:
			ColorBuffer( (vsRenderBuffer *)o->data.p );
			break;
		case OpCode_BindBuffer:
			BindBuffer( (vsRenderBuffer *)o->data.p );
			break;
		case OpCode_UnbindBuffer:
			UnbindBuffer( (vsRenderBuffer *)o->data.p );
			break;
		case OpCode_ClearVertexArray:
			ClearVertexArray();
			break;
		case OpCode_ClearNormalArray:
			ClearNormalArray();
			break;
		case OpCode_ClearTexelArray:
			ClearTexelArray();
			break;
		case OpCode_ClearColorArray:
			ClearColorArray();
			break;
		case OpCode_ClearArrays:
			ClearArrays();
			break;
		case OpCode_LineListArray:
			LineListArray( (int *)o->data.p, o->data.GetUInt() );
			break;
		case OpCode_LineStripArray:
			LineStripArray( (int *)o->data.p, o->data.GetUInt() );
			break;
		case OpCode_TriangleListArray:
			TriangleListArray( (int *)o->data.p, o->data.GetUInt() );
			break;
		case OpCode_TriangleStripArray:
			TriangleStripArray( (int *)o->data.p, o->data.GetUInt() );
			break;
		case OpCode_PointsArray:
			PointsArray( (int *)o->data.p, o->data.GetUInt() );
			break;
		case OpCode_LineListBuffer:
			LineListBuffer( (vsRenderBuffer *)o->data.p );
			break;
		case OpCode_LineStripBuffer:
			LineStripBuffer( (vsRenderBuffer *)o->data.p );
			break;
		case OpCode_TriangleStripBuffer:
			TriangleStripBuffer( (vsRenderBuffer *)o->data.p );
			break;
		case OpCode_TriangleFanArray:
			TriangleFanArray( (int *)o->data.p, o->data.GetUInt() );
			break;
		case OpCode_PushTransform:
			PushTransform( o->data.GetTransform() );
			break;
		case OpCode_SetCameraTransform:
			SetCameraTransform( o->data.GetTransform() );
			break;
		case OpCode_SetMatrix4x4:
			SetMatrix4x4( o->data.GetMatrix4x4() );
			break;
		case OpCode_PushMatrix4x4:
			PushMatrix4x4( o->data.GetMatrix4x4() );
			break;
		case OpCode_SetMatrices4x4:
			SetMatrices4x4( (vsMatrix4x4*)o->data.p, o->data.i );
			break;
		case OpCode_SetMatrices4x4Buffer:
			SetMatrices4x4Buffer( (vsRenderBuffer*)o->data.p );
			break;
		case OpCode_SetWorldToViewMatrix4x4:
			SetWorldToViewMatrix4x4( o->data.GetMatrix4x4() );
			break;
		case OpCode_Set3DProjection:
			Set3DProjection( o->data.fov, o->data.nearPlane, o->data.farPlane );
			break;
		case OpCode_SetProjectionMatrix4x4:
			SetProjectionMatrix4x4( o->data.GetMatrix4x4() );
			break;
		case OpCode_PopTransform:
			PopTransform();
			break;
		case OpCode_EnableStencil:
			EnableStencil();
			break;
		case OpCode_DisableStencil:
			DisableStencil();
			break;
		case OpCode_EnableScissor:
			EnableScissor( o->data.GetBox2D() );
			break;
		case OpCode_DisableScissor:
			DisableScissor();
			break;
		case OpCode_ClearStencil:
			ClearStencil();
			break;
		case OpCode_SetViewport:
			SetViewport( o->data.GetBox2D() );
			break;
		case OpCode_ClearViewport:
			ClearViewport();
			break;
		case OpCode_Debug:
			Debug( o->data.GetString() );
			break;
		default:
			break;
	}
}