Done plenty of cleanup, to more easily understand what is being created and to ensure all uniforms will show up, or at least that was the intent, still having issues on that front.
Here’s what I have in the shader/s:
struct FNUMS
{
vec3 WinScale;
vec3 RegScale;
vec3 RegPoint;
vec3 RegEmits;
vec3 RegTakes;
};
struct DINTS
{
ivec3 WinSpace;
ivec2 WinPoint;
int VtxCount;
int FlatLine;
};
uniform DINTS dints;
uniform FNUMS fnums;
Here’s my creation process:
dint create( SRC *src, APP *app )
{
VFXAPP *vfxapp = app->vfxapp;
#if 0
SHADER *shader = SeekVfxAppShader( vfxapp, SHADER_TYPE_POINT );
#endif
BUFFER *buffer = NULL;
VFXBUF *vfxbuf = NULL;
VFXVAR *vfxvar = NULL;
VFXCFG *vfxcfg = NULL;
vec3s one3 = {{1,1,1}};
SHARED_DINTS dints;
SHARED_FNUMS fnums;
VFXTYPE SharedBufferTypes[SHARED_BUFFER_COUNT] = {0};
ucap SharedBufferVsizes[SHARED_BUFFER_COUNT] = {0};
uint SharedBufferCounts[SHARED_BUFFER_COUNT] = {0};
achs SharedBufferNames[SHARED_BUFFER_COUNT] = {NULL};
void *SharedBufferDefaults[SHARED_BUFFER_COUNT] = {NULL};
dint i, err;
memset( dints.raw, 0, sizeof(dints) );
memset( fnums.raw, 0, sizeof(fnums) );
dints.mem.WinSpace.x = 480;
dints.mem.WinSpace.y = 640;
/* A depth of 10,000 should be enough for normal game play */
dints.mem.WinSpace.z = 10000;
dints.mem.VtxCount = 3;
dints.mem.FlatLine = 1;
fnums.mem.WinScale = one3;
fnums.mem.WinScale.y = 480.0 / 640.0;
fnums.mem.RegScale = one3;
fnums.mem.RegEmits = one3;
SharedBufferNames[SHARED_BUFFER_UINTS] = "uints";
SharedBufferNames[SHARED_BUFFER_DINTS] = "dints";
SharedBufferNames[SHARED_BUFFER_FNUMS] = "fnums";
SharedBufferNames[SHARED_BUFFER_DNUMS] = "dnums";
SharedBufferVsizes[SHARED_BUFFER_UINTS] = sizeof(uint);
SharedBufferVsizes[SHARED_BUFFER_DINTS] = sizeof(dint);
SharedBufferVsizes[SHARED_BUFFER_FNUMS] = sizeof(fnum);
SharedBufferVsizes[SHARED_BUFFER_DNUMS] = sizeof(dnum);
SharedBufferTypes[SHARED_BUFFER_UINTS] = VFXTYPE_UINT;
SharedBufferTypes[SHARED_BUFFER_DINTS] = VFXTYPE_DINT;
SharedBufferTypes[SHARED_BUFFER_FNUMS] = VFXTYPE_FLOAT;
SharedBufferTypes[SHARED_BUFFER_DNUMS] = VFXTYPE_DOUBLE;
/*SharedBufferDefaults[SHARED_BUFFER_UINTS] = uints.raw;*/
SharedBufferDefaults[SHARED_BUFFER_DINTS] = dints.raw;
SharedBufferDefaults[SHARED_BUFFER_FNUMS] = fnums.raw;
/*SharedBufferDefaults[SHARED_BUFFER_DNUMS] = dnums.raw;*/
/*SharedBufferCounts[SHARED_BUFFER_UINTS] = sizeof(uints) / sizeof(uint);*/
SharedBufferCounts[SHARED_BUFFER_DINTS] = sizeof(dints) / sizeof(dint);
SharedBufferCounts[SHARED_BUFFER_FNUMS] = sizeof(fnums) / sizeof(fnum);
/*SharedBufferCounts[SHARED_BUFFER_DNUMS] = sizeof(dnums) / sizeof(dnum);*/
for ( i = 0; i < SHARED_BUFFER_COUNT; ++i )
{
err = MakeBuffer
( src, &(app->SharedBuffers[i]), SharedBufferVsizes[i] );
if ( err )
{
PRINT_ERRNO( stdout, err );
goto void_vectors;
}
buffer = app->SharedBuffers[i];
err = InitBuffer
( src, buffer, SharedBufferDefaults[i], SharedBufferCounts[i] );
if ( err )
{
PRINT_ERRNO( stdout, err );
goto void_vectors;
}
err = MakeVfxBuf( src, &(app->SharedVfxBufs[i]) );
if ( err )
{
PRINT_ERRNO( stdout, err );
goto void_vectors;
}
vfxbuf = app->SharedVfxBufs[i];
err = MakeVfxVar( src, &(app->SharedVfxVars[i]) );
if ( err )
{
PRINT_ERRNO( stdout, err );
goto void_vectors;
}
vfxvar = app->SharedVfxVars[i];
err = InitVfxVar( src, vfxvar, vfxbuf, SharedBufferNames[i] );
if ( err )
{
PRINT_ERRNO( stdout, err );
goto void_vectors;
}
err = FindVfxVar( src, vfxvar, vfxapp, NULL );
if ( err )
{
/* Not fatal as it is an optional value */
PRINT_LINE( stdout );
printf("'%s' not found\n", SharedBufferNames[i] );
}
}
...
Here’s the test “draw” loop:
while ( !DeadVfxWin( win ) )
{
ucap i;
SHARED_DINTS *dints =
SeekBufferArray( app->SharedBuffers[SHARED_BUFFER_DINTS] );
SHARED_FNUMS *fnums =
SeekBufferArray( app->SharedBuffers[SHARED_BUFFER_FNUMS] );
dint vertices[] = { 3, 3, 3 };
vec3 points[sizeof(vertices)/sizeof(dint)] =
{ { 0.25, 0.25, 0 }, { 0.75, 0.25, 0 }, { 0.5, 0.75, 0 } };
BindVfxApp( src, vfxapp );
fillVfxBoxCB( 0.0, 0.0, 0.0, 1.0 );
zeroVfxBitCB( VFX_COLOR_BIT | VFX_DEPTH_BIT );
if ( SeekKeyAct( win, KEY_ANSI_ESC ) == KEY_ISACTIVE )
{
KillVfxWin( src, win );
break;
}
err = SeekVfxWinSize( win, &winH, &winW );
if ( err )
PRINT_ERRNO( stdout, err );
err = SeekVfxWinPos( win, &winX, &winY );
if ( err )
PRINT_ERRNO( stdout, err );
dints->mem.WinSpace.x = winW;
dints->mem.WinSpace.y = winH;
dints->mem.WinPoint.x = winX;
dints->mem.WinPoint.y = winY;
for ( i = 0; i < (sizeof(points) / sizeof(vec3)); ++i )
{
dints->mem.VtxCount = vertices[i];
memcpy( fnums->mem.RegPoint.raw, points, sizeof(vec3) );
DrawVfxCfg( src, vfxcfg, VFXDRAW_TRIOS );
}
SwapVfxWinBufs( src, win );
PollWapi();
}
I understand why uints
& dnums
are not found (since I have no use for them yet), but I don’t understand why dints
& fnums
are not found even though they are definitely used. I’m not yet expecting their output to be what I’m “feeding” them because I haven’t done the wrapper for their uniform types (float* & int*) but I do expect them to be locatable, why isn’t that the case?