/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details. */ #include #include using namespace osg; #define VAS_NOTICE OSG_INFO //#define VAS_NOTICE OSG_NOTICE #ifdef OSG_GL_VERTEX_ARRAY_FUNCS_AVAILABLE /////////////////////////////////////////////////////////////////////////////////// // // VertexArrayDispatch // struct VertexArrayDispatch : public VertexArrayState::ArrayDispatch { VertexArrayDispatch() {} virtual void enable_and_dispatch(osg::State&, const osg::Array* new_array) { VAS_NOTICE<<" VertexArrayDispatch::enable_and_dispatch("<getNumElements()<<")"<getDataSize(), new_array->getDataType(), 0, new_array->getDataPointer()); } virtual void enable_and_dispatch(osg::State&, const osg::Array* new_array, const osg::GLBufferObject* vbo) { VAS_NOTICE<<" VertexArrayDispatch::enable_and_dispatch("<getNumElements()<<", vbo="<getDataSize(), new_array->getDataType(), 0, (const GLvoid *)(vbo->getOffset(new_array->getBufferIndex()))); } virtual void dispatch(osg::State& state, const osg::Array* new_array) { VAS_NOTICE<<" VertexArrayDispatch::dispatch("<getNumElements()<<")"<getDataSize(), new_array->getDataType(), 0, new_array->getDataPointer()); } virtual void dispatch(osg::State& state, const osg::Array* new_array, const osg::GLBufferObject* vbo) { VAS_NOTICE<<" VertexArrayDispatch::dispatch("<getNumElements()<<", vbo"<getDataSize(), new_array->getDataType(), 0, (const GLvoid *)(vbo->getOffset(new_array->getBufferIndex()))); } virtual void disable(osg::State& state) { VAS_NOTICE<<" VertexArrayDispatch::disable()"<getNumElements()<<")"<getDataSize(), new_array->getDataType(), 0, new_array->getDataPointer()); } virtual void enable_and_dispatch(osg::State&, const osg::Array* new_array, const osg::GLBufferObject* vbo) { VAS_NOTICE<<" ColorArrayDispatch::enable_and_dispatch("<getNumElements()<<", vbo="<getDataSize(), new_array->getDataType(), 0, (const GLvoid *)(vbo->getOffset(new_array->getBufferIndex()))); } virtual void dispatch(osg::State& state, const osg::Array* new_array) { VAS_NOTICE<<" ColorArrayDispatch::dispatch("<getNumElements()<<")"<getDataSize(), new_array->getDataType(), 0, new_array->getDataPointer()); } virtual void dispatch(osg::State& state, const osg::Array* new_array, const osg::GLBufferObject* vbo) { VAS_NOTICE<<" ColorArrayDispatch::dispatch("<getNumElements()<<", vbo="<getDataSize(), new_array->getDataType(), 0, (const GLvoid *)(vbo->getOffset(new_array->getBufferIndex()))); } virtual void disable(osg::State& state) { VAS_NOTICE<<" ColorArrayDispatch::disable()"<getNumElements()<<")"<getDataType(), 0, new_array->getDataPointer()); } virtual void enable_and_dispatch(osg::State&, const osg::Array* new_array, const osg::GLBufferObject* vbo) { VAS_NOTICE<<" NormalArrayDispatch::enable_and_dispatch("<getNumElements()<<", vbo="<getDataType(), 0, (const GLvoid *)(vbo->getOffset(new_array->getBufferIndex()))); } virtual void dispatch(osg::State& state, const osg::Array* new_array) { VAS_NOTICE<<" NormalArrayDispatch::dispatch("<getNumElements()<<")"<getDataType(), 0, new_array->getDataPointer()); } virtual void dispatch(osg::State& state, const osg::Array* new_array, const osg::GLBufferObject* vbo) { VAS_NOTICE<<" NormalArrayDispatch::dispatch("<getNumElements()<<", vbo="<getDataType(), 0, (const GLvoid *)(vbo->getOffset(new_array->getBufferIndex()))); } virtual void disable(osg::State& state) { VAS_NOTICE<<" NormalArrayDispatch::disable()"<()->glSecondaryColorPointer(new_array->getDataSize(), new_array->getDataType(), 0, new_array->getDataPointer()); } virtual void enable_and_dispatch(osg::State& state, const osg::Array* new_array, const osg::GLBufferObject* vbo) { glEnableClientState(GL_SECONDARY_COLOR_ARRAY); state.get()->glSecondaryColorPointer(new_array->getDataSize(), new_array->getDataType(), 0, (const GLvoid *)(vbo->getOffset(new_array->getBufferIndex()))); } virtual void dispatch(osg::State& state, const osg::Array* new_array) { state.get()->glSecondaryColorPointer(new_array->getDataSize(), new_array->getDataType(), 0, new_array->getDataPointer()); } virtual void dispatch(osg::State& state, const osg::Array* new_array, const osg::GLBufferObject* vbo) { state.get()->glSecondaryColorPointer(new_array->getDataSize(), new_array->getDataType(), 0, (const GLvoid *)(vbo->getOffset(new_array->getBufferIndex()))); } virtual void disable(osg::State& state) { glDisableClientState(GL_SECONDARY_COLOR_ARRAY); } }; /////////////////////////////////////////////////////////////////////////////////// // // FogCoordArrayDispatch // struct FogCoordArrayDispatch : public VertexArrayState::ArrayDispatch { FogCoordArrayDispatch() {} virtual void enable_and_dispatch(osg::State& state, const osg::Array* new_array) { glEnableClientState(GL_FOG_COORD_ARRAY); state.get()->glFogCoordPointer(new_array->getDataType(), 0, new_array->getDataPointer()); } virtual void enable_and_dispatch(osg::State& state, const osg::Array* new_array, const osg::GLBufferObject* vbo) { glEnableClientState(GL_FOG_COORD_ARRAY); state.get()->glFogCoordPointer(new_array->getDataType(), 0, (const GLvoid *)(vbo->getOffset(new_array->getBufferIndex()))); } virtual void dispatch(osg::State& state, const osg::Array* new_array) { state.get()->glFogCoordPointer(new_array->getDataType(), 0, new_array->getDataPointer()); } virtual void dispatch(osg::State& state, const osg::Array* new_array, const osg::GLBufferObject* vbo) { state.get()->glFogCoordPointer(new_array->getDataType(), 0, (const GLvoid *)(vbo->getOffset(new_array->getBufferIndex()))); } virtual void disable(osg::State& state) { glDisableClientState(GL_FOG_COORD_ARRAY); } }; /////////////////////////////////////////////////////////////////////////////////// // // TexCoordArrayDispatch // struct TexCoordArrayDispatch : public VertexArrayState::ArrayDispatch { TexCoordArrayDispatch(unsigned int in_unit) : unit(in_unit) {} virtual void enable_and_dispatch(osg::State& state, const osg::Array* new_array) { VAS_NOTICE<<" TexCoordArrayDispatch::enable_and_dispatch("<getNumElements()<<") unit="<(GL_TEXTURE0+unit)); //state.setClientActiveTextureUnit(unit); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(new_array->getDataSize(), new_array->getDataType(), 0, new_array->getDataPointer()); } virtual void enable_and_dispatch(osg::State& state, const osg::Array* new_array, const osg::GLBufferObject* vbo) { VAS_NOTICE<<" TexCoordArrayDispatch::enable_and_dispatch("<getNumElements()<<", vbo="<getNumElements()<<") unit="<(GL_TEXTURE0+unit)); state.setClientActiveTextureUnit(unit); glTexCoordPointer(new_array->getDataSize(), new_array->getDataType(), 0, new_array->getDataPointer()); } virtual void dispatch(osg::State& state, const osg::Array* new_array, const osg::GLBufferObject* vbo) { VAS_NOTICE<<" TexCoordArrayDispatch::dispatch("<getNumElements()<<", vbo="<::lazyDisablingOfVertexAttributes() _activeDispatchers.size()="<<_activeDispatchers.size()<<", _previous_activeDispatchers.size()="<<_previous_activeDispatchers.size()<array = 0; ad->active = false; } } void VertexArrayState::applyDisablingOfVertexAttributes(osg::State& state) { VAS_NOTICE<<" VertexArrayState<"<::applyDisablingOfVertexAttributes() _activeDispatchers.size()="<<_activeDispatchers.size()<<", _previous_activeDispatchers.size()="<<_previous_activeDispatchers.size()<active) { ad->disable(state); ad->array = 0; ad->modifiedCount = 0xffffffff; } } _previous_activeDispatchers.clear(); } void VertexArrayState::setArray(ArrayDispatch* vad, osg::State& state, const osg::Array* new_array) { if (new_array) { VAS_NOTICE<<" VertexArrayState<"<::setArray() "<array = new_array; vad->modifiedCount = new_array->getModifiedCount(); } else if (vad->array) { VAS_NOTICE<<" VertexArrayState::setArray() need to disable "<