void PointSet::Emit ( float spacing ) { Particle* p; Vector3DF dir; Vector3DF pos; float ang_rand, tilt_rand; float rnd = m_Vec[EMIT_RATE].y * 0.15; int x = (int) sqrt(m_Vec[EMIT_RATE].y); for ( int n = 0; n < m_Vec[EMIT_RATE].y; n++ ) { ang_rand = (float(rand()*2.0/RAND_MAX) - 1.0) * m_Vec[EMIT_SPREAD].x; tilt_rand = (float(rand()*2.0/RAND_MAX) - 1.0) * m_Vec[EMIT_SPREAD].y; dir.x = cos ( ( m_Vec[EMIT_ANG].x + ang_rand) * DEGtoRAD ) * sin( ( m_Vec[EMIT_ANG].y + tilt_rand) * DEGtoRAD ) * m_Vec[EMIT_ANG].z; dir.y = sin ( ( m_Vec[EMIT_ANG].x + ang_rand) * DEGtoRAD ) * sin( ( m_Vec[EMIT_ANG].y + tilt_rand) * DEGtoRAD ) * m_Vec[EMIT_ANG].z; dir.z = cos ( ( m_Vec[EMIT_ANG].y + tilt_rand) * DEGtoRAD ) * m_Vec[EMIT_ANG].z; pos = m_Vec[EMIT_POS]; pos.x += spacing * (n/x); pos.y += spacing * (n%x); p = (Particle*) GetElem( 0, AddPointReuse () ); p->pos = pos; p->vel = dir; p->vel_eval = dir; p->age = 0; p->type = 0; p->clr = COLORA ( m_Time/10.0, m_Time/5.0, m_Time /4.0, 1 ); } }
int PointSet::AddVolume ( Vector3DF min, Vector3DF max, float spacing ) { Vector3DF pos; Point* p; float dx, dy, dz; dx = max.x-min.x; dy = max.y-min.y; dz = max.z-min.z; int cnt = 0; for (float z = max.z; z >= min.z; z -= spacing ) { for (float y = min.y; y <= max.y; y += spacing ) { for (float x = min.x; x <= max.x; x += spacing ) { p = GetPoint ( AddPointReuse () ); pos.Set ( x, y, z); //pos.x += -0.05 + float( rand() * 0.1 ) / RAND_MAX; //pos.y += -0.05 + float( rand() * 0.1 ) / RAND_MAX; //pos.z += -0.05 + float( rand() * 0.1 ) / RAND_MAX; p->pos = pos; p->type = 0; p->clr = COLORA( (x-min.x)/dx, (y-min.y)/dy, (z-min.z)/dz, 1); cnt++; } } } sphPoints = cnt ; return sphPoints; }
void PointSet::AddVolume ( Vector3DF min, Vector3DF max, float spacing ) { Vector3DF pos; Point* p; float dx, dy, dz; dx = max.x-min.x; dy = max.y-min.y; dz = max.z-min.z; for (float z = max.z; z >= min.z; z -= spacing ) { for (float y = min.y; y <= max.y; y += spacing ) { for (float x = min.x; x <= max.x; x += spacing ) { p = GetPoint ( AddPointReuse () ); pos.Set ( x, y, z); p->pos = pos; p->clr = COLORA( (x-min.x)/dx, (y-min.y)/dy, (z-min.z)/dz, 1); } } } }
void PointSet::AddControlVolume ( std::vector<glm::vec3> *allvertices ) { Vector3DF pos; Point* p; int dimx=5; int dimy=5; float dimz=10; int ccnt=0; //vec3 a = myvertices. ; glm::vec3 startpoint(0,0.0,-5.0); glm::vec3 direction(0,0,1.0); glm::vec3 vertex1(0,1.0,2.0); glm::vec3 vertex2(-1.0,-1.0,0); glm::vec3 vertex3(1.0,-1.0,0); glm::vec3 v1,v2,v3; int a = allvertices->size(); double value=0; value=PointSet::Test_RayPolyIntersect(startpoint,direction,vertex1,vertex2,vertex3); int count=0; float var=1.0; //glm::vec3 *a = myvertices; for (float x = -5; x < 18; x += 1.0) { for (float y = -5; y <= 14; y += 1.0) { for (float z = -5; z <= 25; z += var ) { /*if(z>=-5.0 && z <2.0) var =1.0; else if(z>=2.0 && z < 8.0) var =0.70; else if(z>=8.0 && z < 15.0) var =0.6; else if(z >= 15.0 && z <=25.0) var =0.3;*/ count = 0 ; startpoint=glm::vec3((float)x,(float)y,(float)z); direction=glm::vec3(1.0,0.1,0); for(int v=0 ;v < a ; v+=3) { //checking each vertex in the grid with all the 192 triangles of mesh v1=(*allvertices)[v]; v2=(*allvertices)[v+1]; v3=(*allvertices)[v+2]; vertex1= vec3(v1[0],v1[1],v1[2]); vertex2= vec3(v2[0],v2[1],v2[2]); vertex3= vec3(v3[0],v3[1],v3[2]); value=PointSet::Test_RayPolyIntersect(startpoint,direction,vertex1,vertex2,vertex3); if(value != -1.0) { count++; } } //odd if( count % 2 == 1) { //inside the mesh p = GetPoint ( AddPointReuse () ); pos.Set ( x,y,z+10.0f); p->pos = pos; p->type = 1; p->clr = COLORA( 1.0,0.3,0.3, 0); /// 0.1,0.3,1.0,1.0 ccnt++; } //var=var-0.1; } // var = 1.0; } } }