LWJGL Forum

Programming => LWJGL Documentation => Topic started by: bcbradle on June 10, 2017, 12:43:58

Title: No setter in various BGFX classes
Post by: bcbradle on June 10, 2017, 12:43:58
Specifically


BGFXTransform is required as an argument to:

BGFXInstanceDataBuffer is required as an argument to:

BGFXTextureInfo is required as an argument to:

BGFXMemory is required as an argument to:

BGFXCallbackInterface is required as an argument to:

Since these functions take these structures as arguments then either the function depends on the values within the structures or the contents of the structure will be mutated imperatively.

Can you tell me which of the above are dependencies for their respective functions and which are not?

Also, in the cases for which the functions depend on the the values within the structures, how would I set the state of the structures without a setter? Can you give me examples for those cases?

I know I'm asking a lot here, but I'm just trying to understand how this is put together.
Title: Re: No setter in various BGFX classes
Post by: spasi on June 10, 2017, 19:50:12
Disclaimer: I haven't used bgfx for anything serious, the below information is based on the public API and documentation. I have verified non-obvious cases by looking into bgfx's source, but please do let me know if you think I've misunderstood something.

Quote from: bcbradle on June 10, 2017, 12:43:58BGFXTransform is required as an argument to:

  • bgfx_alloc_transform

You allocate a BGFXTransform, but you do not fill it with anything. The call to bgfx_alloc_transform will initialize the struct with a data pointer that's internal to bgfx. You then access the pointer with .data(), returning a FloatBuffer (wrapping 4 x 4 x .num() floats) which is obviously mutable.

Quote from: bcbradle on June 10, 2017, 12:43:58BGFXInstanceDataBuffer is required as an argument to:

  • bgfx_set_instance_data_buffer

BGFXInstanceDataBuffer instances are created with bgfx_alloc_instance_data_buffer. No member should be modified, except the contents of the .data() buffer. A BGFXInstanceDataBuffer instance is deallocated after a call to bgfx_set_instance_data_buffer.

Quote from: bcbradle on June 10, 2017, 12:43:58BGFXTextureInfo is required as an argument to:

  • bgfx_calc_texture_size
  • bgfx_create_texture

In both functions, the _info parameter is an output parameter.

Quote from: bcbradle on June 10, 2017, 12:43:58BGFXMemory is required as an argument to:

  • bgfx_create_dynamic_index_buffer_mem
  • bgfx_create_dynamic_vertex_buffer_mem
  • bgfx_create_index_buffer
  • bgfx_create_shader
  • bgfx_create_texture_2d
  • bgfx_create_texture_3d
  • bgfx_create_texture
  • bgfx_create_dynamic_vertex_buffer
  • bgfx_update_dynamic_index_buffer
  • bgfx_update_dynamic_vertex_buffer
  • bgfx_update_texture_2d
  • bgfx_update_texture_3d
  • bgfx_update_texture_cube

BGFXMemory is already mutable. Note that there's a setter for data only, the size member is populated automatically based on the buffer size. If that is inconvenient somehow, you can use the "unsafe" static setters (ndata & nsize).

Quote from: bcbradle on June 10, 2017, 12:43:58BGFXCallbackInterface is required as an argument to:

  • bgfx_init

BGFXCallbackInterface is already mutable. See the vtbl(BGFXCallbackVtbl value) method.
Title: Re: No setter in various BGFX classes
Post by: CoDi on August 11, 2017, 09:48:02
Yes, the bgfx API is a little more involved. As a general rule (there might be bugs of course), if there's no setter, you are not supposed to fill in any properties yourself.

BGFXMemory (https://bkaradzic.github.io/bgfx/bgfx.html#_CPPv2N4bgfx6MemoryE) instances can be created with bgfx_alloc, bgfx_copy, bgfx_make_ref and bgfx_make_ref_release.

I recommend to have a look at the samples in lwjgl3-demos (https://github.com/LWJGL/lwjgl3-demos/tree/master/src/org/lwjgl/demo/bgfx). They also show how to setup the callback interface.