00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #if !defined SOGLBUFFEROBJECT_H
00024 #define SOGLBUFFEROBJECT_H
00025
00026 #include <Inventor/devices/SoInteropBufferObject.h>
00027 #include <Inventor/sys/SoGLType.h>
00028
00029 SO_PIMPL_PUBLIC_DECLARATION(SoGLBufferObject)
00030 class SbVec2i32;
00031
00219 class SoGLBufferObject : public SoInteropBufferObject
00220 {
00221 SO_TYPED_CLASS_HEADER();
00222 SO_PIMPL_PUBLIC_HEADER(SoGLBufferObject)
00223
00224 public:
00225
00229 enum BufferObjectTarget
00230 {
00235 PIXEL_PACK_BUFFER,
00236
00241 PIXEL_UNPACK_BUFFER,
00242
00247 ARRAY_BUFFER,
00248
00253 ELEMENT_ARRAY_BUFFER,
00254
00259 SHADER_STORAGE_BUFFER
00260 };
00261
00271 enum Usage
00272 {
00278 STREAM_DRAW,
00279
00285 STREAM_READ,
00286
00292 STREAM_COPY,
00293
00299 STATIC_DRAW,
00300
00306 STATIC_READ,
00307
00313 STATIC_COPY,
00314
00320 DYNAMIC_DRAW,
00321
00327 DYNAMIC_READ,
00328
00334 DYNAMIC_COPY
00335 };
00336
00342 SoGLBufferObject( Usage usage );
00343
00349 static bool isAvailable();
00350
00359 void setTarget( BufferObjectTarget target );
00360
00366 BufferObjectTarget getTarget() const;
00367
00379 virtual bool setSize( size_t size );
00380
00391 virtual void map( SoBufferObject* targetBufferObject, AccessMode accessMode, size_t startPosition = 0, size_t mappingSize = SO_BUFFER_SIZE_ALL );
00392
00396 virtual void unmap( SoBufferObject* bufferObject );
00397
00407 void bind();
00408
00418 void unbind();
00419
00433 virtual void* map( AccessMode accessMode, size_t offset = 0, size_t count = SO_BUFFER_SIZE_ALL );
00434
00438 virtual void unmap();
00439
00450 bool isValid();
00451
00455 GLuint getId() const;
00456
00462 virtual SoBufferObject* createInstance() const;
00463
00471 virtual void clearInstance();
00472
00490 void memcpy(SoBufferObject* source, size_t destOffset = 0, size_t sourceOffset = 0, size_t copySize = SO_BUFFER_SIZE_ALL);
00491
00492 private:
00493
00494 void copyToCpuBuffer( SoCpuBufferObject* targetBufferObject, size_t destOffset = 0, size_t sourceOffset = 0, size_t copySize = SO_BUFFER_SIZE_ALL );
00495
00497 bool isBindable();
00498
00500 void copyFromGLTexture(GLuint tex, const SbVec2i32& size, bool alpha);
00501
00502 struct Configuration
00503 {
00504 size_t size;
00505 BufferObjectTarget target;
00506 Usage usage;
00507 };
00508
00509 private:
00513 virtual ~SoGLBufferObject();
00514
00516 SoGLBufferObject();
00517
00518 bool checkContext();
00519
00520 };
00521
00522 #endif // SOGLBUFFEROBJECT_H
00523