我怎样才能实现这样的目标?我有这个功能在另一个经常调用的函数中提交。
我想更新idx
变量,使其增加1作为动态数组的偏移量。
int idx = 0;
float* abc; //initialized to 18 floats
float* a, *b, *c; //each initialized to 3 floating values
//set some variable that's updated once submit is called to know where to offset the memory
void submit() {
int local_idx = idx;
abc[local_idx++] = a[0]; //first call to submit(), local idx starts at 0
abc[local_idx++] = b[0];
abc[local_idx++] = c[0];
abc[local_idx++] = a[1];
abc[local_idx++] = b[1];
abc[local_idx++] = c[1];
abc[local_idx++] = a[2];
abc[local_idx++] = b[2];
abc[local_idx++] = c[2]; //first call to submit(), local idx ends at 8
}
void update() {
//do work //fill 3 new values into *a, *b, *c
submit(); //here idx = 0
//do work //fill 3 new values into *a, *b, *c
submit(); //here idx = 1
//do work //fill 3 new values into *a, *b, *c
submit(); // here idx = 2 etc....
}
每当我拨打submit()
时,idx
值都会增加1。
所以在第一次提交idx = 0, local_idx = 0
时,数组的值为0-5。
然后在下一次调用全局idx = 5
,local_idx = 5
时填充元素6,12。我已尝试将local_idx
的值复制回全局{{ 1}}值但只是使数字运行到无穷大。
如何编写控制语句以控制此数据流?我想去
idx
修改 这是我正在使用的代码。
submit() //0 fills in elements 0-5
submit() //1 fills in elements 6-12
submit() //2 fills in elements 13-19
//.....
此时我拥有outvec [x]变量中所需的所有数据以及精灵结构中的一些变量。
for (int i = 0; i < count; i++) {
//--------------- start update vertex data ---------------------
sp = sprites[i];
vmathT3MakeIdentity(&rotation);
vmathT3MakeIdentity(&scale);
vmathT3MakeIdentity(&translation);
vmathT3MakeIdentity(&ttmp);
vmathT3MakeScale(&scal, &sp->scale);
vmathT3MakeRotationZYX(&rotation, &sp->angle);
vmathT3MakeTranslation(&translation, &sp->pos);
vmathT3Mul(&tmp, &translation, &scale);
vmathT3Mul(&tmp, &tmp, &rotation);
vmathM4MakeFromT3(&sprites[i]->model_mat, &tmp);
cg_quad_getquadverts(&sp->in_vec30, &sp->invec31, &sp->invec32, &sp->invec33, sp->quad);
vmathM4MulV4(&sp->outvec0, &sp->m_mat, &sp->invec30);
vmathM4MulV4(&sp->outvec1, &sp->m_mat, &sp->invec31);
vmathM4MulV4(&sp->outvec2, &sp->m_mat, &sp->invec32);
vmathM4MulV4(&sp->outvec3, &sp->m_mat, &sp->invec33);
}
这是我编写的代码,我目前正在使用它并且它可以工作,但我需要将它抽象出来。手动更改这些变量会导致错误。
我想要做的不是在我的项目中间放置这么多代码,而是把它放在一个函数中。像
这样的功能for (int i = 0; i < count; i++) {
sp = sprites[i];
idx = 0;
// v0
v_buff[idx++] = sp->outvec30.x;
v_buff[idx++] = sp->outvec31.y;
v_buff[idx++] = sp->outvec32.z;
v_buff[idx++] = sp->quad->colors[0];
v_buff[idx++] = sp->quad->colors[1];
v_buff[idx++] = sp->quad->colors[2];
v_buff[idx++] = sp->quad->colors[3];
v_buff[idx++] = sp->quad->tex_coords[0];
v_buff[idx++] = sp->quad->tex_coords[1];
// v1
v_buff[idx++] = sp->outvec31.x;
v_buff[idx++] = sp->outvec31.y;
v_buff[idx++] = sp->outvec31.z;
v_buff[idx++] = sp->quad->colors[4];
v_buff[idx++] = sp->quad->colors[5];
v_buff[idx++] = sp->quad->colors[6];
v_buff[idx++] = sp->quad->colors[7];
v_buff[idx++] = sp->quad->tex_coords[2];
v_buff[idx++] = sp->quad->tex_coords[3];
// v2
v_buff[idx++] = sp->outvec32.x;
v_buff[idx++] = sp->outvec32.y;
v_buff[idx++] = sp->outvec32.z;
v_buff[idx++] = sp->quad->colors[8];
v_buff[idx++] = sp->quad->colors[9];
v_buff[idx++] = sp->quad->colors[10];
v_buff[idx++] = sp->quad->colors[11];
v_buff[idx++] = sp->quad->tex_coords[4];
v_buff[idx++] = sp->quad->tex_coords[5];
// v3
v_buff[idx++] = sp->outvec33.x;
v_buff[idx++] = sp->outvec33.y;
v_buff[idx++] = sp->outvec33.z;
v_buff[idx++] = sp->quad->colors[12];
v_buff[idx++] = sp->quad->colors[13];
v_buff[idx++] = sp->quad->colors[14];
v_buff[idx++] = sp->quad->colors[15];
v_buff[idx++] = sp->quad->tex_coords[6];
v_buff[idx++] = sp->quad->tex_coords[7];
}
将获取该精灵,对数据执行矩阵变换,然后将outvec,color,uv附加到正确位置的v_buff上。
但到目前为止,我将其置于函数内的尝试都失败了。它不是非常复杂的代码,但我只是没有看到如何将这个函数抽象出来。
是否有人可以建议我如何将上面的代码放在一个函数中,以便我可以在每个循环中多次调用它而不会完全颠覆已经存储在v_buff中的数据?
答案 0 :(得分:2)
您可以将submit()
函数传递给值:
submit(0)
submit(5)
submit(6)
并在您的函数submit()
中,将值指定给local_idx
;您可以使用for
循环或某个循环,但这是可选的。
另一方面,您也可以使用idx
的静态值;你需要在函数中使用一个静态变量,并且值将在调用之间保存。
答案 1 :(得分:0)
我相信,您需要将local_idx
定义为static
变量。
或者,为了更好,完全摆脱local_idx
,将idx
本身设为static
,并使用与索引相同的内容。
在那种情况下,
详细说明static
存储类说明符,引用C11
标准,章节§6.2.4,
在没有存储类说明符的情况下声明其标识符的对象
_Thread_local
,以及外部或内部链接或存储类 说明符static
具有静态存储持续时间。它的一生就是整个执行 程序及其存储的值仅在程序启动之前初始化一次。
也就是说,您需要确保用于abc
的索引值有效,以避免undefined behavior超出范围。
答案 2 :(得分:0)
使变量成为静态。例如
void submit() {
static int idx;
int local_idx = idx++;
if ( idx > SomePredefinedValue ) idx = 0;
abc[local_idx++] = a[0]; //first call to submit(), local idx starts at 0
abc[local_idx++] = b[0];
abc[local_idx++] = c[0];
abc[local_idx++] = a[1];
abc[local_idx++] = b[1];
abc[local_idx++] = c[1];
abc[local_idx++] = a[2];
abc[local_idx++] = b[2];
abc[local_idx++] = c[2]; //first call to submit(), local idx ends at 8
}