int render_metaballs(float time, float ltime) { int obj = 0; float dist1 = 128 + sinf(time * M_PI * 1.0 * 0.8 * 0.4 + 0) * 95; float dist2 = 128 + sinf(time * M_PI * 1.2 * 0.8 * 0.4 + 1) * 95; float dist3 = 130 + sinf(time * M_PI * 1.3 * 0.8 * 0.4 + 2) * 95; float dist4 = 100 + sinf(time * M_PI * 1.4 * 0.8 * 0.4 + 3) * 95; float dist5 = 128 + sinf(time * M_PI * 1.5 * 0.5 * 0.4 + 4) * 95; float dist6 = 128 + sinf(time * M_PI * 1.6 * 0.5 * 0.4 + 5) * 95; float dist7 = 130 + sinf(time * M_PI * 1.7 * 0.5 * 0.4 + 6) * 95; float dist8 = 100 + sinf(time * M_PI * 1.8 * 0.5 * 0.4 + 7) * 95; if (time < 1.0) dist1 -= 256-256*sinf((time) * M_PI / 2); if (time < 3.0) dist2 += 256-256*sinf((time-2.0) * M_PI / 2); if (time < 5.0) { dist7 -= 256-256*sinf((time-4.0) * M_PI / 2); dist3 += 256-256*sinf((time-4.0) * M_PI / 2); } if (time < 7.0) { dist8 -= 256-256*sinf((time-6.0) * M_PI / 2); dist4 -= 256-256*sinf((time-6.0) * M_PI / 2); } if (ltime < 7.0) dist1 -= 256-256*sinf((ltime-6.0) * M_PI / 2); if (ltime < 5.0) dist2 += 256-256*sinf((ltime-4.0) * M_PI / 2); if (ltime < 3.0) { dist7 -= 256-256*sinf((ltime-2.0) * M_PI / 2); dist3 += 256-256*sinf((ltime-2.0) * M_PI / 2); } if (ltime < 1.0) { dist8 -= 256-256*sinf((ltime) * M_PI / 2); dist4 -= 256-256*sinf((ltime) * M_PI / 2); } memset(mbuf, 0, sizeof mbuf); if (ltime > 6.0) draw_metaball(dist1, dist5, 45); if (time > 2.0 && ltime > 4.0) draw_metaball(dist2, dist6, 10); if (time > 4.0 && ltime > 2.0) draw_metaball(dist7, dist3, 30); if (time > 6.0) draw_metaball(dist8, dist4, 70); olPushMatrix(); olTranslate(-1.0f, -1.0f); olScale(2.0f/256.0f, 2.0f/256.0f); //printf("%d %d\n", mbuf[0][0], mbuf[128][128]); obj = trace(&mbuf[0][0], &mtmp[0][0], 20000, 256, 256, 1); olPopMatrix(); return obj; }
void render_fire(float left) { int x,y,i; int w = 256; int h = 256; for(i=0; i<2; i++) { int *p = &mbuf[h-1][0]; for (x=0;x<256;x++) { if (left > 0.7 && (random() % 100) > 60) *p++ = 1024; else *p++ = 0; } if (left > 2.0 && random() % 32 == 0) mbuf[h-1][random()%w] = random()%120000; for (y=254;y>=0;y--) { p = &mbuf[y][0]; *p++ = 0; for (x=1;x<255;x++) { *p = (*p + p[w-1] + p[w] + p[w+1]) / 4; if (*p) (*p)--; p++; } *p++ = 0; } } olPushMatrix(); olScale(1, -1); olTranslate(-1.0f, -1.0f); olScale(2.0f/256.0f, 2.0f/256.0f); olPushColor(); olMultColor(C_RED+C_GREEN_I(150)); trace(&mbuf[0][0], &mtmp[0][0], 200, 256, 235, 2); olPopColor(); olPushColor(); olMultColor(C_RED+C_GREEN_I(100)); trace(&mbuf[0][0], &mtmp[0][0], 250, 256, 235, 2); olPopColor(); olPushColor(); olMultColor(C_RED+C_GREEN_I(50)); trace(&mbuf[0][0], &mtmp[0][0], 300, 256, 235, 2); olPopColor(); olPushColor(); olMultColor(C_RED+C_GREEN_I(0)); trace(&mbuf[0][0], &mtmp[0][0], 400, 256, 235, 2); olPopColor(); olPopMatrix(); }
void circle(float x, float y, float r, uint32_t color) { olPushMatrix(); olPushColor(); olMultColor(color); olTranslate(x, y); olRotate((x+y)*123); /*olBegin(OL_BEZIERSTRIP); olVertex(0, r, color); int i; for (i=0; i<2; i++) { olVertex(CP*r, r, C_WHITE); olVertex(r, CP*r, C_WHITE); olVertex(r, 0, C_WHITE); olVertex(r, -CP*r, C_WHITE); olVertex(CP*r, -r, C_WHITE); olVertex(0, -r, C_WHITE); olVertex(-CP*r, -r, C_WHITE); olVertex(-r, -CP*r, C_WHITE); olVertex(-r, 0, C_WHITE); olVertex(-r, CP*r, C_WHITE); olVertex(-CP*r, r, C_WHITE); olVertex(0, r, C_WHITE); }*/ /* olVertex(0, r, color); olVertex(0, r, color); olVertex(r*0.1, r, color); olVertex(r*0.1, r, color);*/ float circum = 2 * M_PI * r; int segments = circum / (1/30.0); if (segments < 50) segments = 50; int i; olBegin(OL_POINTS); olVertex(r, 0); for (i=0; i<=(2*segments+10); i++) { float w = i * M_PI * 2.0 / segments; uint32_t c = C_WHITE; if (i > 2*segments) c = C_GREY((10-(i-segments)) * 28); else if (i < 3) c = C_GREY(i * 85); olVertex(r*cosf(w), r*sinf(w)); } olEnd(); olPopColor(); olPopMatrix(); }
static VALUE ol_popMatrix() { olPopMatrix(); return Qnil; }