Esempio n. 1
0
void Drawable::compileGLObjects(RenderInfo& renderInfo) const
{

#ifdef OSG_GL_DISPLAYLISTS_AVAILABLE
    if (!renderInfo.getState()->useVertexBufferObject(_supportsVertexBufferObjects && _useVertexBufferObjects) && _useDisplayList)
    {
        // get the contextID (user defined ID of 0 upwards) for the
        // current OpenGL context.
        unsigned int contextID = renderInfo.getContextID();

        // get the globj for the current contextID.
        GLuint& globj = _globjList[contextID];

        // call the globj if already set otherwise compile and execute.
        if( globj != 0 )
        {
            glDeleteLists( globj, 1 );
        }

        globj = generateDisplayList(contextID, getGLObjectSizeHint());
        glNewList( globj, GL_COMPILE );

        drawInner(renderInfo);

        glEndList();
    }
#endif
}
Esempio n. 2
0
void NullModel::render(const RenderInfo& info) const {
	if (info.checkFlag(RENDER_TEXTURE_2D))
    {
		aabb_draw_solid(_aabbLocal, info.getFlags());
	}
	else
    {
		aabb_draw_wire(_aabbLocal);
	}
}
Esempio n. 3
0
void Drawable::compileGLObjects(RenderInfo& renderInfo) const
{
    if (!_useDisplayList) return;

#ifdef OSG_GL_DISPLAYLISTS_AVAILABLE
    // get the contextID (user defined ID of 0 upwards) for the
    // current OpenGL context.
    unsigned int contextID = renderInfo.getContextID();

    // get the globj for the current contextID.
    GLuint& globj = _globjList[contextID];

    // call the globj if already set otherwise compile and execute.
    if( globj != 0 )
    {
        glDeleteLists( globj, 1 );
    }

    globj = generateDisplayList(contextID, getGLObjectSizeHint());
    glNewList( globj, GL_COMPILE );

    if (_drawCallback.valid())
        _drawCallback->drawImplementation(renderInfo,this);
    else
        drawImplementation(renderInfo);

    glEndList();
#else
    OSG_NOTICE<<"Warning: Drawable::compileGLObjects(RenderInfo&) - not supported."<<std::endl;
#endif
}
void RenderablePatchFixedWireframe::render(const RenderInfo& info) const
{
    if (_tess.vertices.empty() || _tess.indices.empty()) return;

    // No colour changing
    glDisableClientState(GL_COLOR_ARRAY);
    if (info.checkFlag(RENDER_VERTEX_COLOUR))
    {
        glColor3f(1, 1, 1);
    }

    if (_needsUpdate)
    {
        _needsUpdate = false;

        // Create a VBO and add the vertex data
        VertexBuffer_T currentVBuf;
        currentVBuf.addVertices(_tess.vertices.begin(), _tess.vertices.end());

        // Submit index batches
        const RenderIndex* strip_indices = &_tess.indices.front();
        for (std::size_t i = 0;
            i < _tess.m_numStrips;
            i++, strip_indices += _tess.m_lenStrips)
        {
            currentVBuf.addIndexBatch(strip_indices, _tess.m_lenStrips);
        }

        // Render all index batches
        _vertexBuf.replaceData(currentVBuf);
    }

    _vertexBuf.renderAllBatches(GL_QUAD_STRIP);
}
// Back-end render function
void RenderablePicoSurface::render(const RenderInfo& info) const
{
	// Invoke appropriate display list
	if (info.checkFlag(RENDER_PROGRAM))
    {
        if (info.checkFlag(RENDER_VERTEX_COLOUR))
        {
            glCallList(_dlProgramVcol);
        }
        else
        {
            glCallList(_dlProgramNoVCol);
        }
	}
	else
    {
		glCallList(_dlRegular);
	}
}
Esempio n. 6
0
//// Drawable functions ////
void DMesh::draw( RenderInfo& r) {
	glPushMatrix();
	glMultMatrixf(m_transform);
	// Material
	r.material( Drawable::m_material );
	r.state( 1 + (getNormalPointer()? 2:0) + (getTexCoordPointer()?4:0) );
	glVertexPointer(3, GL_FLOAT, getStride(), getVertexPointer());
	glNormalPointer(   GL_FLOAT, getStride(), getNormalPointer());
	glTexCoordPointer(2, GL_FLOAT, getStride(), getTexCoordPointer());
	// Tangents?
	if(getTangentPointer() && base::Shader::current().ready()) {
		base::Shader::current().AttributePointer("tangent", 3, GL_FLOAT, 0, getStride(), getTangentPointer());
	}
	// Draw it
	if(hasIndices()) glDrawElements( getMode(), getSize(), GL_UNSIGNED_SHORT, getIndexPointer());
	else glDrawArrays( getMode(), 0, getSize());

	glPopMatrix();
}
Esempio n. 7
0
// Back-end render
void MD5Surface::render(const RenderInfo& info) const
{
	if (info.checkFlag(RENDER_BUMP))
    {
		glCallList(_lightingList);
	}
	else
    {
		glCallList(_normalList);
	}
}
Esempio n. 8
0
void RenderablePatchSolid::render(const RenderInfo& info) const
{
#ifdef PATCHES_USE_VBO
	glBindBuffer(GL_ARRAY_BUFFER, _vboData);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _vboIdx);
	
	glNormalPointer(GL_DOUBLE, sizeof(ArbitraryMeshVertex), BUFFER_OFFSET(16));
	glClientActiveTexture(GL_TEXTURE0);
	glTexCoordPointer(2, GL_DOUBLE, sizeof(ArbitraryMeshVertex), BUFFER_OFFSET(0));
	glVertexPointer(3, GL_DOUBLE, sizeof(ArbitraryMeshVertex), BUFFER_OFFSET(40));

	const RenderIndex* strip_indices = 0;

	for (std::size_t i = 0; i < m_tess.m_numStrips; i++, strip_indices += m_tess.m_lenStrips)
	{
		glDrawElements(GL_QUAD_STRIP, GLsizei(m_tess.m_lenStrips), RenderIndexTypeID, strip_indices);
	}

	GlobalOpenGL().assertNoErrors();

	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
	glBindBuffer(GL_ARRAY_BUFFER, 0);
#else
	if (m_tess.vertices.empty() || m_tess.indices.empty()) return;

	if (info.checkFlag(RENDER_BUMP))
	{
		glVertexAttribPointerARB(11, 3, GL_DOUBLE, 0, sizeof(ArbitraryMeshVertex), &m_tess.vertices.front().normal);
		glVertexAttribPointerARB(8, 2, GL_DOUBLE, 0, sizeof(ArbitraryMeshVertex), &m_tess.vertices.front().texcoord);
		glVertexAttribPointerARB(9, 3, GL_DOUBLE, 0, sizeof(ArbitraryMeshVertex), &m_tess.vertices.front().tangent);
		glVertexAttribPointerARB(10, 3, GL_DOUBLE, 0, sizeof(ArbitraryMeshVertex), &m_tess.vertices.front().bitangent);
	}
	else
	{
		glNormalPointer(GL_DOUBLE, sizeof(ArbitraryMeshVertex), &m_tess.vertices.front().normal);
		glTexCoordPointer(2, GL_DOUBLE, sizeof(ArbitraryMeshVertex), &m_tess.vertices.front().texcoord);
	}

	glVertexPointer(3, GL_DOUBLE, sizeof(ArbitraryMeshVertex), &m_tess.vertices.front().vertex);

	const RenderIndex* strip_indices = &m_tess.indices.front();

	for(std::size_t i = 0; i<m_tess.m_numStrips; i++, strip_indices += m_tess.m_lenStrips)
	{
		glDrawElements(GL_QUAD_STRIP, GLsizei(m_tess.m_lenStrips), RenderIndexTypeID, strip_indices);
	}

#if defined(_DEBUG)
	//RenderNormals();
#endif

#endif
}
void RenderablePatchSolid::render(const RenderInfo& info) const
{
    if (_tess.vertices.empty() || _tess.indices.empty()) return;

    if (!info.checkFlag(RENDER_BUMP))
    {
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    }

    // No colour changing
    glDisableClientState(GL_COLOR_ARRAY);
    if (info.checkFlag(RENDER_VERTEX_COLOUR))
    {
        glColor3f(1, 1, 1);
    }

    if (_needsUpdate)
    {
        _needsUpdate = false;

        // Add vertex geometry to vertex buffer
        VertexBuffer_T currentVBuf;
        currentVBuf.addVertices(_tess.vertices.begin(), _tess.vertices.end());

        // Submit indices
        const RenderIndex* strip_indices = &_tess.indices.front();
        for (std::size_t i = 0;
            i < _tess.m_numStrips;
            i++, strip_indices += _tess.m_lenStrips)
        {
            currentVBuf.addIndexBatch(strip_indices, _tess.m_lenStrips);
        }

        // Render all batches
        _vertexBuf.replaceData(currentVBuf);
    }

    _vertexBuf.renderAllBatches(GL_QUAD_STRIP, info.checkFlag(RENDER_BUMP));
}
Esempio n. 10
0
void Drawable::draw(RenderInfo& renderInfo) const
{

    State& state = *renderInfo.getState();
    bool useVertexArrayObject = state.useVertexArrayObject(_useVertexArrayObject);
    if (useVertexArrayObject)
    {
        unsigned int contextID = renderInfo.getContextID();

        VertexArrayState* vas = _vertexArrayStateList[contextID].get();
        if (!vas)
        {
            _vertexArrayStateList[contextID] = vas = createVertexArrayState(renderInfo, true);
            // OSG_NOTICE<<"  Geometry::draw() "<<this<<", assigned _vertexArrayStateList[renderInfo.getContextID()]="<<_vertexArrayStateList[renderInfo.getContextID()].get()<<", vas="<<vas<< std::endl;
        }
        else
        {
            // vas->setRequiresSetArrays(getDataVariance()==osg::Object::DYNAMIC);
            // OSG_NOTICE<<"  Geometry::draw() "<<this<<", reusing _vertexArrayStateList[renderInfo.getContextID()]="<<_vertexArrayStateList[renderInfo.getContextID()].get()<<", vas="<<vas<< std::endl;
        }


        State::SetCurrentVertexArrayStateProxy setVASProxy(state, vas);

        vas->bindVertexArrayObject();

        drawInner(renderInfo);

        vas->setRequiresSetArrays(getDataVariance()==osg::Object::DYNAMIC);

        return;
    }

    // TODO, add check against whether VAO is active and supported
    if (state.getCurrentVertexArrayState()) state.getCurrentVertexArrayState()->bindVertexArrayObject();


#ifdef OSG_GL_DISPLAYLISTS_AVAILABLE
    if (!state.useVertexBufferObject(_supportsVertexBufferObjects && _useVertexBufferObjects) && _useDisplayList)
    {
        // get the contextID (user defined ID of 0 upwards) for the
        // current OpenGL context.
        unsigned int contextID = renderInfo.getContextID();

        // get the globj for the current contextID.
        GLuint& globj = _globjList[contextID];

        if( globj == 0 )
        {
            // compile the display list
            globj = generateDisplayList(contextID, getGLObjectSizeHint());
            glNewList( globj, GL_COMPILE );

            drawInner(renderInfo);

            glEndList();
        }

        // call the display list
        glCallList( globj);
    }
    else
#endif
    {
        // if state.previousVertexArrayState() is different than currentVertexArrayState bind current

        // OSG_NOTICE<<"Fallback drawInner()........................"<<std::endl;

        drawInner(renderInfo);
    }
}
Esempio n. 11
0
void Model::render(const RenderInfo& info) {

    if (info.renderMode() == RenderInfo::SHADOW) {
        if (!shadow_cast_) {
            return;
        }
        current_shader_ = simple_shader_;
    } else {
        current_shader_ = model_shader_;
    }

    auto& meshes = mesh_->meshes();
    auto& info_matrix = info.transform();
    
    for (int i = 0; i < meshes.size(); ++i) {
    
        auto& mesh = meshes.at(i);

        cross::RenderSystem::resetBufferBind();
        mesh->bind();

        //  親の姿勢行列にメッシュの姿勢行列を掛けて最終的な行列を作成
        Mtx44 transform = info_matrix * mesh->matrix();

        current_shader_->use();
        current_shader_->setUniform(SHADER_UNIF_PMV, transform);
        current_shader_->setUniform(SHADER_UNIF_SAMPLER, 0);
        current_shader_->setUniform(SHADER_UNIF_SHADOW_SAMPLER, 1);
        bool draw_flag = info.renderMode() == RenderInfo::SHADOW ? false : true;

        //  シェーダに描画フラグ設定
        current_shader_->setUniform("draw_flag", draw_flag);
        current_shader_->setUniform("draw_shadow", shadow_receive_);
        
        //  影用行列生成
        Mtx44 shadow_bias;
        Mtx44::makeShadowBias(shadow_bias);

        Mtx44 shadow_mtx;
        shadow_mtx = shadow_bias * info.projMatrix()* info.lightMatrix();
        
        current_shader_->setUniform(SHADER_UNIF_SHADOW_MTX, shadow_mtx);
        
        //  頂点設定
        current_shader_->bindAttributeLocation(0, SHADER_ATTR_POSITION);

        //  法線設定
        current_shader_->bindAttributeLocation(1, SHADER_ATTR_NORMAL);

        //  UV設定
        current_shader_->bindAttributeLocation(2, SHADER_ATTR_UV);

        //  出力カラー設定
        current_shader_->bindFragmentDataLocation(0, SHADER_OUT_COLOR);



        auto& material = mesh->material();
        if (material) {
            //  マテリアルを持っているので設定
            auto& model_texture = material->diffuseMap();

            //  テクスチャを設定
            if (model_texture) {
                cross::RenderSystem::setActiveTextureUnit(
                    cross::RenderSystem::TextureUnit::UNIT0
                );
                model_texture->bind();
                current_shader_->setUniform(SHADER_UNIF_USE_TEXTURE_FLAG, true);

            } else {
                current_shader_->setUniform(SHADER_UNIF_USE_TEXTURE_FLAG, false);
            }
            
            //  カラー設定
            const auto& diffuse = material->diffuse();
            current_shader_->setUniform(SHADER_UNIF_COLOR_DIFFUSE, diffuse.redFloat(), diffuse.greenFloat(), diffuse.blueFloat(), diffuse.alphaFloat());
        }

        cross::RenderSystem::setActiveTextureUnit(
            cross::RenderSystem::TextureUnit::UNIT1
        );
        auto& shadow_texture = info.shadowTexture();
        if (shadow_texture) {
            shadow_texture->bind();
        }



        cross::RenderSystem::setCullingMode(culling_mode_);

        cross::RenderSystem::drawElements(
            cross::RenderSystem::DrawMode::MODE_TRIANGLES,
            mesh->indexCount(),
            sizeof(uint32_t)
        );
        mesh->unbind();
    }
}
Esempio n. 12
0
void ComputeDispatch::drawImplementation(RenderInfo& renderInfo) const
{
    renderInfo.getState()->get<GLExtensions>()->glDispatchCompute(_numGroupsX, _numGroupsY, _numGroupsZ);
}
Esempio n. 13
0
void Winding::render(const RenderInfo& info) const
{
    // Do not render if there are no points
	if (empty())
    {
		return;
	}

    // Our vertex colours are always white, if requested
    glDisableClientState(GL_COLOR_ARRAY);
    if (info.checkFlag(RENDER_VERTEX_COLOUR))
    {
        glColor3f(1, 1, 1);
    }

	// A shortcut pointer to the first array element to avoid
	// massive calls to std::vector<>::begin()
	const WindingVertex& firstElement = front();

	// Set the vertex pointer first
	glVertexPointer(3, GL_DOUBLE, sizeof(WindingVertex), &firstElement.vertex);

    // Check render flags. Multiple flags may be set, so the order matters.
    if (info.checkFlag(RENDER_TEXTURE_CUBEMAP))
    {
        // In cube-map mode, we submit the vertex coordinate as the texture
        // coordinate. The RenderSystem will set the appropriate texture matrix
        // etc.
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glTexCoordPointer(
            3, GL_DOUBLE, sizeof(WindingVertex), &firstElement.vertex
        );
    }
	else if (info.checkFlag(RENDER_BUMP))
    {
        // Lighting mode, submit normals, tangents and texcoords to the shader
        // program.
		glVertexAttribPointer(
            ATTR_NORMAL, 3, GL_DOUBLE, 0, sizeof(WindingVertex), &firstElement.normal
        );
		glVertexAttribPointer(
            ATTR_TEXCOORD, 2, GL_DOUBLE, 0, sizeof(WindingVertex), &firstElement.texcoord
        );
		glVertexAttribPointer(
            ATTR_TANGENT, 3, GL_DOUBLE, 0, sizeof(WindingVertex), &firstElement.tangent
        );
		glVertexAttribPointer(
            ATTR_BITANGENT, 3, GL_DOUBLE, 0, sizeof(WindingVertex), &firstElement.bitangent
        );
	}
	else
    {
        // Submit normals in lighting mode
		if (info.checkFlag(RENDER_LIGHTING))
        {
			glNormalPointer(GL_DOUBLE, sizeof(WindingVertex), &firstElement.normal);
		}

        // Set texture coordinates in 2D texture mode
		if (info.checkFlag(RENDER_TEXTURE_2D))
        {
            glEnableClientState(GL_TEXTURE_COORD_ARRAY);
            glTexCoordPointer(
                2, GL_DOUBLE, sizeof(WindingVertex), &firstElement.texcoord
            );
		}
	}

    // Submit all data to OpenGL
	glDrawArrays(GL_POLYGON, 0, GLsizei(size()));
}
Esempio n. 14
0
void PanoDrawable::drawImplementation(RenderInfo& ri) const
{
    if(ComController::instance()->isMaster() && !_renderOnMaster)
    {
	return;
    }

    int context = ri.getContextID();

    _initLock.lock();
    if(badinit)
    {
	if(_doDelete)
	{
	    if(_contextinit[ri.getContextID()] >  0)
	    {
		for(int i = 0; i < rows; i++)
		{
		    for(int j = 0; j < cols; j++)
		    {
			if(_contextinit[ri.getContextID()] & RIGHT)
			{
			    glDeleteTextures(1, rtextures[context][i][j]);
			    delete rtextures[context][i][j];
			}
			if(_contextinit[ri.getContextID()] & LEFT)
			{
			    glDeleteTextures(1, ltextures[context][i][j]);
			    delete ltextures[context][i][j];
			}
		    }
		}
		_contextinit[ri.getContextID()] = -1;
	    }
	    bool tempb = true;
	    for(map<int, int>::iterator it = _contextinit.begin(); it != _contextinit.end(); it++)
	    {
		if(it->second > 0)
		{
		    tempb = false;
		}
	    }
	    _deleteDone = tempb;
	}
	_initLock.unlock();
	return;
    } 

    /*string host;
    int vx, vy, context;

    context = ri.getContextID();
    
    vx = (int)ri.getCurrentCamera()->getViewport()->x();
    vy = (int)ri.getCurrentCamera()->getViewport()->y();

    char hostname[51];
    gethostname(hostname, 50);
    host = hostname;*/

    int eye = 0;

    if(!getNumParents())
    {
	_initLock.unlock();
	return;
    }

    osg::Node::NodeMask nm = getParent(0)->getNodeMask();
    //std::cerr << "Node Mask: " << nm << std::endl;
    if((nm & CULL_MASK) || (nm & CULL_MASK_LEFT) )
    {
	//std::cerr << "LEFT" << std::endl;
	if(ScreenBase::getEyeSeparation() >= 0.0)
	{
	    eye = LEFT;
	}
	else
	{
	    eye = RIGHT;
	}
    }
    else
    {
	//std::cerr << "RIGHT" << std::endl;
	if(ScreenBase::getEyeSeparation() >= 0.0)
	{
	    eye = RIGHT;
	}
	else
	{
	    eye = LEFT;
	}
    }

    if(_contextinit[ri.getContextID()] >= 0)
    {
	if(!(_contextinit[ri.getContextID()] & eye))
	{
	    _initLock.unlock();
	    bool val = initTexture((PanoDrawable::eye)eye, context);
	    _initLock.lock();
	    if(val)
	    {
		_contextinit[ri.getContextID()] |= eye;
	    }
	    else
	    {
		badinit = 1;
		_initLock.unlock();
		return;
	    }
	}
    }

    if(_doDelete)
    {
	if(_contextinit[ri.getContextID()] >  0)
	{
	    for(int i = 0; i < rows; i++)
	    {
		for(int j = 0; j < cols; j++)
		{
		    if(_contextinit[ri.getContextID()] & RIGHT)
		    {
			glDeleteTextures(1, rtextures[context][i][j]);
			delete rtextures[context][i][j];
		    }
		    if(_contextinit[ri.getContextID()] & LEFT)
		    {
			glDeleteTextures(1, ltextures[context][i][j]);
			delete ltextures[context][i][j];
		    }
		}
	    }
	    _contextinit[ri.getContextID()] = -1;
	}
	bool tempb = true;
	for(map<int, int>::iterator it = _contextinit.begin(); it != _contextinit.end(); it++)
	{
	    if(it->second > 0)
	    {
		tempb = false;
	    }
	}
	_deleteDone = tempb;
	_initLock.unlock();
	return;
    }

    _initLock.unlock();

    _rcLock.lock();
    drawShape((PanoDrawable::eye)eye, context);
    _rcLock.unlock();
}
Esempio n. 15
0
bool BufferInfo::AddMesh(Mesh * mesh, GLenum drawType,VertexFormats vertFormat)
{

	if (m_isFull) return false;

	//int id = m_id;

	if (mesh == nullptr)
	{
		printf("Mesh is nullptr\n");
		return false;
	}
	
	
	GLsizei totalIndexSizeBytes		= mesh->GetIndexSizeInBytes();
	GLsizei numIndices				= mesh->GetNumIndices();
	GLsizei numVerts				= mesh->GetNumVerts();

	GLsizei totalVertSizeBytes		= mesh->GetVertSizeInBytes();

	GLsizei indexOffsetBytes	= 0;
	GLsizei vertOffset			= 0;
	GLsizei vertByteOffset		= 0;
	RenderInfo * meshRenderInfo = mesh->GetRenderInfo();

	
	if (m_sizeOfVerts + totalVertSizeBytes > m_vertexBufferSize || m_sizeOfIndices + totalIndexSizeBytes > m_vertexBufferSize) {
		if (m_hasData)
		{
			m_isFull = true;
			return false;
		}
		else
		{
			totalVertSizeBytes  = m_vertexBufferSize = totalVertSizeBytes;
			totalIndexSizeBytes = m_indexBufferSize	 = totalIndexSizeBytes;
			m_isFull			= true;
		}
	}

	if (!m_hasData)
	{
		CreateBuffers();
	}

	//glBindBuffer(GL_ARRAY_BUFFER, m_vertBufferID);
	//glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBufferID);

	//printf("\n\n\n\n\n\n\nAddMesh: INDEX SIZE ENUM Retrieved: %d\n\n\n\n\n\n", mesh->m_renderInfo.m_isb);

	if (m_headRenderInfoPtr == nullptr)
	{
		m_headRenderInfoPtr = &mesh->m_renderInfo;
		indexOffsetBytes = 0;
		vertOffset = 0;

		meshRenderInfo->m_vertOffset = 0;
		meshRenderInfo->SetRenderInfo(m_vertBufferID, m_indexBufferID, totalIndexSizeBytes, indexOffsetBytes, numIndices, numVerts, vertOffset, true, nullptr, drawType, vertFormat);
		

		m_tailRenderInfoPtr = meshRenderInfo;

	}
	else
	{

		//meshRenderInfo = mesh->GetRenderInfo();

		GetCurrentOffsets(&indexOffsetBytes, &vertOffset);
		meshRenderInfo->m_vertOffset = vertOffset;
		meshRenderInfo->SetRenderInfo(m_vertBufferID, m_indexBufferID, totalIndexSizeBytes, indexOffsetBytes, numIndices, numVerts, vertOffset,true,nullptr, drawType,vertFormat);
		//meshRenderInfo->SetIndexSizeEnum(mesh->GetIndexSizeEnum());
		
		m_headRenderInfoPtr->SetNextRenderInfoPtr(m_tailRenderInfoPtr);
		m_tailRenderInfoPtr = meshRenderInfo;
	}

	//----------------------IMPORTANT?-----------------------------
	meshRenderInfo->SetIndexSizeEnum(mesh->GetIndexSizeEnum());
	//-------------------------------------------------------------
	meshRenderInfo->m_vertBufferID = m_vertBufferID;
	meshRenderInfo->m_indBufferID = m_indexBufferID;
	vertByteOffset = vertOffset * mesh->GetStride();
	
	if (mesh->m_renderInfo.m_stride == 0)mesh->m_renderInfo.m_stride = mesh->GetStride();
	//mesh->m_renderInfo.m_draw_mode = drawType;
	//mesh->m_renderInfo.m_vertexFormat = vertFormat;
	//mesh->m_renderInfo.m_vertexFormat =
	InsertVertexSubBuffer(m_vertBufferID, mesh, vertByteOffset);

	if (mesh->m_renderInfo.m_indexed) 
	{
		InsertIndexSubBuffer(m_indexBufferID, mesh, indexOffsetBytes);
	}

	//InsertIndexSubBuffer
	//GLsizei indexSize, GLsizei indexOffsetBytes, GLsizei numIndices, GLsizei numVerts, bool enabled = true, RenderInfo * nextPtr = nullpt

	//Log stats
	GameLogger::Log(LogMsgType::cInfo, "--------BufferInfo::AddMesh() Added mesh successfully-------");
	GameLogger::Log(LogMsgType::cInfo, "");
	GameLogger::Log(LogMsgType::cInfo, "--------------------| START BUFFER MESH INFO |-------------------------------------");
	GameLogger::Log(LogMsgType::cInfo, "BufferInfo::AddMesh(): NUM VERTS-----------------[%u]", numVerts);
	GameLogger::Log(LogMsgType::cInfo, "BufferInfo::AddMesh(): NUM INDICES---------------[%u]", numIndices);
	GameLogger::Log(LogMsgType::cInfo, "BufferInfo::AddMesh(): VERT OFFSET---------------[%u]", mesh->GetRenderInfo()->m_vertOffset);
	GameLogger::Log(LogMsgType::cInfo, "BufferInfo::AddMesh(): INDICES OFFSET (BYTES)----[%u]", mesh->GetRenderInfo()->m_indexOffsetBytes);
	GameLogger::Log(LogMsgType::cInfo, "--------------------|  END BUFFER MESH INFO  |--------------------------------------");
	GameLogger::Log(LogMsgType::cInfo, "\n");


	//void * t_buff = mesh->m_mesh;

	/*GLfloat * m_buffer = new GLfloat[500];
	glGetBufferSubData(GL_ARRAY_BUFFER, (GLintptr)0, 500, m_buffer);


	for (int j = 0; j < 500; j++)
	{

		printf("Val[%d]: %f\n",j ,*m_buffer);
		++m_buffer;
	}
	delete[] m_buffer;
*/
	

	m_hasData = true;
	return true;
}
Esempio n. 16
0
void RenderablePatchWireframe::render(const RenderInfo& info) const
{
    // No colour changing
    glDisableClientState(GL_COLOR_ARRAY);
    if (info.checkFlag(RENDER_VERTEX_COLOUR))
    {
        glColor3f(1, 1, 1);
    }

    if (_tess.vertices.empty()) return;

    if (_needsUpdate)
    {
        _needsUpdate = false;

        const std::vector<ArbitraryMeshVertex>& patchVerts = _tess.vertices;

        // Vertex buffer to receive and render vertices
        VertexBuffer_T currentVBuf;

        std::size_t firstIndex = 0;
        for (std::size_t i = 0; i <= _tess.curveTreeV.size(); ++i)
        {
            currentVBuf.addBatch(patchVerts.begin() + firstIndex,
                _tess.m_nArrayWidth);

            if (i == _tess.curveTreeV.size()) break;

            if (!_tess.curveTreeV[i]->isLeaf())
            {
                currentVBuf.addBatch(
                    patchVerts.begin() + GLint(_tess.curveTreeV[i]->index),
                    _tess.m_nArrayWidth
                    );
            }

            firstIndex += (_tess.arrayHeight[i] * _tess.m_nArrayWidth);
        }

        const ArbitraryMeshVertex* p = &patchVerts.front();
        std::size_t uStride = _tess.m_nArrayWidth;
        for (std::size_t i = 0; i <= _tess.curveTreeU.size(); ++i)
        {
            currentVBuf.addBatch(p, _tess.m_nArrayHeight, uStride);

            if (i == _tess.curveTreeU.size()) break;

            if (!_tess.curveTreeU[i]->isLeaf())
            {
                currentVBuf.addBatch(
                    patchVerts.begin() + _tess.curveTreeU[i]->index,
                    _tess.m_nArrayHeight, uStride
                    );
            }

            p += _tess.arrayWidth[i];
        }

        // Render all vertex batches
        _vertexBuf.replaceData(currentVBuf);
    }

    _vertexBuf.renderAllBatches(GL_LINE_STRIP);
}
Esempio n. 17
0
 //-------------------------------------------------------
 RenderCapabilitiesUPtr RenderCapabilities::Create(const RenderInfo& renderInfo) noexcept
 {
     return RenderCapabilitiesUPtr(new RenderCapabilities(renderInfo.IsShadowMappingSupported(), renderInfo.IsDepthTextureSupported(), renderInfo.IsMapBufferSupported(),
                                                          renderInfo.IsHighPrecisionFloatsSupported(), renderInfo.GetMaxTextureSize(), renderInfo.GetNumTextureUnits()));
 }
Esempio n. 18
0
void coVolumeDrawable::drawImplementation(RenderInfo &renderInfo) const
{
    vvDebugMsg::msg(3, "coVolumeDrawable::drawImplementation()");

    const unsigned ctx = renderInfo.getState()->getContextID();
    while (ctx >= contextState.size())
    {
        // this will delete the old renderer contextState.resize(ctx+1);
        ContextState *nc = new ContextState;
        contextState.push_back(nc);
    }
    vvRenderer *&renderer = contextState[ctx]->renderer;

    if (vd && !renderer)
    {
        // Debug level value may be either [NO_MESSAGES|FEW_MESSAGES|MOST_MESSAGES|ALL_MESSAGES]
        // Or, in the same order and meaning the same as the string equivalents [0|1|2|3]
        bool debugLevelExists = false;
        const int debugLevelInt = covise::coCoviseConfig::getInt("COVER.Plugin.Volume.DebugLevel", 0, &debugLevelExists);

        if (debugLevelExists)
        {
            if ((debugLevelInt >= 0) && (debugLevelInt <= 9))
            {
                vvDebugMsg::setDebugLevel(debugLevelInt);
            }
            else
            {
                // In that case, the debug level was specified as a string literal
                std::string debugLevelStr = covise::coCoviseConfig::getEntry("COVER.Plugin.Volume.DebugLevel");
                if (!debugLevelStr.empty())
                {
                    if (strcasecmp(debugLevelStr.c_str(), "NO_MESSAGES") == 0)
                    {
                        vvDebugMsg::setDebugLevel(vvDebugMsg::NO_MESSAGES);
                    }
                    else if (strcasecmp(debugLevelStr.c_str(), "FEW_MESSAGES") == 0)
                    {
                        vvDebugMsg::setDebugLevel(vvDebugMsg::FEW_MESSAGES);
                    }
                    else if (strcasecmp(debugLevelStr.c_str(), "MOST_MESSAGES") == 0)
                    {
                        vvDebugMsg::setDebugLevel(vvDebugMsg::MOST_MESSAGES);
                    }
                    else if (strcasecmp(debugLevelStr.c_str(), "ALL_MESSAGES") == 0)
                    {
                        vvDebugMsg::setDebugLevel(vvDebugMsg::ALL_MESSAGES);
                    }
                }
            }
        }

        bool imageScalingExists = false;
        const bool useOffscreenBuffer = covise::coCoviseConfig::isOn("imageScaling", "COVER.Plugin.Volume.Renderer", false, &imageScalingExists);

        bool numGPUSlavesExists = false;
        const char **displayNames = NULL;
        virvo::BufferPrecision multiGpuPrecision = virvo::Short;
        const int numGPUSlaves = covise::coCoviseConfig::getInt("COVER.Plugin.Volume.MultiGPU.NumSlaves", -1, &numGPUSlavesExists);

        std::vector<const char *> hostnames;
        std::vector<int> ports;
        std::vector<const char *> alternativeFilenames;

        const bool useMultiGPU = numGPUSlavesExists;
        if (useMultiGPU)
        {
            // Buffer precision for multi gpu rendering slaves.
            // As with debug level. May either be [BYTE|SHORT|FLOAT]
            // or equivalently [8|16|32]
            bool bufferPrecisionExists;
            const int precisionInt = covise::coCoviseConfig::getInt("COVER.Plugin.Volume.MultiGPU.BufferPrecision", 16, &bufferPrecisionExists);
            if (bufferPrecisionExists)
            {
                if ((precisionInt == 8) || (precisionInt == 16) || (precisionInt == 32))
                {
                    if (precisionInt == 8)
                        multiGpuPrecision = virvo::Byte;
                    else if (precisionInt == 16)
                        multiGpuPrecision = virvo::Short;
                    else
                        multiGpuPrecision = virvo::Float;
                }
                else
                {
                    // In that case, the buffer precision was specified as a string literal
                    std::string precisionStr = covise::coCoviseConfig::getEntry("COVER.Plugin.Volume.MultiGPU.BufferPrecision");
                    if (strcasecmp(precisionStr.c_str(), "BYTE") == 0)
                    {
                        multiGpuPrecision = virvo::Byte;
                    }
                    else if (strcasecmp(precisionStr.c_str(), "SHORT") == 0)
                    {
                        multiGpuPrecision = virvo::Short;
                    }
                    else if (strcasecmp(precisionStr.c_str(), "FLOAT") == 0)
                    {
                        multiGpuPrecision = virvo::Float;
                    }
                }
            }
            displayNames = new const char *[numGPUSlaves];
            for (int i = 0; i < numGPUSlaves; ++i)
            {
                std::stringstream disp;
                disp << "COVER.Plugin.Volume.MultiGPU.GPU:";
                disp << i;
                std::string entry = covise::coCoviseConfig::getEntry("display", disp.str());
#ifdef VERBOSE
                cerr << "Use additional GPU for rendering on display: " << entry << endl;
#endif
                char *cstr = new char[strlen(entry.c_str()) + 1];
                strncpy(cstr, entry.c_str(), strlen(entry.c_str()));
                displayNames[i] = cstr;
            }
        }

        renderer = vvRendererFactory::create(vd, renderState, geoType.c_str(), voxType.c_str());

        if (renderer)
        {
            renderer->setParameter(vvRenderer::VV_OFFSCREENBUFFER, useOffscreenBuffer);
        }
    }

    // if a renderer exists, process regular rendering procedure
    if (renderer)
    {
        for (std::vector<vvRenderState::ParameterType>::iterator it = contextState[ctx]->parameterChanges.begin();
             it != contextState[ctx]->parameterChanges.end();
             ++it)
        {
            renderer->setParameter(*it, renderState.getParameter(*it));
        }
        contextState[ctx]->parameterChanges.clear();
        if (contextState[ctx]->applyTF)
        {
            renderer->updateTransferFunction();
            contextState[ctx]->applyTF = false;
        }

        ref_ptr<StateSet> currentState = new StateSet;
        renderInfo.getState()->captureCurrentState(*currentState);
        renderInfo.getState()->pushStateSet(currentState.get());

        renderer->setCurrentFrame(currentFrame);
        //renderer->setQuality(quality);
        renderer->setViewingDirection(viewDir);
        renderer->setObjectDirection(objDir);

        renderer->renderFrame();

        renderInfo.getState()->popStateSet();
    }
    else
    {
        //cerr << "vd==NULL" << endl;
    }
}