Skip to content
Snippets Groups Projects
Commit d826084a authored by slevy's avatar slevy
Browse files

Reprocess particles after changing parameters.

(Some "kira" commands use kira_set(), which already does this.
Just set "changed" for those which don't.)
Impose a max trail gap (delta time).  Break up trails at time-gaps
exceeding this threshold.
parent 6b9a27c0
No related branches found
No related tags found
No related merge requests found
/*
* $Log$
* Revision 1.34 2001/07/19 20:12:47 slevy
* Reprocess particles after changing parameters.
* (Some "kira" commands use kira_set(), which already does this.
* Just set "changed" for those which don't.)
* Impose a max trail gap (delta time). Break up trails at time-gaps
* exceeding this threshold.
*
* Revision 1.33 2001/07/18 22:41:45 slevy
* Add "kira center" command, to report all positions relative to
* the kira-computed smoothed cluster center.
......@@ -245,6 +252,7 @@ struct vald {
struct trailhead {
int maxtrail, ntrails;
int next; /* ring buffer next-slot-to-use */
real lasttime;
struct speck *specks;
};
......@@ -293,6 +301,7 @@ struct worldstuff {
float trailalpha;
float trailpsize;
int trailonly;
real maxtrailgap;
SelOp picksel; // what to do when a star is picked
......@@ -335,9 +344,6 @@ struct worldstuff {
center_pos[0] = center_pos[1] = center_pos[2] = 0;
center_vel[0] = center_vel[1] = center_vel[2] = 0;
maxtrail = 50;
trails = NULL;
sl = marksl = NULL;
maxstars = maxmarks = 0;
slvalid = 0;
......@@ -348,6 +354,7 @@ struct worldstuff {
trailonly = 0;
trailalpha = 0.6;
trailpsize = 1.0;
maxtrailgap = 0.1;
marksp = NULL;
leafcount = 0;
......@@ -975,6 +982,8 @@ struct specklist *kira_get_parti( struct dyndata *dd, struct stuff *st, double r
return ww->sl;
}
#define TRAILGAP 1 /* bit in alpha byte of rgba -> "don't draw from prev pt to here" */
void kira_add_trail( struct stuff *st, worldstuff *ww, int id, struct speck *sp )
{
if(id < 0) id = ww->maxstars + id;
......@@ -995,6 +1004,13 @@ void kira_add_trail( struct stuff *st, worldstuff *ww, int id, struct speck *sp
struct speck *tsp = (struct speck *)(((char *)th->specks) + th->next*bps);
memcpy( tsp, sp, bps );
vsub( &tsp->p, &tsp->p, &ww->trackpos );
if(fabs(th->lasttime - ww->treq) > ww->maxtrailgap) {
((char *)&tsp->rgba)[3] = TRAILGAP; /* alpha "1" bit is on for post-gap trail points */
} else {
((char *)&tsp->rgba)[3] = 0;
}
tsp->val[0] = ww->treq;
th->lasttime = ww->treq;
if(++th->next >= th->maxtrail)
th->next = 0;
if(++th->ntrails > th->maxtrail)
......@@ -1184,13 +1200,17 @@ int kira_draw( struct dyndata *dd, struct stuff *st, struct specklist *slhead, M
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE );
int alpha = 0;
int alpha = 0, rgbmask = ~0;
((GLubyte *)&alpha)[3] = (int) (255 * ww->trailalpha);
((GLubyte *)&rgbmask)[3] = 0;
if(inpick) {
glPushName( specks_slno );
glPushName( 0 );
}
glPointSize( 1.5 );
glPushMatrix();
glTranslatef( ww->trackpos.x[0], ww->trackpos.x[1], ww->trackpos.x[2] );
for(i = 0; i < ww->maxtrailno; i++) {
struct trailhead *th = &ww->trails[i];
if(th->ntrails == 0 || th->maxtrail <= 0)
......@@ -1198,6 +1218,7 @@ int kira_draw( struct dyndata *dd, struct stuff *st, struct specklist *slhead, M
if(inpick)
glLoadName( i );
glBegin( GL_LINE_STRIP );
glBegin( GL_POINTS );
int first = (th->next + th->maxtrail - th->ntrails) % th->maxtrail;
int k, rgb = 0, rgba = 0;
struct speck *sp;
......@@ -1207,30 +1228,53 @@ int kira_draw( struct dyndata *dd, struct stuff *st, struct specklist *slhead, M
int to1 = (first < th->next) ? th->next : th->maxtrail;
int from2 = 0;
int to2 = (first < th->next) ? 0 : th->next;
int wasgap = 0, ingap = 0;
Point *prev = NULL;
for(k = from1; k < to1; k++) {
sp = (struct speck *)(base + k*bps);
if(rgb != sp->rgba) {
rgb = sp->rgba;
ingap = ((char *)&sp->rgba)[3] & TRAILGAP;
if(wasgap != ingap) {
glEnd();
if(ingap) {
glBegin( GL_POINTS );
} else {
glBegin( GL_LINE_STRIP );
glVertex3fv( prev->x );
}
wasgap = ingap;
}
if(rgb != sp->rgba & rgbmask) {
rgb = sp->rgba & rgbmask;
rgba = rgb | alpha;
glColor4ubv( (GLubyte *)&rgba );
}
glVertex3f( sp->p.x[0]+ww->trackpos.x[0],
sp->p.x[1]+ww->trackpos.x[1],
sp->p.x[2]+ww->trackpos.x[2] );
glVertex3fv( sp->p.x );
prev = &sp->p;
}
for(k = from2; k < to2; k++) {
sp = (struct speck *)(base + k*bps);
if(rgb != sp->rgba) {
rgb = sp->rgba;
ingap = ((char *)&sp->rgba)[3] & TRAILGAP;
if(wasgap != ingap) {
glEnd();
if(ingap) {
glBegin( GL_POINTS );
} else {
glBegin( GL_LINE_STRIP );
glVertex3fv( prev->x );
}
wasgap = ingap;
}
if(rgb != sp->rgba & rgbmask) {
rgb = sp->rgba & rgbmask;
rgba = rgb | alpha;
glColor4ubv( (GLubyte *)&rgba );
}
glVertex3f( sp->p.x[0]+ww->trackpos.x[0],
sp->p.x[1]+ww->trackpos.x[1],
sp->p.x[2]+ww->trackpos.x[2] );
glVertex3fv( sp->p.x );
prev = &sp->p;
}
glEnd();
}
glPopMatrix();
if(inpick) {
glPopName();
glPopName();
......@@ -1245,6 +1289,7 @@ int kira_parse_args( struct dyndata *dd, struct stuff *st, int argc, char **argv
int what;
double val;
worldstuff *ww = (worldstuff *)dd->data;
int changed = 0;
if(0!=strncmp(argv[0], "kira", 4)) /* accept "kira" or "kiractl" */
return 0;
......@@ -1308,8 +1353,10 @@ int kira_parse_args( struct dyndata *dd, struct stuff *st, int argc, char **argv
: val ? "on" : "off");
} else if(!strncmp(swhat, "mscale", 4) || !strcmp(swhat, "massscale")) {
if(!ww->truemassscale || strchr(sval, '!'))
if(!ww->truemassscale || strchr(sval, '!')) {
ww->massscale = getfloat( sval, ww->massscale );
changed = 1;
}
msg("kiractl mscale %g (kira says %g)",
ww->massscale, mass_scale_factor());
......@@ -1320,7 +1367,10 @@ int kira_parse_args( struct dyndata *dd, struct stuff *st, int argc, char **argv
msg(val == 0 ? "kiractl track off" : "kiractl track %d", (int)val);
} else if(!strncmp(swhat, "center", 6)) {
ww->centered = getbool( sval, ww->centered );
if(sval) {
ww->centered = getbool( sval, ww->centered );
changed = 1;
}
msg("kira centered %s (center pos %g %g %g vel %g %g %g)", ww->centered ? "on" : "off",
ww->center_pos[0], ww->center_pos[1], ww->center_pos[2],
ww->center_vel[0], ww->center_vel[1], ww->center_vel[2] );
......@@ -1345,11 +1395,19 @@ int kira_parse_args( struct dyndata *dd, struct stuff *st, int argc, char **argv
}
parse_selexpr( st, rejoinargs( a, argc, argv ), NULL, &ww->trailsel, "kira trail" );
}
changed = 1;
}
msg("kira trail%s %s (%s)", ww->trailonly ? " only":"",
show_selexpr( st, NULL, &ww->trailsel ),
selcounts( st, st->sl, &ww->trailsel ));
} else if(!strncmp(swhat, "trailgap", 6)) {
if(sval) {
ww->maxtrailgap = getfloat( sval, ww->maxtrailgap );
changed = 1;
}
msg("kira trailgaptime %g", ww->maxtrailgap);
} else if(!strncmp(swhat, "pick", 2)) {
int picking = getbool( sval, (st->picked == kira_picked) );
if(picking) {
......@@ -1395,6 +1453,10 @@ int kira_parse_args( struct dyndata *dd, struct stuff *st, int argc, char **argv
} else {
msg("kiractl {node|ring} {on|off|root} | tree {on|off|cross|tick} [<tickscale>] | size {sep|semimaj} | scale <fac> | span <minpix> <maxpix> | track <id>| intsel <dest> = <src>");
}
if(changed) {
kira_invalidate( dd, st );
parti_redraw();
}
return 1;
}
......@@ -1445,7 +1507,7 @@ int kira_picked( struct stuff *st, GLuint *hit, struct specklist *sl, int speckn
float teff = expf( sp->val[SPECK_TLOG] * M_LN10 );
enum spectral_class st = get_spectral_class( teff );
enum luminosity_class lc = get_luminosity_class( teff, sp->val[SPECK_LUM] );
msg("[id %g nc %g mlog %.3g Tlog %.2f L %.3g root %g stype %d(%s %s%s) speck %d]",
msg("[id %g nc %g mass %.3g Tlog %.2f L %.3g root %g stype %d(%s %s%s) speck %d]",
sp->val[SPECK_ID], sp->val[SPECK_NCLUMP],
sp->val[SPECK_MASS], sp->val[SPECK_TLOG],
sp->val[SPECK_LUM], sp->val[SPECK_ROOTID],
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment