diff options
author | Erik <erik@erik.erikhome.com> | 2008-05-23 21:10:52 -0500 |
---|---|---|
committer | Erik <erik@erik.erikhome.com> | 2008-05-23 21:10:52 -0500 |
commit | a8042a93fdea53591ec864118667103472f70840 (patch) | |
tree | 0f6da40e8322b144c098605577b6ec652ffdbfb8 | |
parent | 10526751503ae8f52e8fe8a22114dad3d9a3249c (diff) | |
download | mousetrails-a8042a93fdea53591ec864118667103472f70840.tar.gz mousetrails-a8042a93fdea53591ec864118667103472f70840.tar.bz2 |
- Reenabled the use of the mousepoll plugin after getting yelled at by smspillaz and maniac ;)compiz-0.8
- Made the Trail Length adjustable without having to stop and start the plugin
- Removed Trail Life option as its purpose for this plugin was questionable
- Refactored the algorithms that calculate the trail alpha values in leiu of removing Trail Life
- Changed the way the Threshold option works. Instead of simply not displaying a cursor, it proportionally lowers the opacity based on delta distance. This looks a lot smoother.
- Changed some option ranges and default values due to changes above.
- Still haven't figured out disabling on a transformed screen.
- There are still circumstances (that I can't yet account for) that cause CPU usage to spike, at least for awhile, and then subside back into the 20-30% range. If you notice any patterns here, let me know.
-rw-r--r-- | mousetrails.c | 201 | ||||
-rw-r--r-- | mousetrails.xml.in | 19 |
2 files changed, 142 insertions, 78 deletions
diff --git a/mousetrails.c b/mousetrails.c index 2907cff..15e3695 100644 --- a/mousetrails.c +++ b/mousetrails.c @@ -41,18 +41,18 @@ mousetrailsScreen *ss = GET_MOUSETRAILS_SCREEN (s, GET_MOUSETRAILS_DISPLAY (s->display)) // in theory the texture array size should be >= trail size -#define TEXTURES_SIZE 64 +#define TEXTURES_SIZE 51 int mousetrailsCursorUpdate (CompScreen *s); typedef struct _Particle { - float life; // particle life + //float life; // particle life float fade; // fade speed - float width; // particle width - float height; // particle height - float w_mod; // particle size modification during life - float h_mod; // particle size modification during life + float width; // particle width + float height; // particle height + float w_mod; // particle size modification during life + float h_mod; // particle size modification during life float r; // red value float g; // green value float b; // blue value @@ -60,7 +60,9 @@ typedef struct _Particle float x; // X position float y; // Y position float z; // Z position - int cursorIndex; // array index of cursor serial number + float xd; + float yd; + int cursorIndex; // array index of cursor serial number } Particle; typedef struct _MouseCursor @@ -89,6 +91,7 @@ typedef struct _ParticleSystem int lastGen; float initialAlpha; int sizeFactor; + Bool useMousepoll; // for random colors int colorcounter; @@ -101,6 +104,7 @@ typedef struct _ParticleSystem int colorrate; int skip; int atSkip; + int speed; // Cursor data MouseCursor cursors[TEXTURES_SIZE]; // rolling array of cursors grabbed from x @@ -126,7 +130,7 @@ typedef struct _mousetrailsDisplay { int screenPrivateIndex; - //MousePollFunc *mpFunc; + MousePollFunc *mpFunc; } mousetrailsDisplay; @@ -139,7 +143,7 @@ typedef struct _mousetrailsScreen ParticleSystem *ps; - //PositionPollingHandle pollHandle; + PositionPollingHandle pollHandle; PreparePaintScreenProc preparePaintScreen; DonePaintScreenProc donePaintScreen; @@ -153,7 +157,8 @@ initParticles (int numParticles, ParticleSystem * ps) if (ps->particles) free(ps->particles); - ps->particles = calloc(numParticles, sizeof(Particle)); + //ps->particles = calloc(numParticles, sizeof(Particle)); + ps->particles = calloc(TEXTURES_SIZE, sizeof(Particle)); ps->numParticles = numParticles; ps->numDisplayedParticles = 0; @@ -169,6 +174,8 @@ initParticles (int numParticles, ParticleSystem * ps) ps->y = 0; ps->skip = 1; ps->atSkip = 0; + ps->speed = 1; + ps->useMousepoll = 1; ps->lastTextureFilled = -1; ps->lastCursorIndex = 0; @@ -184,8 +191,13 @@ initParticles (int numParticles, ParticleSystem * ps) Particle *part = ps->particles; int i; - for (i = 0; i < numParticles; i++, part++) - part->life = 0.0f; + for (i = 0; i < TEXTURES_SIZE; i++, part++){ + part->a = 0.0f; + part->r = 0.0f; + part->g = 0.0f; + part->b = 0.0f; + } + for (i = 0; i < TEXTURES_SIZE; i++){ ps->cursors[i].cursor_serial = 0; @@ -199,10 +211,13 @@ initParticles (int numParticles, ParticleSystem * ps) } + static void drawParticles (CompScreen * s, ParticleSystem * ps) { + if (ps->numDisplayedParticles == 0) return; + glEnable(GL_BLEND); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glEnableClientState(GL_COLOR_ARRAY); @@ -255,15 +270,16 @@ drawParticles (CompScreen * s, ParticleSystem * ps) int i; for (i = 0; i < ps->numParticles; i++, part++) { - if (part->life > 0.0f) + //if (part->life > 0.0f) + if (part->fade > 0.001f) { numActive += 4; float w = part->width / 2; float h = part->height / 2; - w += (w * part->w_mod) * (1- part->life); - h += (h * part->h_mod) * (1- part->life); + w += (w * part->w_mod) * (1- part->a); + h += (h * part->h_mod) * (1- part->a); vertices[0] = part->x - w; vertices[1] = part->y - h; @@ -290,7 +306,7 @@ drawParticles (CompScreen * s, ParticleSystem * ps) colors[0] = part->r; colors[1] = part->g; colors[2] = part->b; - colors[3] = part->life * part->a * ps->initialAlpha; + colors[3] = part->a; memcpy (colors + 4, colors, colorSize); memcpy (colors + 8, colors, colorSize); memcpy (colors + 12, colors, colorSize); @@ -332,21 +348,26 @@ updateParticles (ParticleSystem * ps, float time) { int i; Particle *part; - float speed = (time / 50.0); + float speed = (time / 5000.0); ps->active = FALSE; part = ps->particles; + int numDisplayedParticles = 0; + for (i = 0; i < ps->numParticles; i++, part++) { - if (part->life > 0.0f) + if (part->a > 0.001f) { - // modify life - part->life -= part->fade * speed; + // modify opacity + part->a -= 50 * part->a * part->fade * speed; ps->active = TRUE; + + numDisplayedParticles++; } } + ps->numDisplayedParticles = numDisplayedParticles; } static void @@ -366,13 +387,13 @@ finiParticles (ParticleSystem * ps) } -// only here for XQueryPointer - why reinitialize pointless variables every time? +/* Window root_return; Window child_return; int rootX, rootY; int winX, winY; unsigned int maskReturn; -Bool status; +Bool status;*/ static void genNewParticles(CompScreen *s, @@ -388,11 +409,11 @@ genNewParticles(CompScreen *s, MOUSETRAILS_SCREEN(s); Bool rColor = mousetrailsGetRandom (s); - float life = mousetrailsGetLife (s); + //float life = mousetrailsGetLife (s); int sizeFactor = ps->sizeFactor; float threshold = ps->threshold; - float lifeNeg = 1 - life; - float fadeExtra = 0.15f * (1.01 - life); + //float lifeNeg = 1 - life; + //float fadeExtra = 0.05f * (1.01 - life); int cursorIndex = 0; unsigned short *c = mousetrailsGetColor (s); @@ -400,7 +421,7 @@ genNewParticles(CompScreen *s, float colr1 = (float)c[0] / 0xffff; float colg1 = (float)c[1] / 0xffff; float colb1 = (float)c[2] / 0xffff; - float cola = (float)c[3] / 0xffff; + //float cola = (float)c[3] / 0xffff; float partw = ps->cursors[ps->lastCursorIndex].width; float parth = ps->cursors[ps->lastCursorIndex].height; @@ -408,38 +429,58 @@ genNewParticles(CompScreen *s, float partoffw = ps->cursors[ps->lastCursorIndex].xhot; float partoffh = ps->cursors[ps->lastCursorIndex].yhot; - - /* - XFixesCursorImage *ci = XFixesGetCursorImage(s->display->display); - ss->ps->x = ci->x; - ss->ps->y = ci->y; - XFree (ci);*/ + int livex; + int livey; // get x cursor position (rootX and rootY) - status = XQueryPointer (s->display->display, s->root, + /*if (!ss->ps->useMousepoll){ + status = XQueryPointer (s->display->display, s->root, &root_return, &child_return, &rootX, &rootY, &winX, &winY, &maskReturn); - int livex = rootX; - int livey = rootY; + livex = rootX; + livey = rootY; + } + else + {*/ + livex = ss->posX; + livey = ss->posY; + //} + int deltax = livex - ps->x; int deltay = livey - ps->y; int delta = deltax * deltax + deltay * deltay; ss->ps->x = livex; ss->ps->y = livey; - if (delta < threshold * threshold) return; + //if (delta < threshold * threshold) return; + if (delta < 1 ) return; int newx = (float)(ps->x + partw/2 - partoffw); int newy = (float)(ps->y + parth/2 - partoffh); - // possibly crashy - /*if (mousetrailsGetNumParticles(s) != ps->numParticles){ - initParticles(mousetrailsGetNumParticles (s), ss->ps); - }*/ Particle *part = ps->particles; int i; + // possibly crashy + if (mousetrailsGetNumParticles(s) != ps->numParticles){ + //initParticles(mousetrailsGetNumParticles (s), ss->ps); + ps->numParticles = mousetrailsGetNumParticles(s); + ps->lastGen = -1; + /*ps->slowdown = mousetrailsGetSlowdown (s); + ps->initialAlpha = mousetrailsGetAlpha (s) ; + ps->sizeFactor = mousetrailsGetSize (s) ; + ps->threshold = mousetrailsGetThreshold (s) ; + ps->colorrate = mousetrailsGetColorrate (s) ;*/ + for (i = 0; i < ps->numParticles; i++, part++){ + part->a = 0.0f; + part->r = 0.0f; + part->g = 0.0f; + part->b = 0.0f; + } + } + + //if (delta > threshold * threshold) max_new = 1; int nextGen = (ps->lastGen + 1) % ps->numParticles; @@ -462,15 +503,17 @@ genNewParticles(CompScreen *s, // set the cursor array index part->cursorIndex = ps->lastCursorIndex = cursorIndex; - // give gt new life - part->life = 1.0f; - part->fade = (sqrt(ps->slowdown-0.9)/50.0) * lifeNeg + fadeExtra; + part->fade = ps->slowdown / 10.0; // set size part->width = partw; part->height = parth; part->w_mod = part->h_mod = ((float)sizeFactor - 10.0) / 10.0; + // set direction + part->xd = newx - ps->lastx; + part->yd = newy - ps->lasty; + // set position part->x = newx; part->y = newy; @@ -478,6 +521,7 @@ genNewParticles(CompScreen *s, ps->lasty = newy; part->z = 0.0; + if (rColor) { float value; @@ -507,14 +551,17 @@ genNewParticles(CompScreen *s, part->b = colb1; } // set transparancy - part->a = cola; + //part->a = ps->initialAlpha; + float thresholdfactor = 1.0; + if (delta < ps->threshold) thresholdfactor = (float)delta / (float)ps->threshold; + part->a = ps->initialAlpha * thresholdfactor; ps->active = TRUE; - //max_new -= 1; } } } +// damageRegion() seems to cause blockiness or jitters on the background window when scrolling, like on a webpage static void damageRegion (CompScreen *s) @@ -526,6 +573,8 @@ damageRegion (CompScreen *s) MOUSETRAILS_SCREEN (s); + if (ss->ps->numDisplayedParticles == 0) return; + if (!ss->ps) return; @@ -538,16 +587,18 @@ damageRegion (CompScreen *s) for (i = 0; i < ss->ps->numParticles; i++, p++) { - w = p->width / 2; - h = p->height / 2; + if (p->a > 0.001f){ + w = p->width / 2; + h = p->height / 2; - w += (w * p->w_mod) * p->life; - h += (h * p->h_mod) * p->life; + w += (w * p->w_mod) * p->a; + h += (h * p->h_mod) * p->a; - x1 = MIN (x1, p->x - w); - x2 = MAX (x2, p->x + w); - y1 = MIN (y1, p->y - h); - y2 = MAX (y2, p->y + h); + x1 = MIN (x1, p->x - w); + x2 = MAX (x2, p->x + w); + y1 = MIN (y1, p->y - h); + y2 = MAX (y2, p->y + h); + } } r.rects = &r.extents; @@ -632,7 +683,7 @@ int mousetrailsCursorUpdate (CompScreen *s) return fillTexture; } -/* + static void positionUpdate (CompScreen *s, int x, @@ -643,7 +694,7 @@ positionUpdate (CompScreen *s, ss->posX = x; ss->posY = y; } -*/ + static void @@ -652,13 +703,15 @@ mousetrailsPreparePaintScreen (CompScreen *s, { MOUSETRAILS_SCREEN (s); - //MOUSETRAILS_DISPLAY (s->display); + MOUSETRAILS_DISPLAY (s->display); + + //Bool useMousepoll = mousetrailsGetMousepoll (s); - /*if (ss->active && !ss->pollHandle) + if (ss->active && !ss->pollHandle/* && useMousepoll*/) { (*sd->mpFunc->getCurrentPosition) (s, &ss->posX, &ss->posY); ss->pollHandle = (*sd->mpFunc->addPositionPolling) (s, positionUpdate); - }*/ + } if (ss->active && !ss->ps) { @@ -679,6 +732,7 @@ mousetrailsPreparePaintScreen (CompScreen *s, ss->ps->sizeFactor = mousetrailsGetSize (s) ; ss->ps->skip = mousetrailsGetSkip (s) ; ss->ps->blendMode = GL_ONE_MINUS_SRC_ALPHA; + //ss->ps->useMousepoll = mousetrailsGetMousepoll (s); mousetrailsCursorUpdate(s); @@ -705,16 +759,16 @@ static void mousetrailsDonePaintScreen (CompScreen *s) { MOUSETRAILS_SCREEN (s); - //MOUSETRAILS_DISPLAY (s->display); + MOUSETRAILS_DISPLAY (s->display); if (ss->active || (ss->ps && ss->ps->active)) damageRegion (s); - /*if (!ss->active && ss->pollHandle) + if (!ss->active && ss->pollHandle && ss->ps->useMousepoll) { (*sd->mpFunc->removePositionPolling) (s, ss->pollHandle); ss->pollHandle = 0; - }*/ + } if (!ss->active && ss->ps && !ss->ps->active) { @@ -745,9 +799,14 @@ mousetrailsPaintOutput (CompScreen *s, status = (*s->paintOutput) (s, sa, transform, region, output, mask); WRAP (ss, s, paintOutput, mousetrailsPaintOutput); + + if (!ss->ps || !ss->ps->active) return status; +// this doesn't seem to work +// if (mask & PAINT_SCREEN_TRANSFORMED_MASK) return FALSE; + matrixGetIdentity (&sTransform); transformToScreenSpace (s, output, -DEFAULT_Z_CAMERA, &sTransform); @@ -839,7 +898,7 @@ mousetrailsInitScreen (CompPlugin *p, ss->active = TRUE; - //ss->pollHandle = 0; + ss->pollHandle = 0; ss->ps = NULL; @@ -852,15 +911,15 @@ mousetrailsFiniScreen (CompPlugin *p, CompScreen *s) { MOUSETRAILS_SCREEN (s); - //MOUSETRAILS_DISPLAY (s->display); + MOUSETRAILS_DISPLAY (s->display); //Restore the original function UNWRAP (ss, s, paintOutput); UNWRAP (ss, s, preparePaintScreen); UNWRAP (ss, s, donePaintScreen); - /*if (ss->pollHandle) - (*sd->mpFunc->removePositionPolling) (s, ss->pollHandle);*/ + if (ss->pollHandle && ss->ps->useMousepoll) + (*sd->mpFunc->removePositionPolling) (s, ss->pollHandle); if (ss->ps && ss->ps->active) damageScreen (s); @@ -876,14 +935,14 @@ mousetrailsInitDisplay (CompPlugin *p, //Generate a mousetrails display mousetrailsDisplay *sd; - //int index; + int index; - if (!checkPluginABI ("core", CORE_ABIVERSION)/* || - !checkPluginABI ("mousepoll", MOUSEPOLL_ABIVERSION)*/) + if (!checkPluginABI ("core", CORE_ABIVERSION) || + !checkPluginABI ("mousepoll", MOUSEPOLL_ABIVERSION)) return FALSE; - /*if (!getPluginDisplayIndex (d, "mousepoll", &index)) - return FALSE;*/ + if (!getPluginDisplayIndex (d, "mousepoll", &index)) + return FALSE; sd = (mousetrailsDisplay *) malloc (sizeof (mousetrailsDisplay)); @@ -901,7 +960,7 @@ mousetrailsInitDisplay (CompPlugin *p, return FALSE; } - //sd->mpFunc = d->base.privates[index].ptr; + sd->mpFunc = d->base.privates[index].ptr; mousetrailsSetInitiateInitiate (d, mousetrailsInitiate); mousetrailsSetInitiateTerminate (d, mousetrailsTerminate); diff --git a/mousetrails.xml.in b/mousetrails.xml.in index ff17f9d..a1c62b8 100644 --- a/mousetrails.xml.in +++ b/mousetrails.xml.in @@ -8,9 +8,9 @@ <relation type="after"> <plugin>cube</plugin> </relation> - <!--<requirement> + <requirement> <plugin>mousepoll</plugin> - </requirement>--> + </requirement> </deps> <display> <group> @@ -49,10 +49,10 @@ </option> <option name="threshold" type="int"> <_short>Threshold</_short> - <_long>The minimum distance (in pixels) from the current mouse position the cursor must travel before creating a new trail element. This helps prevent precision operations like text selecting from being blurred over with trails.</_long> - <default>1</default> + <_long>If the cursor has moved less than this distance (in pixels) from the last mouse position check, it's initial opacity will be lowered proportionally to the distance moved. This helps prevent precision operations like text selecting from being blurred over with trails.</_long> + <default>50</default> <min>1</min> - <max>10</max> + <max>200</max> </option> <option name="skip" type="int"> <_short>Distance</_short> @@ -68,14 +68,14 @@ <min>1</min> <max>10</max> </option> - <option name="life" type="float"> + <!--<option name="life" type="float"> <_short>Trail Life</_short> <_long>Trail life.</_long> <default>0.4</default> <min>0.1</min> <max>1</max> <precision>0.1</precision> - </option> + </option>--> <option name="color" type="color"> <_short>Trail Color</_short> <_long>Trail color.</_long> @@ -98,6 +98,11 @@ <min>2</min> <max>100</max> </option> + <!--<option name="mousepoll" type="bool"> + <_short>Use Mousepoll Plugin</_short> + <_long>Use mousepoll plugin instead of XQueryPointer</_long> + <default>false</default> + </option>--> </group> </screen> </plugin> |