|
metaball based scenes November 23, 2010 06:39AM |
Registered: 3 years ago Posts: 181 |
#include "mathutils.pur3h"
#include "Metaball.pur3h"
//#include "FeedbackBackground.pur3h"
#include "RandomRenderSolid.pur3h"
#include "Medusa.pur3h"
#include "Background.pur3h"
#include "JumpCamera.pur3h"
#include "AnimatedPoint.pur3h"
#include "Particles.pur3h"
CVolume vol;
float pos;
CBackground background;
CRandomRenderSolid solidRender;
CParticles pRender;
CJumpCamera camera;
const int METABALLS = 8;
const int MESH = 24;
const int MESH_HALF = MESH/2;
const int TRAILS = 64;
const int TRAIL_LENGTH = 15;
float[METABALLS] mbSpeed;
float[METABALLS] mbSize;
float[METABALLS] mbSound;
CAnimatedPoint[METABALLS] mbPos;
Vector3[METABALLS] mbVector;
Vector3[TRAILS] trails;
CMedusa medusa;
int particleTex;
int shader;
export void init() {
background.create();
particleTex = texLoad(/*"xml://Particle"*/"biotrail.png");//"particle_simple.png");
shader = shaderLoad("vSimple.glsl", "fTexColor.glsl");
pos = 0;
vol.create(MESH,MESH,MESH);
int i,j;
for (i=0;i<METABALLS;i++) {
mbSpeed[i] = rand()+0.5;
mbSize[i] = (rand()+0.5)*5000;
mbSound[i] = (rand()+0.3)*2;
mbPos[i].create();
}
solidRender.create();
pRender.create();
medusa.create(TRAILS, TRAIL_LENGTH, 0.4/*spacing*/, 0.5);
for (i=0;i<medusa.tailElements;i++)
medusa.sizes[i] = 30.0 / (i+40);
for (i=0;i<medusa.tails;i++) {
trails[i] = Vector3( 3 + rand()*(MESH-8), 3 + rand()*(MESH-8), 3 + rand()*(MESH-8));
Vector3 *tailPos = medusa.getTail(i);
for (j=0;j<medusa.tailElements;j++)
tailPos[j] = trails[i];
}
camera.create(Vector3(-MESH,-MESH,MESH*3/2), Vector3(MESH*2, MESH*2, MESH*2),
Vector3(MESH/4,MESH/4,MESH/4), Vector3(MESH*3/4, MESH*3/4, MESH*3/4),
Vector3(0,1,0));
}
export void kill() {
solidRender.destroy();
vol.destroy();
background.destroy();
pRender.destroy();
int i;
for (i=0;i<METABALLS;i++)
mbPos[i].destroy();
medusa.destroy();
texDestroy(particleTex);
shaderDestroy(shader);
camera.destroy();
}
export void step() {
float timePass = visGetFloat(VIS_TIME_DIFF);
float sound = visGetFloat(VIS_SOUND_BASS);
pos += timePass ;
vol.clear(-1000);
int i,j;
for (i=0;i<METABALLS;i++) {
mbPos[i].step(timePass * (mbSpeed[i] + sound * mbSound[i]));
mbVector[i] = vAdd(Vector3(MESH_HALF,MESH_HALF,MESH_HALF),vMul(mbPos[i].pos, 7));
vol.ball(mbVector[i], mbSize[i], 2);
}
// move particles!
for (i=0;i<medusa.tails;i++) {
Vector3 tpos = trails[i];
float a = vol.getValueAt(tpos);
Vector3 norm = vNorm(vol.getGradientAt(tpos));
Vector3 gradient = vMul(norm, -clip(a*0.2, -20, 20));
Vector3 attrac = Vector3(0,0,0);
for (j=0;j<medusa.tails;j++)
if (i!=j) {
Vector3 diff = vSub(tpos, trails[j]);
float r = vMag(diff);
attrac = vAdd(attrac, vMul(vNorm(diff), 16/(r*r) - r*0.004));
}
trails[i] = vAdd(tpos, vMul(vAdd(gradient, attrac), timePass));
Vector3 *mTail = medusa.getTail(i);
mTail[0] = trails[i];
mTail[1] = vSub(trails[i], vMul(norm, medusa.tailSpacing));
}
medusa.step((Matrix*)NULL, timePass);
camera.step();
background.step();
}
export void render() {
int counter,counttothree;
counter = counter + 1 ;
if (counter == medusa.tails+1){
counter = 1;
}
vol.calculate();
setPerspective(90, visGetFloat(VIS_ASPECT), 0.1, 75);
setMatrix(MAT_MODEL, &camera.matrix);
if (background.maskStart()) {
vol.render();
background.maskEnd();
}
// background
background.mainStart();
solidRender.renderStart(background.getBackgroundTexture());
// draw a black inner
glSetInt(GL_COLOR, 0xFF000000);
vol.buffer.explode(-2);
vol.render();
// now draw 2 shells
glSetInt(GL_DEPTH_MASK, 0); // don't write to depth buffer
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glSetInt(GL_COLOR, 0x3FFFFFFF);
vol.buffer.explode(1);
vol.render();
vol.buffer.explode(1);
vol.render();
glSetInt(GL_DEPTH_MASK, 1);
solidRender.renderEnd();
float size = getSizeMultiplier();
float red [256];
float green [256];
float blue [256];
pRender.start(medusa.tails*medusa.tailElements);
for (int i=0;i<medusa.tails;i++) {
if (i==counter){
red[i] = visGetFloat(VIS_SOUND_BASS);
green[i] = visGetFloat(VIS_SOUND_MID);
blue[i] = visGetFloat(VIS_SOUND_TREBLE);
}
Vector3 *p = medusa.getTail(i);
pRender.addTrail(p, medusa.tailElements, 0.2*red[i]);
}
pRender.end();
glSetInt(GL_COLOR, 0xFFFFFFFF);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glSetInt(GL_DEPTH_MASK, 0);
texBind(0, particleTex);
shaderBind(shader);
pRender.render();
glSetInt(GL_DEPTH_MASK, 1);
background.mainEnd();
}
here is the modified movement, under void.step
for (i=0;i<METABALLS;i++) {
mbPos[i].step(timePass * (mbSpeed[i] + sound * mbSound[i]));
mbVector[i] = vAdd(Vector3(MESH_HALF,MESH_HALF,MESH_HALF),vMul(mbPos[i].pos, 7));
vol.ball(mbVector[i], mbSize[i], 2);
}
the problem with this scene is the tails...
int counter,counttothree;
counter = counter + 1 ;
if (counter == medusa.tails+1){
counter = 1;
}
this is the 'frame counter'
float red [256]; float green [256]; float blue [256];the reason for the red , green and blue was because i was originally hoping to change the colour of the tails independently, but it seems that is not possible
for (int i=0;i<medusa.tails;i++) {
if (i==counter){
red[i] = visGetFloat(VIS_SOUND_BASS) ;
green[i] = visGetFloat(VIS_SOUND_MID);
blue[i] = visGetFloat(VIS_SOUND_TREBLE);
}
Vector3 *p = medusa.getTail(i);
pRender.addTrail(p, medusa.tailElements, 0.2*red[i]);
}
as you can see, i have only used the red colour corresponding to the bass
|
Re: metaball based scenes December 13, 2010 09:50AM |
Admin Registered: 3 years ago Posts: 458 |
|
Re: metaball based scenes December 13, 2010 12:55PM |
Registered: 3 years ago Posts: 181 |
|
Re: metaball based scenes December 16, 2010 12:32PM |
Admin Registered: 3 years ago Posts: 458 |
|
Re: metaball based scenes December 17, 2010 05:31PM |
Registered: 3 years ago Posts: 181 |
#include "mathutils.pur3h"
#include "Metaball.pur3h"
//#include "FeedbackBackground.pur3h"
#include "RandomRenderSolid.pur3h"
#include "Medusa.pur3h"
#include "Background.pur3h"
#include "JumpCamera.pur3h"
#include "AnimatedPoint.pur3h"
#include "ColourParticles.pur3h"
CVolume vol;
float pos;
CBackground background;
CRandomRenderSolid solidRender;
CColourParticles pRender;
CJumpCamera camera;
const int METABALLS = 8;
const int MESH = 24;
const int MESH_HALF = MESH/2;
const int TRAILS = 64;
const int TRAIL_LENGTH = 15;
float[METABALLS] mbSpeed;
float[METABALLS] mbSize;
float[METABALLS] mbSound;
CAnimatedPoint[METABALLS] mbPos;
Vector3[METABALLS] mbVector;
Vector3[TRAILS] trails;
CMedusa medusa;
int particleTex;
int shader;
int counter;
float red [255];
float green [255];
float blue [255];
float size;
export void init() {
background.create();
particleTex = texLoad(/*"xml://Particle"*/"biotrail.png");//"particle_simple.png");
shader = shaderLoad("vSimple.glsl", "fTexColor.glsl");
pos = 0;
vol.create(MESH,MESH,MESH);
int i,j;
for (i=0;i<METABALLS;i++) {
mbSpeed[i] = rand()+0.5;
mbSize[i] = (rand()+0.5)*5000;
mbSound[i] = (rand()+0.3)*2;
mbPos[i].create();
}
solidRender.create();
pRender.create();
medusa.create(TRAILS, TRAIL_LENGTH, 0.4/*spacing*/, 0.5);
for (i=0;i<medusa.tailElements;i++)
medusa.sizes[i] = 30.0 / (i+40);
for (i=0;i<medusa.tails;i++) {
trails[i] = Vector3( 3 + rand()*(MESH-8), 3 + rand()*(MESH-8), 3 + rand()*(MESH-8));
Vector3 *tailPos = medusa.getTail(i);
for (j=0;j<medusa.tailElements;j++)
tailPos[j] = trails[i];
}
camera.create(Vector3(-MESH,-MESH,MESH*3/2), Vector3(MESH*2, MESH*2, MESH*2),
Vector3(MESH/4,MESH/4,MESH/4), Vector3(MESH*3/4, MESH*3/4, MESH*3/4),
Vector3(0,1,0));
}
export void kill() {
solidRender.destroy();
vol.destroy();
background.destroy();
pRender.destroy();
int i;
for (i=0;i<METABALLS;i++)
mbPos[i].destroy();
medusa.destroy();
texDestroy(particleTex);
shaderDestroy(shader);
camera.destroy();
}
export void step() {
float timePass = visGetFloat(VIS_TIME_DIFF);
float sound = visGetFloat(VIS_SOUND_BASS);
pos += timePass ;
vol.clear(-1000);
int i,j;
for (i=0;i<METABALLS;i++) {
mbPos[i].step(timePass * (mbSpeed[i] + sound * mbSound[i]));
mbVector[i] = vAdd(Vector3(MESH_HALF,MESH_HALF,MESH_HALF),vMul(mbPos[i].pos, 7));
vol.ball(mbVector[i], mbSize[i], 2);
}
// move particles!
for (i=0;i<medusa.tails;i++) {
Vector3 tpos = trails[i];
float a = vol.getValueAt(tpos);
Vector3 norm = vNorm(vol.getGradientAt(tpos));
Vector3 gradient = vMul(norm, -clip(a*0.2, -20, 20));
Vector3 attrac = Vector3(0,0,0);
for (j=0;j<medusa.tails;j++)
if (i!=j) {
Vector3 diff = vSub(tpos, trails[j]);
float r = vMag(diff);
attrac = vAdd(attrac, vMul(vNorm(diff), 16/(r*r) - r*0.004));
}
trails[i] = vAdd(tpos, vMul(vAdd(gradient, attrac), timePass));
Vector3 *mTail = medusa.getTail(i);
mTail[0] = trails[i];
mTail[1] = vSub(trails[i], vMul(norm, medusa.tailSpacing));
}
medusa.step((Matrix*)NULL, timePass);
camera.step();
background.step();
}
export void render() {
counter = counter + 1 ;
if (counter == medusa.tails){
counter = 0;
}
vol.calculate();
setPerspective(90, visGetFloat(VIS_ASPECT), 0.1, 75);
setMatrix(MAT_MODEL, &camera.matrix);
if (background.maskStart()) {
vol.render();
background.maskEnd();
}
// background
background.mainStart();
solidRender.renderStart(background.getBackgroundTexture());
// draw a black inner
glSetInt(GL_COLOR, 0xFF000000);
vol.buffer.explode(-2);
vol.render();
// now draw 2 shells
glSetInt(GL_DEPTH_MASK, 0); // don't write to depth buffer
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glSetInt(GL_COLOR, 0x3FFFFFFF);
vol.buffer.explode(1);
vol.render();
vol.buffer.explode(1);
vol.render();
glSetInt(GL_DEPTH_MASK, 1);
solidRender.renderEnd();
size = getSizeMultiplier();
pRender.start(medusa.tails*medusa.tailElements);
for (int i=0;i<medusa.tails;i++) {
if (counter==i){
red[i] = visGetFloat(VIS_SOUND_BASS);
green[i] = visGetFloat(VIS_SOUND_MID);
blue[i] = visGetFloat(VIS_SOUND_TREBLE);
}
Vector3 *p = medusa.getTail(i);
pRender.addTrail(p, medusa.tailElements, 0.2*size, Colour4(red[i],green[i],blue[i],1));
}
pRender.end();
glSetInt(GL_COLOR, 0xFFFFFFFF);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glSetInt(GL_DEPTH_MASK, 0);
texBind(0, particleTex);
shaderBind(shader);
pRender.render();
glSetInt(GL_DEPTH_MASK, 1);
background.mainEnd();
}
|
Re: metaball based scenes December 27, 2010 07:33PM |
Registered: 3 years ago Posts: 181 |
|
Re: metaball based scenes December 29, 2010 05:30AM |
Registered: 3 years ago Posts: 181 |
|
Re: metaball based scenes January 10, 2011 12:04PM |
Admin Registered: 3 years ago Posts: 458 |
|
Re: metaball based scenes January 15, 2011 05:43AM |
Registered: 3 years ago Posts: 181 |
|
Re: metaball based scenes January 16, 2011 12:08PM |
Admin Registered: 3 years ago Posts: 458 |
|
Re: metaball based scenes January 17, 2011 01:57PM |
Registered: 3 years ago Posts: 181 |