Moving I/O code into head class, playing with blocks

This commit is contained in:
Philip Rosedale 2012-11-28 14:50:14 -08:00
commit a4daf22e37
8 changed files with 61 additions and 29 deletions

View file

@ -10,6 +10,8 @@
#include "cloud.h" #include "cloud.h"
#include "util.h" #include "util.h"
#define COLOR_MIN 0.3f // minimum R/G/B value at 0,0,0 - also needs setting in field.cpp
Cloud::Cloud(int num, Cloud::Cloud(int num,
glm::vec3 box, glm::vec3 box,
int wrap) { int wrap) {
@ -21,14 +23,21 @@ Cloud::Cloud(int num,
particles = new Particle[count]; particles = new Particle[count];
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
particles[i].position.x = randFloat()*box.x; float x = randFloat()*box.x;
particles[i].position.y = randFloat()*box.y; float y = randFloat()*box.y;
particles[i].position.z = randFloat()*box.z; float z = randFloat()*box.z;
particles[i].position.x = x;
particles[i].position.y = y;
particles[i].position.z = z;
particles[i].velocity.x = 0; //randFloat() - 0.5; particles[i].velocity.x = 0; //randFloat() - 0.5;
particles[i].velocity.y = 0; //randFloat() - 0.5; particles[i].velocity.y = 0; //randFloat() - 0.5;
particles[i].velocity.z = 0; //randFloat() - 0.5; particles[i].velocity.z = 0; //randFloat() - 0.5;
float color_mult = 1 - COLOR_MIN;
particles[i].color = glm::vec3(x*color_mult/WORLD_SIZE + COLOR_MIN,
y*color_mult/WORLD_SIZE + COLOR_MIN,
z*color_mult/WORLD_SIZE + COLOR_MIN);
} }
} }
@ -38,7 +47,7 @@ void Cloud::render() {
float particle_attenuation_quadratic[] = { 0.0f, 0.0f, 2.0f }; float particle_attenuation_quadratic[] = { 0.0f, 0.0f, 2.0f };
glEnable( GL_TEXTURE_2D ); glEnable( GL_TEXTURE_2D );
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glPointParameterfvARB( GL_POINT_DISTANCE_ATTENUATION_ARB, particle_attenuation_quadratic ); glPointParameterfvARB( GL_POINT_DISTANCE_ATTENUATION_ARB, particle_attenuation_quadratic );
float maxSize = 0.0f; float maxSize = 0.0f;
@ -52,6 +61,9 @@ void Cloud::render() {
glBegin( GL_POINTS ); glBegin( GL_POINTS );
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
glColor3f(particles[i].color.x,
particles[i].color.y,
particles[i].color.z);
glVertex3f(particles[i].position.x, glVertex3f(particles[i].position.x,
particles[i].position.y, particles[i].position.y,
particles[i].position.z); particles[i].position.z);
@ -75,7 +87,7 @@ void Cloud::simulate (float deltaTime) {
// Interact with Field // Interact with Field
const float FIELD_COUPLE = 0.0000001; const float FIELD_COUPLE = 0.0000001;
field_interact(&particles[i].position, &particles[i].velocity, FIELD_COUPLE); field_interact(&particles[i].position, &particles[i].velocity, &particles[i].color, FIELD_COUPLE);
// Bounce or Wrap // Bounce or Wrap
if (wrapBounds) { if (wrapBounds) {

View file

@ -22,7 +22,7 @@ public:
private: private:
struct Particle { struct Particle {
glm::vec3 position, velocity; glm::vec3 position, velocity, color;
} *particles; } *particles;
unsigned int count; unsigned int count;
glm::vec3 bounds; glm::vec3 bounds;

View file

@ -7,15 +7,13 @@
// //
#include "field.h" #include "field.h"
#include "glm/glm.hpp"
#define FIELD_SCALE 0.00050 #define FIELD_SCALE 0.00050
#define COLOR_DRIFT_RATE 0.001f // per-frame drift of particle color towards field element color
#define COLOR_MIN 0.3f // minimum R/G/B value at 0,0,0 - also needs setting in cloud.cpp
// A vector-valued field over an array of elements arranged as a 3D lattice // A vector-valued field over an array of elements arranged as a 3D lattice
struct {
glm::vec3 val;
} field[FIELD_ELEMENTS];
int field_value(float *value, float *pos) int field_value(float *value, float *pos)
// sets the vector value (3 floats) to field value at location pos in space. // sets the vector value (3 floats) to field value at location pos in space.
// returns zero if the location is outside world bounds // returns zero if the location is outside world bounds
@ -33,7 +31,6 @@ int field_value(float *value, float *pos)
else return 0; else return 0;
} }
void field_init() void field_init()
// Initializes the field to some random values // Initializes the field to some random values
{ {
@ -43,7 +40,12 @@ void field_init()
field[i].val.x = (randFloat() - 0.5)*FIELD_SCALE; field[i].val.x = (randFloat() - 0.5)*FIELD_SCALE;
field[i].val.y = (randFloat() - 0.5)*FIELD_SCALE; field[i].val.y = (randFloat() - 0.5)*FIELD_SCALE;
field[i].val.z = (randFloat() - 0.5)*FIELD_SCALE; field[i].val.z = (randFloat() - 0.5)*FIELD_SCALE;
} // and set up the RGB values for each field element.
float color_mult = 1 - COLOR_MIN;
fieldcolors[i].rgb = glm::vec3(((i%10)*(color_mult/10.0f)) + COLOR_MIN,
((i%100)*(color_mult/100.0f)) + COLOR_MIN,
(i*(color_mult/1000.0f)) + COLOR_MIN);
}
} }
void field_add(float* add, float *pos) void field_add(float* add, float *pos)
@ -60,7 +62,7 @@ void field_add(float* add, float *pos)
} }
} }
void field_interact(glm::vec3 * pos, glm::vec3 * vel, float coupling) { void field_interact(glm::vec3 * pos, glm::vec3 * vel, glm::vec3 * color, float coupling) {
int index = (int)(pos->x/WORLD_SIZE*10.0) + int index = (int)(pos->x/WORLD_SIZE*10.0) +
(int)(pos->y/WORLD_SIZE*10.0)*10 + (int)(pos->y/WORLD_SIZE*10.0)*10 +
@ -72,6 +74,9 @@ void field_interact(glm::vec3 * pos, glm::vec3 * vel, float coupling) {
glm::vec3 temp = *vel; glm::vec3 temp = *vel;
temp *= coupling; temp *= coupling;
field[index].val += temp; field[index].val += temp;
// add a fraction of the field color to the particle color
*color = (*color * (1 - COLOR_DRIFT_RATE)) + (fieldcolors[index].rgb * COLOR_DRIFT_RATE);
} }
} }
@ -172,3 +177,4 @@ void field_render()
} }

14
field.h
View file

@ -20,14 +20,22 @@
#include "glm/glm.hpp" #include "glm/glm.hpp"
// Field is a lattice of vectors uniformly distributed FIELD_ELEMENTS^(1/3) on side // Field is a lattice of vectors uniformly distributed FIELD_ELEMENTS^(1/3) on side
const int FIELD_ELEMENTS = 1000; const int FIELD_ELEMENTS = 1000;
struct {
glm::vec3 val;
} field[FIELD_ELEMENTS];
// Pre-calculated RGB values for each field element
struct {
glm::vec3 rgb;
} fieldcolors[FIELD_ELEMENTS];
void field_init(); void field_init();
int field_value(float *ret, float *pos); int field_value(float *ret, float *pos);
void field_render(); void field_render();
void field_add(float* add, float *loc); void field_add(float* add, float *loc);
void field_interact(glm::vec3 * pos, glm::vec3 * vel, float coupling); void field_interact(glm::vec3 * pos, glm::vec3 * vel, glm::vec3 * color, float coupling);
void field_simulate(float dt); void field_simulate(float dt);
glm::vec3 hsv2rgb(glm::vec3 in);
#endif #endif

View file

@ -302,6 +302,7 @@
"$(OTHER_CFLAGS)", "$(OTHER_CFLAGS)",
); );
PRODUCT_NAME = interface; PRODUCT_NAME = interface;
SDKROOT = macosx10.7;
}; };
name = Debug; name = Debug;
}; };
@ -320,11 +321,13 @@
/usr/local/lib, /usr/local/lib,
/usr/local/Cellar/libpng/1.5.13/lib, /usr/local/Cellar/libpng/1.5.13/lib,
); );
ONLY_ACTIVE_ARCH = NO;
OTHER_CPLUSPLUSFLAGS = ( OTHER_CPLUSPLUSFLAGS = (
"-O3", "-O3",
"$(OTHER_CFLAGS)", "$(OTHER_CFLAGS)",
); );
PRODUCT_NAME = interface; PRODUCT_NAME = interface;
SDKROOT = macosx10.7;
}; };
name = Release; name = Release;
}; };

View file

@ -49,9 +49,6 @@
#include "cloud.h" #include "cloud.h"
#include "agent.h" #include "agent.h"
//TGAImg Img;
using namespace std; using namespace std;
// Junk for talking to the Serial Port // Junk for talking to the Serial Port
@ -95,7 +92,8 @@ ParticleSystem balls(0,
0.0 // Gravity 0.0 // Gravity
); );
Cloud cloud(100000, // Particles
Cloud cloud(200000, // Particles
box, // Bounding Box box, // Bounding Box
false // Wrap false // Wrap
); );
@ -108,7 +106,7 @@ int cube_count = 0;
#define RENDER_FRAME_MSECS 10 #define RENDER_FRAME_MSECS 10
#define SLEEP 0 #define SLEEP 0
float yaw =0.f; // The yaw, pitch for the avatar head float yaw =0.f; // The yaw, pitch for the avatar head
float pitch = 0.f; // float pitch = 0.f; //
float start_yaw = 90.0; float start_yaw = 90.0;
float render_yaw = start_yaw; float render_yaw = start_yaw;
@ -244,11 +242,13 @@ void initDisplay(void)
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0); glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
load_png_as_texture(texture_filename);
} }
void init(void) void init(void)
{ {
int i; int i;
if (audio_on) { if (audio_on) {
Audio::init(); Audio::init();
@ -277,6 +277,10 @@ void init(void)
myHead.setNoise(noise); myHead.setNoise(noise);
} }
// turning cubes off for the moment -
// uncomment to re-enable
/*
int index = 0; int index = 0;
while (index < MAX_CUBES) { while (index < MAX_CUBES) {
cubes_position[index*3] = randFloat()*WORLD_SIZE; cubes_position[index*3] = randFloat()*WORLD_SIZE;
@ -297,16 +301,16 @@ void init(void)
float scale = 10.0; float scale = 10.0;
int j = 0; int j = 0;
while (index < 4) { //(index < (MAX_CUBES/2)) { while (index < (MAX_CUBES/2)) {
index = 0; index = 0;
j++; j++;
makeCubes(location, scale, &index, cubes_position, cubes_scale, cubes_color); makeCubes(location, scale, &index, cubes_position, cubes_scale, cubes_color);
std::cout << "Run " << j << " Made " << index << " cubes\n"; std::cout << "Run " << j << " Made " << index << " cubes\n";
cube_count = index; cube_count = index;
}*/ }
*/
//load_png_as_texture(texture_filename);
if (serial_on) if (serial_on)
{ {
// Call readsensors for a while to get stable initial values on sensors // Call readsensors for a while to get stable initial values on sensors
@ -533,8 +537,6 @@ void display(void)
/* Draw Point Sprites */ /* Draw Point Sprites */
load_png_as_texture(texture_filename);
glDisable( GL_POINT_SPRITE_ARB ); glDisable( GL_POINT_SPRITE_ARB );
glDisable( GL_TEXTURE_2D ); glDisable( GL_TEXTURE_2D );
if (!display_head) cloud.render(); if (!display_head) cloud.render();

View file

@ -34,6 +34,7 @@ int load_png_as_texture(char* filename)
unsigned int width = 1, height = 1; unsigned int width = 1, height = 1;
unsigned error = lodepng::decode(image, width, height, filename); unsigned error = lodepng::decode(image, width, height, filename);
if (error) { if (error) {
std::cout << "Error loading texture" << std::endl;
return (int) error; return (int) error;
} }