From e6ef7671529435b462bf6be5ae0b1805bc59bff0 Mon Sep 17 00:00:00 2001 From: Yoz Grahame Date: Tue, 6 Nov 2012 17:59:20 -0800 Subject: [PATCH] Uses point sprites, Grayson's texture, and 100,000 particles --- images/grayson-particle.png | Bin 0 -> 37806 bytes interface.xcodeproj/project.pbxproj | 4 ++ main.cpp | 94 +++++++++++++++++++--------- 3 files changed, 67 insertions(+), 31 deletions(-) create mode 100644 images/grayson-particle.png diff --git a/images/grayson-particle.png b/images/grayson-particle.png new file mode 100644 index 0000000000000000000000000000000000000000..9337af64f18244b3a96198e0b4de3d3a72b9d7f1 GIT binary patch literal 37806 zcmW(*c{~%2|K4U}Hpd(dxi;t0(nLAK=9XhZS&?C)Qm$MHGjo({j!NZLt`00IxsQ)K z6uD(0x7_#jdwqX@y#IOs^Zw&`UeEjWdYh;3&aNnv`%Z4IS6!VbLEi1IS^z)_(L^6_6F9O| zbBE#4?kC}I@w@n6=;#t07a_t00HU0p0))Iz0Y5&+(*Qul>@!cxjjyC0MeB(94?VxX zm$mFQw2xLq$HEMU_$u^q6r-5iY0PPyIX@Ws0QDS=C*uxisvEx-Lu;=8y4+p;GH8P` z(_UqBJzy(%<8J;f+v~OiAC}V(yLU1mliem-A%9{AC$i7~HU_*1XDx&2GyX?As&ipP z$5(Yf98`CPMxp+EYgb}$zf=_>)uey&64ZKk>Sk32uZgCdx9w{eJZsYz`?__;yKq(a z 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 M07*qoM6N<$g1=fz9RL6T literal 0 HcmV?d00001 diff --git a/interface.xcodeproj/project.pbxproj b/interface.xcodeproj/project.pbxproj index 2e363eab4c..d98e101f9d 100644 --- a/interface.xcodeproj/project.pbxproj +++ b/interface.xcodeproj/project.pbxproj @@ -28,6 +28,7 @@ F681356E16488470003040E3 /* philip-image.png in CopyFiles */ = {isa = PBXBuildFile; fileRef = F681356D1648846A003040E3 /* philip-image.png */; }; F681358B1648896D003040E3 /* lodepng.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F681358A1648896D003040E3 /* lodepng.cpp */; }; F68135971649CF41003040E3 /* sphere.png in CopyFiles */ = {isa = PBXBuildFile; fileRef = F68135951649CF38003040E3 /* sphere.png */; }; + F68135B21649EF3F003040E3 /* grayson-particle.png in CopyFiles */ = {isa = PBXBuildFile; fileRef = F68135B01649EF37003040E3 /* grayson-particle.png */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -37,6 +38,7 @@ dstPath = ""; dstSubfolderSpec = 16; files = ( + F68135B21649EF3F003040E3 /* grayson-particle.png in CopyFiles */, F68135971649CF41003040E3 /* sphere.png in CopyFiles */, F681356E16488470003040E3 /* philip-image.png in CopyFiles */, F68135691648830D003040E3 /* pngtest8rgba.png in CopyFiles */, @@ -80,6 +82,7 @@ F681358A1648896D003040E3 /* lodepng.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lodepng.cpp; sourceTree = ""; }; F681358C16488978003040E3 /* lodepng.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lodepng.h; sourceTree = ""; }; F68135951649CF38003040E3 /* sphere.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = sphere.png; sourceTree = ""; }; + F68135B01649EF37003040E3 /* grayson-particle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "grayson-particle.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -174,6 +177,7 @@ F681356716487A7F003040E3 /* images */ = { isa = PBXGroup; children = ( + F68135B01649EF37003040E3 /* grayson-particle.png */, F68135951649CF38003040E3 /* sphere.png */, F681356D1648846A003040E3 /* philip-image.png */, F681356816487A7F003040E3 /* pngtest8rgba.png */, diff --git a/main.cpp b/main.cpp index d0f58d68a9..d437cc2641 100644 --- a/main.cpp +++ b/main.cpp @@ -16,6 +16,8 @@ #ifdef __APPLE__ #include +#include +#include #else #include #endif @@ -114,9 +116,9 @@ ParticleSystem balls(500, #define RENDER_FRAME_MSECS 10 #define SLEEP 0 -#define NUM_TRIS 100 // 20000 //000 +#define NUM_TRIS 1000 * 500 // 20000 //000 struct { - float vertices[NUM_TRIS * 9]; + float vertices[NUM_TRIS * 3]; float normals [NUM_TRIS * 3]; float colors [NUM_TRIS * 3]; float vel [NUM_TRIS * 3]; @@ -192,6 +194,20 @@ timeval timer_start, timer_end; timeval last_frame; double elapsedTime; +// Particles + +// To add a new texture: +// 1. Add to the XCode project in the Resources/images group +// (ensure "Copy file" is checked +// 2. Add to the "Copy files" build phase in the project +char texture_filename[] = "grayson-particle.png"; +unsigned int texture_width = 256; +unsigned int texture_height = 256; + +float particle_attenuation_quadratic[] = { 0.0f, 0.0f, 2.0f }; // larger Z = smaller particles + + + // Every second, check the frame rates and other stuff void Timer(int extra) { @@ -285,14 +301,12 @@ void init(void) randFloat() * WORLD_SIZE, randFloat() * WORLD_SIZE); glm::vec3 verts[3]; - for (j = 0; j < 3; j++) { - verts[j].x = pos.x + randFloat() * tri_scale - tri_scale/2.f; - verts[j].y = pos.y + randFloat() * tri_scale - tri_scale/2.f; - verts[j].z = pos.z + randFloat() * tri_scale - tri_scale/2.f; - tris.vertices[i*9 + j*3] = verts[j].x; - tris.vertices[i*9 + j*3 + 1] = verts[j].y; - tris.vertices[i*9 + j*3 + 2] = verts[j].z; - } + verts[j].x = pos.x + randFloat() * tri_scale - tri_scale/2.f; + verts[j].y = pos.y + randFloat() * tri_scale - tri_scale/2.f; + verts[j].z = pos.z + randFloat() * tri_scale - tri_scale/2.f; + tris.vertices[i*3] = verts[j].x; + tris.vertices[i*3 + 1] = verts[j].y; + tris.vertices[i*3 + 2] = verts[j].z; // reuse pos for the normal glm::normalize((pos += glm::cross(verts[1] - verts[0], verts[2] - verts[0]))); tris.normals[i*3] = pos.x; @@ -561,7 +575,7 @@ void update_pos(float frametime) void display(void) { - int i,j; + int i; glEnable (GL_DEPTH_TEST); glEnable(GL_LIGHTING); @@ -606,10 +620,6 @@ void display(void) but texture origin is at upper left => it has to be mirrored */ - char texture_filename[] = "sphere.png"; - unsigned int texture_width = 91; - unsigned int texture_height = 69; - int error = load_png_as_texture(texture_filename, texture_width, texture_height); glEnable(GL_TEXTURE_2D); glBegin(GL_QUADS); @@ -622,26 +632,48 @@ void display(void) glDisable(GL_TEXTURE_2D); - // Draw Triangles + // Draw Point Sprites - glBegin(GL_TRIANGLES); - for (i = 0; i < NUM_TRIS; i++) + /* assuming you have setup a 32-bit RGBA texture with a legal name */ + glActiveTexture(GL_TEXTURE0); + glEnable( GL_TEXTURE_2D ); + glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + + glPointParameterfvARB( GL_POINT_DISTANCE_ATTENUATION_ARB, particle_attenuation_quadratic ); + float maxSize = 0.0f; + glGetFloatv( GL_POINT_SIZE_MAX_ARB, &maxSize ); + glPointSize( maxSize ); + glPointParameterfARB( GL_POINT_SIZE_MAX_ARB, maxSize ); + // glPointParameterfARB( GL_POINT_SIZE_MIN_ARB, 0.001f ); + glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE ); + glEnable( GL_POINT_SPRITE_ARB ); + glBegin( GL_POINTS ); { - glColor3f(tris.colors[i*3], - tris.colors[i*3+1], - tris.colors[i*3+2]); - for (j = 0; j < 3; j++) + for (i = 0; i < NUM_TRIS; i++) { - glVertex3f(tris.vertices[i*9 + j*3], - tris.vertices[i*9 + j*3 + 1], - tris.vertices[i*9 + j*3 + 2]); + // glColor3f(tris.colors[i*3], + // tris.colors[i*3+1], + // tris.colors[i*3+2]); + // for (j = 0; j < 3; j++) + // { + // glVertex3f(tris.vertices[i*9 + j*3], + // tris.vertices[i*9 + j*3 + 1], + // tris.vertices[i*9 + j*3 + 2]); + // } + // glNormal3f(tris.normals[i*3], + // tris.normals[i*3 + 1], + // tris.normals[i*3 + 2]); + glVertex3f(tris.vertices[i*9], + tris.vertices[i*9+1], + tris.vertices[i*9+2]); + } - glNormal3f(tris.normals[i*3], - tris.normals[i*3 + 1], - tris.normals[i*3 + 2]); } glEnd(); - + glDisable( GL_TEXTURE_2D ); + glDisable( GL_POINT_SPRITE_ARB ); + // Show field vectors if (display_field) field_render(); @@ -654,7 +686,7 @@ void display(void) } myHand.render(); - balls.render(); + // balls.render(); // Render the world box render_world_box(); @@ -816,7 +848,7 @@ void idle(void) field_simulate(1.f/FPS); myHead.simulate(1.f/FPS); myHand.simulate(1.f/FPS); - balls.simulate(1.f/FPS); + // balls.simulate(1.f/FPS); if (!step_on) glutPostRedisplay(); last_frame = check;