541 |
(JNIEnv *env, jclass, jint id, jint w, jint h, jint d, jint comp, |
(JNIEnv *env, jclass, jint id, jint w, jint h, jint d, jint comp, |
542 |
jstring internalFormat, |
jstring internalFormat, |
543 |
jstring format, |
jstring format, |
544 |
jstring name, jobjectArray params) { |
jstring name, jobjectArray params, jboolean shade_all_levels) { |
545 |
setWindow(); |
setWindow(); |
546 |
DBG(dbg)<<"Shade into "<<id<<"\n"; |
DBG(dbg)<<"Shade into "<<id<<"\n"; |
547 |
|
|
563 |
|
|
564 |
float *value = new float[w * h * (d==0?1:d) * comp]; |
float *value = new float[w * h * (d==0?1:d) * comp]; |
565 |
|
|
566 |
s->render(&p, w, h, (d==0?1:d), comp, value); |
GLenum target = (d == 0) ? GL_TEXTURE_2D : GL_TEXTURE_3D; |
567 |
|
|
568 |
if(d == 0) { |
glBindTexture(target, id); |
|
glBindTexture(GL_TEXTURE_2D, id); |
|
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE); |
|
|
glTexImage2D(GL_TEXTURE_2D, 0, |
|
|
tokenFromJstring(env, internalFormat), |
|
|
w, h, 0, |
|
|
tokenFromJstring(env, format), |
|
|
GL_FLOAT, |
|
|
value); |
|
|
|
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, 0); |
|
|
} else { |
|
|
glBindTexture(GL_TEXTURE_3D, id); |
|
|
GLERR |
|
|
|
|
|
glTexParameteri(GL_TEXTURE_3D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE); |
|
|
GLERR |
|
|
|
|
|
glTexImage3D(GL_TEXTURE_3D, 0, |
|
|
tokenFromJstring(env, internalFormat), |
|
|
w, h, d, 0, |
|
|
tokenFromJstring(env, format), |
|
|
GL_FLOAT, |
|
|
value); |
|
|
|
|
|
GLERR |
|
|
|
|
|
|
|
|
glBindTexture(GL_TEXTURE_3D, 0); |
|
|
GLERR |
|
569 |
|
|
570 |
|
if (!shade_all_levels) { |
571 |
|
glTexParameteri(target, GL_GENERATE_MIPMAP_SGIS, GL_TRUE); |
572 |
|
GLERR; |
573 |
|
} |
574 |
|
|
575 |
|
int level; |
576 |
|
for (level = 0; ; level++) { |
577 |
|
s->render(&p, w, h, (d==0?1:d), comp, value); |
578 |
|
|
579 |
|
if (d == 0) |
580 |
|
glTexImage2D(GL_TEXTURE_2D, level, |
581 |
|
tokenFromJstring(env, internalFormat), |
582 |
|
w, h, 0, |
583 |
|
tokenFromJstring(env, format), |
584 |
|
GL_FLOAT, |
585 |
|
value); |
586 |
|
else |
587 |
|
glTexImage3D(GL_TEXTURE_3D, level, |
588 |
|
tokenFromJstring(env, internalFormat), |
589 |
|
w, h, d, 0, |
590 |
|
tokenFromJstring(env, format), |
591 |
|
GL_FLOAT, |
592 |
|
value); |
593 |
|
|
594 |
|
GLERR; |
595 |
|
|
596 |
|
if (! (shade_all_levels && (w > 1 || h > 1 || d > 1))) break; |
597 |
|
|
598 |
|
w = (w + 1) >> 1; |
599 |
|
h = (h + 1) >> 1; |
600 |
|
d = (d + 1) >> 1; |
601 |
|
} |
602 |
|
|
603 |
|
if (shade_all_levels) { |
604 |
|
glTexParameterf(target, GL_TEXTURE_BASE_LEVEL, 0); |
605 |
|
glTexParameterf(target, GL_TEXTURE_MAX_LEVEL, level); |
606 |
} |
} |
607 |
|
|
608 |
|
glBindTexture(target, 0); |
609 |
|
GLERR; |
610 |
|
|
611 |
delete[] value; |
delete[] value; |
612 |
delete s; |
delete s; |