[fusion-commits] Cube reflection and cylinder effect plugin: Changes to 'master' (77dce7f7ef01afe770adcf0023737c4d80174e84)
onestone at server.opencompositing.org
onestone at server.opencompositing.org
Tue May 6 21:00:18 CEST 2008
New commits:
commit 77dce7f7ef01afe770adcf0023737c4d80174e84
Author: Dennis Kasprzyk <onestone at opencompositing.org>
Date: Tue May 6 20:34:54 2008 +0200
Merged cubecaps plugin functianality and relized full sphere deformation.
cubeaddon.c | 849 +++++++++++++++++++++++++++++++++++++-------
cubeaddon.xml.in | 170 ++++++++-
images/compizcap.png | Bin 0 -> 75216 bytes
images/cubecap_release.png | Bin 0 -> 614442 bytes
images/fusioncap.png | Bin 0 -> 143956 bytes
5 files changed, 880 insertions(+), 139 deletions(-)
create mode 100644 images/compizcap.png
create mode 100644 images/cubecap_release.png
create mode 100644 images/fusioncap.png
Modified: fusion/plugins/cubeaddon/cubeaddon.c
===================================================================
--- fusion/plugins/cubeaddon/cubeaddon.c
+++ fusion/plugins/cubeaddon/cubeaddon.c
@@ -6,6 +6,10 @@
* Copyright : (C) 2008 by Dennis Kasprzyk
* E-mail : onestone at opencompositing.org
*
+ * includes code from cubecaps.c
+ *
+ * Copyright : (C) 2007 Guillaume Seguin
+ * E-mail : guillaume at segu.in
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -35,13 +39,29 @@ static int CubeaddonDisplayPrivateIndex;
static int cubeDisplayPrivateIndex;
#define CUBEADDON_GRID_SIZE 100
-#define CUBEADDON_CAP_ELEMENTS 30
+#define CAP_ELEMENTS 15
+#define CAP_NVERTEX (((CAP_ELEMENTS * (CAP_ELEMENTS + 1)) + 2) * 3)
+#define CAP_NIDX (CAP_ELEMENTS * (CAP_ELEMENTS - 1) * 4)
+
+#define CAP_NIMGVERTEX (((CAP_ELEMENTS + 1) * (CAP_ELEMENTS + 1)) * 5)
+#define CAP_NIMGIDX (CAP_ELEMENTS * CAP_ELEMENTS * 4)
typedef struct _CubeaddonDisplay
{
int screenPrivateIndex;
} CubeaddonDisplay;
+typedef struct _CubeCap
+{
+ int current;
+ CompListValue *files;
+
+ Bool loaded;
+
+ CompTexture texture;
+ CompTransform texMat;
+} CubeCap;
+
typedef struct _CubeaddonScreen
{
DonePaintScreenProc donePaintScreen;
@@ -79,12 +99,308 @@ typedef struct _CubeaddonScreen
GLfloat *winNormals;
unsigned int winNormSize;
- GLfloat capFill[CUBEADDON_CAP_ELEMENTS * 12];
+ GLfloat capFill[CAP_NVERTEX];
+ GLfloat capFillNorm[CAP_NVERTEX];
+ GLushort capFillIdx[CAP_NIDX];
+ float capDeform;
+ float capDistance;
+ int capDeformType;
+
+ CubeCap topCap;
+ CubeCap bottomCap;
} CubeaddonScreen;
#define CUBEADDON_DISPLAY(d) PLUGIN_DISPLAY(d, Cubeaddon, ca)
#define CUBEADDON_SCREEN(s) PLUGIN_SCREEN(s, Cubeaddon, ca)
+/*
+ * Initiate a CubeCap
+ */
+static void
+cubeaddonInitCap (CompScreen *s, CubeCap *cap)
+{
+ initTexture (s, &cap->texture);
+
+ cap->current = 0;
+ cap->files = NULL;
+ cap->loaded = FALSE;
+}
+
+/*
+ * Attempt to load current cap image (if any)
+ */
+static void
+cubeaddonLoadCap (CompScreen *s,
+ CubeCap *cap,
+ Bool scale,
+ Bool aspect,
+ Bool clamp)
+{
+ unsigned int width, height;
+ float xScale, yScale;
+
+ CUBE_SCREEN (s);
+
+ finiTexture (s, &cap->texture);
+ initTexture (s, &cap->texture);
+
+ cap->loaded = FALSE;
+
+ if (!cap->files || !cap->files->nValue)
+ return;
+
+ cap->current = cap->current % cap->files->nValue;
+
+ if (!readImageToTexture (s, &cap->texture,
+ cap->files->value[cap->current].s,
+ &width, &height))
+ {
+ compLogMessage (s->display, "cubeaddon", CompLogLevelWarn,
+ "Failed to load image: %s",
+ cap->files->value[cap->current].s);
+
+ finiTexture (s, &cap->texture);
+ initTexture (s, &cap->texture);
+
+ return;
+ }
+
+ cap->loaded = TRUE;
+ matrixGetIdentity (&cap->texMat);
+
+ cap->texMat.m[0] = cap->texture.matrix.xx;
+ cap->texMat.m[1] = cap->texture.matrix.yx;
+ cap->texMat.m[4] = cap->texture.matrix.xy;
+ cap->texMat.m[5] = cap->texture.matrix.yy;
+ cap->texMat.m[12] = cap->texture.matrix.x0;
+ cap->texMat.m[13] = cap->texture.matrix.y0;
+
+ if (aspect)
+ {
+ if (scale)
+ xScale = yScale = MIN (width, height);
+ else
+ xScale = yScale = MAX (width, height);
+ }
+ else
+ {
+ xScale = width;
+ yScale = height;
+ }
+
+ matrixTranslate (&cap->texMat, width / 2, height / 2.0, 0.0);
+ matrixScale (&cap->texMat, xScale / 2.0, yScale / 2.0, 1.0);
+
+ if (scale)
+ xScale = 1.0 / sqrtf (((cs->distance * cs->distance) + 0.25));
+ else
+ xScale = 1.0 / sqrtf (((cs->distance * cs->distance) + 0.25) * 0.5);
+
+ matrixScale (&cap->texMat, xScale, xScale, 1.0);
+
+ enableTexture (s, &cap->texture, COMP_TEXTURE_FILTER_GOOD);
+ if (clamp)
+ {
+ if (s->textureBorderClamp)
+ {
+ glTexParameteri (cap->texture.target, GL_TEXTURE_WRAP_S,
+ GL_CLAMP_TO_BORDER);
+ glTexParameteri (cap->texture.target, GL_TEXTURE_WRAP_T,
+ GL_CLAMP_TO_BORDER);
+ }
+ else
+ {
+ glTexParameteri (cap->texture.target, GL_TEXTURE_WRAP_S,
+ GL_CLAMP_TO_EDGE);
+ glTexParameteri (cap->texture.target, GL_TEXTURE_WRAP_T,
+ GL_CLAMP_TO_EDGE);
+ }
+ }
+ else
+ {
+ glTexParameteri (cap->texture.target, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (cap->texture.target, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ }
+ disableTexture (s, &cap->texture);
+}
+
+/* Settings handling -------------------------------------------------------- */
+
+/*
+ * Switch cap, load it and damage screen if possible
+ */
+static void
+cubeaddonChangeCap (CompScreen *s,
+ Bool top,
+ int change)
+{
+ CUBEADDON_SCREEN (s);
+ CubeCap *cap = (top)? &cas->topCap : &cas->bottomCap;
+ if (cap->files && cap->files->nValue)
+ {
+ int count = cap->files->nValue;
+ cap->current = (cap->current + change + count) % count;
+ if (top)
+ {
+ cubeaddonLoadCap (s, cap, cubeaddonGetTopScale (s),
+ cubeaddonGetTopAspect (s),
+ cubeaddonGetTopClamp (s));
+ }
+ else
+ {
+ cubeaddonLoadCap (s, cap, cubeaddonGetBottomScale (s),
+ cubeaddonGetBottomAspect (s),
+ cubeaddonGetBottomClamp (s));
+ matrixScale (&cap->texMat, 1.0, -1.0, 1.0);
+ }
+ damageScreen (s);
+ }
+}
+
+/*
+ * Top images list changed, reload top cap if any
+ */
+static void
+cubeaddonTopImagesChanged (CompScreen *s,
+ CompOption *opt,
+ CubeaddonScreenOptions num)
+{
+ CUBEADDON_SCREEN (s);
+
+ cas->topCap.files = cubeaddonGetTopImages (s);
+ cas->topCap.current = 0;
+ cubeaddonChangeCap (s, TRUE, 0);
+}
+
+/*
+ * Bottom images list changed, reload bottom cap if any
+ */
+static void
+cubeaddonBottomImagesChanged (CompScreen *s,
+ CompOption *opt,
+ CubeaddonScreenOptions num)
+{
+ CUBEADDON_SCREEN (s);
+
+ cas->bottomCap.files = cubeaddonGetBottomImages (s);
+ cas->bottomCap.current = 0;
+ cubeaddonChangeCap (s, FALSE, 0);
+}
+
+/*
+ * Top image attribute changed
+ */
+static void
+cubeaddonTopImageChanged (CompScreen *s,
+ CompOption *opt,
+ CubeaddonScreenOptions num)
+{
+ cubeaddonChangeCap (s, TRUE, 0);
+}
+
+/*
+ * Bottom images attribute changed
+ */
+static void
+cubeaddonBottomImageChanged (CompScreen *s,
+ CompOption *opt,
+ CubeaddonScreenOptions num)
+{
+ cubeaddonChangeCap (s, FALSE, 0);
+}
+
+/* Actions handling --------------------------------------------------------- */
+
+/*
+ * Switch to next top image
+ */
+static Bool
+cubeaddonTopNext (CompDisplay *d,
+ CompAction *action,
+ CompActionState state,
+ CompOption *option,
+ int nOption)
+{
+ CompScreen *s;
+ Window xid;
+
+ xid = getIntOptionNamed (option, nOption, "root", 0);
+
+ s = findScreenAtDisplay (d, xid);
+
+ if (s)
+ cubeaddonChangeCap (s, TRUE, 1);
+
+ return FALSE;
+}
+
+/*
+ * Switch to previous top image
+ */
+static Bool
+cubeaddonTopPrev (CompDisplay *d,
+ CompAction *action,
+ CompActionState state,
+ CompOption *option,
+ int nOption)
+{
+ CompScreen *s;
+ Window xid;
+
+ xid = getIntOptionNamed (option, nOption, "root", 0);
+
+ s = findScreenAtDisplay (d, xid);
+ if (s)
+ cubeaddonChangeCap (s, TRUE, -1);
+
+ return FALSE;
+}
+
+/*
+ * Switch to next bottom image
+ */
+static Bool
+cubeaddonBottomNext (CompDisplay *d,
+ CompAction *action,
+ CompActionState state,
+ CompOption *option,
+ int nOption)
+{
+ CompScreen *s;
+ Window xid;
+
+ xid = getIntOptionNamed (option, nOption, "root", 0);
+
+ s = findScreenAtDisplay (d, xid);
+
+ if (s)
+ cubeaddonChangeCap (s, FALSE, 1);
+
+ return FALSE;
+}
+
+/*
+ * Switch to previous bottom image
+ */
+static Bool
+cubeaddonBottomPrev (CompDisplay *d,
+ CompAction *action,
+ CompActionState state,
+ CompOption *option,
+ int nOption)
+{
+ CompScreen *s;
+ Window xid;
+
+ xid = getIntOptionNamed (option, nOption, "root", 0);
+
+ s = findScreenAtDisplay (d, xid);
+ if (s)
+ cubeaddonChangeCap (s, FALSE, -1);
+
+ return FALSE;
+}
+
static void
drawBasicGround (CompScreen *s)
{
@@ -242,7 +558,7 @@ cubeaddonShouldPaintViewport (CompScreen *s,
(order == BTF && (!ftb1 || !ftb2 || !ftb3));
}
else if (cas->deform > 0.0 &&
- cubeaddonGetDeformation (s) == DeformationSphereLike)
+ cubeaddonGetDeformation (s) == DeformationSphere)
{
float z[4];
Bool ftb1, ftb2, ftb3, ftb4;
@@ -282,75 +598,220 @@ cubeaddonShouldPaintViewport (CompScreen *s,
}
static void
-cubeaddonPaintTop (CompScreen *s,
+cubeaddonPaintCap (CompScreen *s,
const ScreenPaintAttrib *sAttrib,
const CompTransform *transform,
CompOutput *output,
- int size)
+ int size,
+ Bool top,
+ Bool adjust,
+ unsigned short *color)
{
ScreenPaintAttrib sa;
CompTransform sTransform;
- int i, opacity;
+ int i, l, opacity;
+ int cullNorm, cullInv;
Bool wasCulled = glIsEnabled (GL_CULL_FACE);
+ float cInv = (top) ? 1.0: -1.0;
+ CubeCap *cap;
+ Bool cScale, cAspect;
CUBE_SCREEN (s);
CUBEADDON_SCREEN (s);
- UNWRAP (cas, cs, paintTop);
- (*cs->paintTop) (s, sAttrib, transform, output, size);
- WRAP (cas, cs, paintTop, cubeaddonPaintTop);
+ glGetIntegerv (GL_CULL_FACE_MODE, &cullNorm);
+ cullInv = (cullNorm == GL_BACK)? GL_FRONT : GL_BACK;
- if (cas->deform == 0.0 || !cubeaddonGetFillCaps (s))
- return;
-
- for (i = 0; i < CUBEADDON_CAP_ELEMENTS * 4; i++)
- cas->capFill[(i * 3) + 1] = 0.5;
-
- opacity = (cs->desktopOpacity * cubeaddonGetTopColor(s)[3]) / 0xffff;
- glColor4us (cubeaddonGetTopColor(s)[0],
- cubeaddonGetTopColor(s)[1],
- cubeaddonGetTopColor(s)[2],
- opacity);
+ opacity = cs->desktopOpacity * color[3] / 0xffff;
glPushMatrix ();
+ glEnable (GL_BLEND);
- if (cs->desktopOpacity != OPAQUE)
+ if (top)
{
- glEnable (GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ cap = &cas->topCap;
+ cScale = cubeaddonGetTopScale (s);
+ cAspect = cubeaddonGetTopAspect (s);
}
+ else
+ {
+ cap = &cas->bottomCap;
+ cScale = cubeaddonGetBottomScale (s);
+ cAspect = cubeaddonGetBottomAspect (s);
+ }
+
glDisableClientState (GL_TEXTURE_COORD_ARRAY);
+
+ if (cubeaddonGetDeformation (s) == DeformationSphere &&
+ cubeaddonGetDeformCaps (s))
+ glEnableClientState (GL_NORMAL_ARRAY);
+
glVertexPointer (3, GL_FLOAT, 0, cas->capFill);
- glDisable (GL_CULL_FACE);
+ glEnable(GL_CULL_FACE);
- for (i = 0; i < size; i++)
+ for (l = 0; l < ((cs->invert == 1) ? 2 : 1); l++)
{
- sa = *sAttrib;
- sTransform = *transform;
- sa.yRotate += (360.0f / size) * i;
+ if (cubeaddonGetDeformation (s) == DeformationSphere &&
+ cubeaddonGetDeformCaps (s))
+ {
+ glNormalPointer (GL_FLOAT, 0, (l == 0) ? cas->capFill : cas->capFillNorm);
+ }
+ else
+ glNormal3f (0.0, (l == 0) ? 1.0 : -1.0, 0.0);
+
+ glCullFace(((l == 1) ^ top) ? cullInv : cullNorm);
+
+ for (i = 0; i < size; i++)
+ {
+ sa = *sAttrib;
+ sTransform = *transform;
+ if (cs->invert == 1)
+ {
+ sa.yRotate += (360.0f / size) * cs->xRotations;
+ if (!adjust)
+ sa.yRotate -= (360.0f / size) * s->x;
+ }
+ else
+ {
+ sa.yRotate += 180.0f;
+ sa.yRotate -= (360.0f / size) * cs->xRotations;
+ if (!adjust)
+ sa.yRotate += (360.0f / size) * s->x;
+ }
+ sa.yRotate += (360.0f / size) * i;
+
+ (*s->applyScreenTransform) (s, &sa, output, &sTransform);
+
+ glLoadMatrixf (sTransform.m);
+ glTranslatef (cs->outputXOffset, -cs->outputYOffset, 0.0f);
+ glScalef (cs->outputXScale, cs->outputYScale, 1.0f);
+
+ glScalef (1.0, cInv, 1.0);
+
+ glColor4us (color[0] * opacity / 0xffff,
+ color[1] * opacity / 0xffff,
+ color[2] * opacity / 0xffff,
+ opacity);
- (*s->applyScreenTransform) (s, &sa, output, &sTransform);
+ glDrawArrays (GL_TRIANGLE_FAN, 0, CAP_ELEMENTS + 2);
+ if (cubeaddonGetDeformation (s) == DeformationSphere &&
+ cubeaddonGetDeformCaps (s))
+ glDrawElements (GL_QUADS, CAP_NIDX, GL_UNSIGNED_SHORT,
+ cas->capFillIdx);
- glLoadMatrixf (sTransform.m);
- glTranslatef (cs->outputXOffset, -cs->outputYOffset, 0.0f);
- glScalef (cs->outputXScale, cs->outputYScale, 1.0f);
+ if (cap->loaded)
+ {
+ float s_gen[4], t_gen[4];
+ CompTransform texMat = cap->texMat;
+
+ if (cs->invert != 1)
+ matrixScale (&texMat, -1.0, 1.0, 1.0);
+
+ glColor4us (cs->desktopOpacity, cs->desktopOpacity,
+ cs->desktopOpacity, cs->desktopOpacity);
+ enableTexture (s, &cap->texture, COMP_TEXTURE_FILTER_GOOD);
+
+ if (cAspect)
+ {
+ float scale, xScale = 1.0, yScale = 1.0;
+ scale = (float)output->width / (float)output->height;
+
+ if (output->width > output->height)
+ {
+ xScale = 1.0;
+ yScale = 1.0 / scale;
+ }
+ else
+ {
+ xScale = scale;
+ yScale = 1.0;
+ }
- glDrawArrays (GL_TRIANGLE_FAN, 0, CUBEADDON_CAP_ELEMENTS + 2);
+ if (cubeaddonGetTopScale(s))
+ {
+ scale = xScale;
+ xScale = 1.0 / yScale;
+ yScale = 1.0 / scale;
+ }
+
+ matrixScale (&texMat, xScale, yScale, 1.0);
+ }
+
+ matrixRotate (&texMat, -(360.0f / size) * i, 0.0, 0.0, 1.0);
+
+ s_gen[0] = texMat.m[0];
+ s_gen[1] = texMat.m[8];
+ s_gen[2] = texMat.m[4];
+ s_gen[3] = texMat.m[12];
+ t_gen[0] = texMat.m[1];
+ t_gen[1] = texMat.m[9];
+ t_gen[2] = texMat.m[5];
+ t_gen[3] = texMat.m[13];
+
+ glTexGenfv(GL_T, GL_OBJECT_PLANE, t_gen);
+ glTexGenfv(GL_S, GL_OBJECT_PLANE, s_gen);
+
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+
+ glDrawArrays (GL_TRIANGLE_FAN, 0, CAP_ELEMENTS + 2);
+ if (cubeaddonGetDeformation (s) == DeformationSphere &&
+ cubeaddonGetDeformCaps (s))
+ glDrawElements (GL_QUADS, CAP_NIDX, GL_UNSIGNED_SHORT,
+ cas->capFillIdx);
+
+ glDisable(GL_TEXTURE_GEN_S);
+ glDisable(GL_TEXTURE_GEN_T);
+ disableTexture (s, &cas->topCap.texture);
+ }
+ }
}
+
glEnableClientState (GL_TEXTURE_COORD_ARRAY);
+ glDisableClientState (GL_NORMAL_ARRAY);
glDisable (GL_BLEND);
- glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ glNormal3f (0.0, -1.0, 0.0);
- if (wasCulled)
- glEnable (GL_CULL_FACE);
+ glCullFace (cullNorm);
+ if (!wasCulled)
+ glDisable (GL_CULL_FACE);
glPopMatrix ();
glColor4usv (defaultColor);
}
+static void
+cubeaddonPaintTop (CompScreen *s,
+ const ScreenPaintAttrib *sAttrib,
+ const CompTransform *transform,
+ CompOutput *output,
+ int size)
+{
+ CUBE_SCREEN (s);
+ CUBEADDON_SCREEN (s);
+
+ if ((!cubeaddonGetDrawBottom (s) && cs->invert == -1) ||
+ (!cubeaddonGetDrawTop (s) && cs->invert == 1))
+ {
+ UNWRAP (cas, cs, paintTop);
+ (*cs->paintTop) (s, sAttrib, transform, output, size);
+ WRAP (cas, cs, paintTop, cubeaddonPaintTop);
+ }
+
+ if (!cubeaddonGetDrawTop (s))
+ return;
+
+ cubeaddonPaintCap (s, sAttrib, transform, output, size, TRUE,
+ cubeaddonGetAdjustTop (s),
+ cubeaddonGetTopColor(s));
+}
+
/*
* Paint bottom cube face
*/
@@ -361,67 +822,23 @@ cubeaddonPaintBottom (CompScreen *s,
CompOutput *output,
int size)
{
- ScreenPaintAttrib sa;
- CompTransform sTransform;
- int i, opacity;
- Bool wasCulled = glIsEnabled (GL_CULL_FACE);
-
CUBE_SCREEN (s);
CUBEADDON_SCREEN (s);
- UNWRAP (cas, cs, paintBottom);
- (*cs->paintBottom) (s, sAttrib, transform, output, size);
- WRAP (cas, cs, paintBottom, cubeaddonPaintBottom);
-
- if (cas->deform == 0.0 || !cubeaddonGetFillCaps (s))
- return;
-
- for (i = 0; i < CUBEADDON_CAP_ELEMENTS * 4; i++)
- cas->capFill[(i * 3) + 1] = -0.5;
-
- opacity = (cs->desktopOpacity * cubeaddonGetBottomColor(s)[3]) / 0xffff;
- glColor4us (cubeaddonGetBottomColor(s)[0],
- cubeaddonGetBottomColor(s)[1],
- cubeaddonGetBottomColor(s)[2],
- opacity);
-
- glPushMatrix ();
-
- if (cs->desktopOpacity != OPAQUE)
+ if ((!cubeaddonGetDrawBottom (s) && cs->invert == 1) ||
+ (!cubeaddonGetDrawTop (s) && cs->invert == -1))
{
- glEnable (GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
-
- glDisableClientState (GL_TEXTURE_COORD_ARRAY);
- glVertexPointer (3, GL_FLOAT, 0, cas->capFill);
-
- glDisable (GL_CULL_FACE);
-
- for (i = 0; i < size; i++)
- {
- sa = *sAttrib;
- sTransform = *transform;
- sa.yRotate += (360.0f / size) * i;
-
- (*s->applyScreenTransform) (s, &sa, output, &sTransform);
-
- glLoadMatrixf (sTransform.m);
- glTranslatef (cs->outputXOffset, -cs->outputYOffset, 0.0f);
- glScalef (cs->outputXScale, cs->outputYScale, 1.0f);
-
- glDrawArrays (GL_TRIANGLE_FAN, 0, CUBEADDON_CAP_ELEMENTS + 2);
+ UNWRAP (cas, cs, paintBottom);
+ (*cs->paintBottom) (s, sAttrib, transform, output, size);
+ WRAP (cas, cs, paintBottom, cubeaddonPaintBottom);
}
- glEnableClientState (GL_TEXTURE_COORD_ARRAY);
- glDisable (GL_BLEND);
- glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
- if (wasCulled)
- glEnable (GL_CULL_FACE);
+ if (!cubeaddonGetDrawBottom (s))
+ return;
- glPopMatrix ();
-
- glColor4usv (defaultColor);
+ cubeaddonPaintCap (s, sAttrib, transform, output, size, FALSE,
+ cubeaddonGetAdjustBottom (s),
+ cubeaddonGetBottomColor(s));
}
static void
@@ -445,6 +862,7 @@ cubeaddonAddWindowGeometry (CompWindow *w,
int sx1, sx2, sw, sy1, sy2, sh, nBox, currBox, cLast;
float lastX, lastZ = 0.0, radSquare, last[2][4];
Bool found;
+ float inv = (cs->invert == 1) ? 1.0 : -1.0;
float a1, a2, ang;
@@ -607,7 +1025,7 @@ cubeaddonAddWindowGeometry (CompWindow *w,
if (ang < radSquare)
{
v[2] = sqrtf (radSquare - ang) - cs->distance;
- v[2] *= cas->deform;
+ v[2] *= cas->deform * inv;
}
}
@@ -650,7 +1068,8 @@ cubeaddonAddWindowGeometry (CompWindow *w,
ang = atanf (a1 / cs->distance);
a2 = sqrtf (radSquare - a2);
- v[2] += ((cosf (ang) * a2) - cs->distance) * cas->deform;
+ v[2] += ((cosf (ang) * a2) - cs->distance) *
+ cas->deform * inv;
v[0] += ((sinf (ang) * a2) - a1) * sw * cas->deform;
last[cLast][2] = v[0];
last[cLast][3] = v[2];
@@ -723,10 +1142,12 @@ cubeaddonDrawWindowTexture (CompWindow *w,
int offX = 0, offY = 0;
float x, y, ym;
GLfloat *v;
+ float inv;
CUBE_SCREEN (s);
- ym = (cubeaddonGetDeformation (s) == DeformationCylinder) ? 0.0 : 1.0;
+ inv = (cs->invert == 1) ? 1.0: -1.0;
+ ym = (cubeaddonGetDeformation (s) == DeformationCylinder) ? 0.0 : 1.0;
if (cas->winNormSize < w->vCount * 3)
{
@@ -801,8 +1222,8 @@ cubeaddonDrawWindowTexture (CompWindow *w,
}
else
{
- cas->winNormals[i * 3] = -x / sw * cas->deform;
- cas->winNormals[(i * 3) + 1] = -y / sh * cas->deform * ym;
+ cas->winNormals[i * 3] = -x / sw * cas->deform * inv;
+ cas->winNormals[(i * 3) + 1] = -y / sh * cas->deform * ym * inv;
cas->winNormals[(i * 3) + 2] = -(v[2] + cs->distance);
}
@@ -839,7 +1260,6 @@ cubeaddonPaintTransformedOutput (CompScreen *s,
{
static GLfloat light0Position[] = { -0.5f, 0.5f, -9.0f, 1.0f };
CompTransform sTransform = *transform;
- float x, progress;
CUBEADDON_SCREEN (s);
CUBE_SCREEN (s);
@@ -850,25 +1270,27 @@ cubeaddonPaintTransformedOutput (CompScreen *s,
(cs->rotationState == RotationChange &&
!cubeaddonGetCylinderManualOnly (s)) || cas->wasDeformed))
{
- const float angle = atan (0.5 / cs->distance);
- const float rad = 0.5 / sin (angle);
- float z, *quad;
- int i;
+ float x, progress;
(*cs->getRotation) (s, &x, &x, &progress);
cas->deform = progress;
- cas->capFill[0] = 0.0;
- cas->capFill[2] = cs->distance;
-
- for (i = 0; i <= CUBEADDON_CAP_ELEMENTS; i++)
+ if (cubeaddonGetSphereAspect (s) > 0.0 && cs->invert == 1)
{
- x = -0.5 + ((float)i / (float)CUBEADDON_CAP_ELEMENTS);
- z = ((cos (asin (x / rad)) * rad) - cs->distance) * cas->deform;
+ float scale, val = cubeaddonGetSphereAspect (s) * cas->deform;
- quad = &cas->capFill[(i + 1) * 3];
- quad[0] = x;
- quad[2] = cs->distance + z;
+ if (output->width > output->height)
+ {
+ scale = (float)output->height / (float)output->width;
+ scale = (scale * val) + 1.0 - val;
+ matrixScale (&sTransform, scale, 1.0, 1.0);
+ }
+ else
+ {
+ scale = (float)output->width / (float)output->height;
+ scale = (scale * val) + 1.0 - val;
+ matrixScale (&sTransform, 1.0, scale, 1.0);
+ }
}
}
else
@@ -876,6 +1298,107 @@ cubeaddonPaintTransformedOutput (CompScreen *s,
cas->deform = 0.0;
}
+ cs->paintAllViewports |= !cubeaddonGetDrawTop (s) ||
+ !cubeaddonGetDrawBottom (s) ||
+ (cubeaddonGetTopColorAlpha (s) != OPAQUE) ||
+ (cubeaddonGetBottomColorAlpha (s) != OPAQUE) ||
+ (cas->deform > 0.0);
+
+ if (cas->capDistance != cs->distance)
+ {
+ cubeaddonChangeCap (s, TRUE, 0);
+ cubeaddonChangeCap (s, FALSE, 0);
+ }
+
+ if (cas->deform != cas->capDeform || cas->capDistance != cs->distance ||
+ cas->capDeformType != cubeaddonGetDeformation (s))
+ {
+ float *quad;
+ int i, j;
+ float rS, r, x, y, z, w;
+ if (cubeaddonGetDeformation (s) != DeformationSphere ||
+ !cubeaddonGetDeformCaps (s))
+ {
+ rS = (cs->distance * cs->distance) + 0.5;
+
+ cas->capFill[0] = 0.0;
+ cas->capFill[1] = 0.5;
+ cas->capFill[2] = 0.0;
+ cas->capFillNorm[0] = 0.0;
+ cas->capFillNorm[1] = -1.0;
+ cas->capFillNorm[2] = 0.0;
+
+ z = cs->distance;
+ r = 0.25 + (cs->distance * cs->distance);
+
+ for (j = 0; j <= CAP_ELEMENTS; j++)
+ {
+ x = -0.5 + ((float)j / (float)CAP_ELEMENTS);
+ z = ((sqrtf(r - (x * x)) - cs->distance) * cas->deform) +
+ cs->distance;
+ y = 0.5;
+
+ quad = &cas->capFill[(1 + j) * 3];
+
+ quad[0] = x;
+ quad[1] = y;
+ quad[2] = z;
+
+ quad = &cas->capFillNorm[(1 + j) * 3];
+
+ quad[0] = -x;
+ quad[1] = -y;
+ quad[2] = -z;
+ }
+ }
+ else
+ {
+ rS = (cs->distance * cs->distance) + 0.5;
+
+ cas->capFill[0] = 0.0;
+ cas->capFill[1] = ((sqrtf (rS) - 0.5) * cas->deform) + 0.5;
+ cas->capFill[2] = 0.0;
+ cas->capFillNorm[0] = 0.0;
+ cas->capFillNorm[1] = -1.0;
+ cas->capFillNorm[2] = 0.0;
+
+ for (i = 0; i < CAP_ELEMENTS; i++)
+ {
+ w = (float)(i + 1) / (float)CAP_ELEMENTS;
+
+ r = (((w / 2.0) * (w / 2.0)) +
+ (cs->distance * cs->distance * w * w));
+
+ for (j = 0; j <= CAP_ELEMENTS; j++)
+ {
+ x = - (w / 2.0) + ((float)j * w / (float)CAP_ELEMENTS);
+ z = ((sqrtf(r - (x * x)) - (cs->distance * w)) *
+ cas->deform) + (cs->distance * w);
+ y = ((sqrtf(rS - (x * x) - (r - (x * x))) - 0.5) *
+ cas->deform) + 0.5;
+
+ quad = &cas->capFill[(1 + (i * (CAP_ELEMENTS + 1)) +
+ j) * 3];
+
+ quad[0] = x;
+ quad[1] = y;
+ quad[2] = z;
+
+ quad = &cas->capFillNorm[(1 + (i * (CAP_ELEMENTS + 1)) +
+ j) * 3];
+
+ quad[0] = -x;
+ quad[1] = -y;
+ quad[2] = -z;
+ }
+ }
+ }
+
+ cas->capDeform = cas->deform;
+ cas->capDistance = cs->distance;
+ cas->capDeformType = cubeaddonGetDeformation (s);
+ }
+
if (cs->invert == 1 && cas->first && cubeaddonGetReflection (s))
{
cas->first = FALSE;
@@ -883,7 +1406,7 @@ cubeaddonPaintTransformedOutput (CompScreen *s,
if (cs->grabIndex)
{
- CompTransform rTransform = *transform;
+ CompTransform rTransform = sTransform;
matrixTranslate (&rTransform, 0.0, -1.0, 0.0);
matrixScale (&rTransform, 1.0, -1.0, 1.0);
@@ -900,7 +1423,7 @@ cubeaddonPaintTransformedOutput (CompScreen *s,
}
else
{
- CompTransform rTransform = *transform;
+ CompTransform rTransform = sTransform;
CompTransform pTransform;
float angle = 360.0 / ((float) s->hsize * cs->nOutput);
float xRot, vRot, xRotate, xRotate2, vRotate, p;
@@ -938,7 +1461,6 @@ cubeaddonPaintTransformedOutput (CompScreen *s,
xRotate2 = (cas->deform * angle * 0.5) +
((1.0 - cas->deform) * xRotate2);
-
matrixGetIdentity (&pTransform);
matrixRotate (&pTransform, xRotate, 0.0f, 1.0f, 0.0f);
matrixRotate (&pTransform,
@@ -957,17 +1479,42 @@ cubeaddonPaintTransformedOutput (CompScreen *s,
switch (cubeaddonGetMode (s)) {
case ModeJumpyReflection:
- cas->yTrans = 0.0;
- rYTrans = point.y * 2.0;
+ cas->yTrans = 0.0;
+ if (cubeaddonGetDeformation (s) == DeformationSphere &&
+ cubeaddonGetDeformCaps (s) && cubeaddonGetDrawBottom (s))
+ {
+ rYTrans = sqrt (0.5 + (cs->distance * cs->distance)) *
+ -2.0;
+ }
+ else
+ {
+ rYTrans = point.y * 2.0;
+ }
+
break;
case ModeDistance:
- cas->yTrans = 0.0;
- rYTrans = sqrt (0.5 + (cs->distance * cs->distance)) *
- -2.0;
+ cas->yTrans = 0.0;
+ rYTrans = sqrt (0.5 + (cs->distance * cs->distance)) * -2.0;
break;
default:
- cas->yTrans = -point.y - 0.5;
- rYTrans = point.y - 0.5;
+
+ if (cubeaddonGetDeformation (s) == DeformationSphere &&
+ cubeaddonGetDeformCaps (s) && cubeaddonGetDrawBottom (s))
+ {
+ cas->yTrans = cas->capFill[1] - 0.5;
+ rYTrans = -cas->capFill[1] - 0.5;
+ }
+ else if (cubeaddonGetDeformation (s) == DeformationSphere &&
+ vRotate > atan (cs->distance * 2) / DEG2RAD)
+ {
+ cas->yTrans = sqrt (0.5 + (cs->distance * cs->distance)) - 0.5;
+ rYTrans = -sqrt (0.5 + (cs->distance * cs->distance)) - 0.5;
+ }
+ else
+ {
+ cas->yTrans = -point.y - 0.5;
+ rYTrans = point.y - 0.5;
+ }
break;
}
@@ -986,7 +1533,7 @@ cubeaddonPaintTransformedOutput (CompScreen *s,
if (cubeaddonGetDeformation (s) == DeformationCylinder)
deform = (sqrt (0.25 + (cs->distance * cs->distance)) -
cs->distance) * -cas->deform;
- else if (cubeaddonGetDeformation (s) == DeformationSphereLike)
+ else if (cubeaddonGetDeformation (s) == DeformationSphere)
deform = (sqrt (0.5 + (cs->distance * cs->distance)) -
cs->distance) * -cas->deform;
@@ -996,8 +1543,17 @@ cubeaddonPaintTransformedOutput (CompScreen *s,
if (cubeaddonGetMode (s) == ModeAbove && cas->vRot > 0.0)
{
cas->backVRotate = cas->vRot;
- cas->yTrans = 0.0;
- rYTrans = 0.0;
+ if (cubeaddonGetDeformation (s) == DeformationSphere &&
+ cubeaddonGetDeformCaps (s) && cubeaddonGetDrawBottom (s))
+ {
+ cas->yTrans = cas->capFill[1] - 0.5;
+ rYTrans = -cas->capFill[1] - 0.5;
+ }
+ else
+ {
+ cas->yTrans = 0.0;
+ rYTrans = -1.0;
+ }
matrixGetIdentity (&pTransform);
applyScreenTransform (s, sAttrib, output, &pTransform);
@@ -1010,8 +1566,8 @@ cubeaddonPaintTransformedOutput (CompScreen *s,
matrixTranslate (&rTransform, 0.0, 0.0, point.z);
matrixRotate (&rTransform, cas->vRot, 1.0, 0.0, 0.0);
matrixScale (&rTransform, 1.0, -1.0, 1.0);
- matrixTranslate (&rTransform, 0.0, 1.0, 0.0);
- matrixTranslate (&rTransform, 0.0, 0.0, -point.z + cas->zTrans);
+ matrixTranslate (&rTransform, 0.0, -rYTrans,
+ -point.z + cas->zTrans);
}
else
{
@@ -1197,6 +1753,16 @@ cubeaddonInitDisplay (CompPlugin *p,
d->base.privates[CubeaddonDisplayPrivateIndex].ptr = cad;
+ cubeaddonSetTopNextKeyInitiate (d, cubeaddonTopNext);
+ cubeaddonSetTopPrevKeyInitiate (d, cubeaddonTopPrev);
+ cubeaddonSetBottomNextKeyInitiate (d, cubeaddonBottomNext);
+ cubeaddonSetBottomPrevKeyInitiate (d, cubeaddonBottomPrev);
+
+ cubeaddonSetTopNextButtonInitiate (d, cubeaddonTopNext);
+ cubeaddonSetTopPrevButtonInitiate (d, cubeaddonTopPrev);
+ cubeaddonSetBottomNextButtonInitiate (d, cubeaddonBottomNext);
+ cubeaddonSetBottomPrevButtonInitiate (d, cubeaddonBottomPrev);
+
return TRUE;
}
@@ -1215,6 +1781,8 @@ cubeaddonInitScreen (CompPlugin *p,
CompScreen *s)
{
CubeaddonScreen *cas;
+ GLushort *idx;
+ int i, j;
CUBEADDON_DISPLAY (s->display);
CUBE_SCREEN (s);
@@ -1233,6 +1801,7 @@ cubeaddonInitScreen (CompPlugin *p,
cas->zTrans = 0.0;
cas->tmpRegion = XCreateRegion ();
cas->deform = 0.0;
+ cas->capDeform = -1.0;
cas->winNormals = NULL;
cas->winNormSize = 0;
@@ -1240,6 +1809,38 @@ cubeaddonInitScreen (CompPlugin *p,
cas->tmpBox = NULL;
cas->nTmpBox = 0;
+ idx = cas->capFillIdx;
+ for (i = 0; i < CAP_ELEMENTS - 1; i++)
+ {
+ for (j = 0; j < CAP_ELEMENTS; j++)
+ {
+ idx[0] = 1 + (i * (CAP_ELEMENTS + 1)) + j;
+ idx[1] = 1 + ((i + 1) * (CAP_ELEMENTS + 1)) + j;
+ idx[2] = 2 + ((i + 1) * (CAP_ELEMENTS + 1)) + j;
+ idx[3] = 2 + (i * (CAP_ELEMENTS + 1)) + j;
+ idx += 4;
+ }
+ }
+
+ cubeaddonInitCap (s, &cas->topCap);
+ cubeaddonInitCap (s, &cas->bottomCap);
+
+ cas->topCap.files = cubeaddonGetTopImages (s);
+ cas->bottomCap.files = cubeaddonGetBottomImages (s);
+
+ cubeaddonSetTopImagesNotify (s, cubeaddonTopImagesChanged);
+ cubeaddonSetBottomImagesNotify (s, cubeaddonBottomImagesChanged);
+
+ cubeaddonSetTopScaleNotify (s, cubeaddonTopImageChanged);
+ cubeaddonSetTopAspectNotify (s, cubeaddonTopImageChanged);
+ cubeaddonSetTopClampNotify (s, cubeaddonTopImageChanged);
+ cubeaddonSetBottomScaleNotify (s, cubeaddonBottomImageChanged);
+ cubeaddonSetBottomAspectNotify (s, cubeaddonBottomImageChanged);
+ cubeaddonSetBottomClampNotify (s, cubeaddonTopImageChanged);
+
+ cubeaddonChangeCap (s, TRUE, 0);
+ cubeaddonChangeCap (s, FALSE, 0);
+
WRAP (cas, s, paintTransformedOutput, cubeaddonPaintTransformedOutput);
WRAP (cas, s, paintOutput, cubeaddonPaintOutput);
WRAP (cas, s, donePaintScreen, cubeaddonDonePaintScreen);
Modified: fusion/plugins/cubeaddon/cubeaddon.xml.in
===================================================================
--- fusion/plugins/cubeaddon/cubeaddon.xml.in
+++ fusion/plugins/cubeaddon/cubeaddon.xml.in
@@ -9,14 +9,67 @@
<plugin>cube</plugin>
<plugin>rotate</plugin>
<plugin>cubecaps</plugin>
+ <plugin>svg</plugin>
+ <plugin>png</plugin>
+ <plugin>imgjpeg</plugin>
</relation>
<requirement>
<plugin>cube</plugin>
</requirement>
</deps>
+ <display>
+ <group>
+ <_short>Cube caps</_short>
+ <subgroup>
+ <_short>Bindings</_short>
+ <option name="top_next_key" type="key">
+ <_short>Next top image</_short>
+ <_long>Advance to next image for top face of the cube</_long>
+ <passive_grab>false</passive_grab>
+ <default>space</default>
+ </option>
+ <option name="top_next_button" type="button">
+ <_short>Next top image</_short>
+ <_long>Advance to next image for top face of the cube</_long>
+ <passive_grab>false</passive_grab>
+ </option>
+ <option name="top_prev_key" type="key">
+ <_short>Prev top image</_short>
+ <_long>Go back to previous image for top face of the cube</_long>
+ <passive_grab>false</passive_grab>
+ <default>Backspace</default>
+ </option>
+ <option name="top_prev_button" type="button">
+ <_short>Prev top image</_short>
+ <_long>Go back to previous image for top face of the cube</_long>
+ <passive_grab>false</passive_grab>
+ </option>
+ <option name="bottom_next_key" type="key">
+ <_short>Next bottom image</_short>
+ <_long>Advance to next image for bottom face of the cube</_long>
+ <passive_grab>false</passive_grab>
+ </option>
+ <option name="bottom_next_button" type="button">
+ <_short>Next bottom image</_short>
+ <_long>Advance to next image for bottom face of the cube</_long>
+ <passive_grab>false</passive_grab>
+ </option>
+ <option name="bottom_prev_key" type="key">
+ <_short>Prev bottom image</_short>
+ <_long>Go back to previous image for bottom face of the cube</_long>
+ <passive_grab>false</passive_grab>
+ </option>
+ <option name="bottom_prev_button" type="button">
+ <_short>Prev bottom image</_short>
+ <_long>Go back to previous image for bottom face of the cube</_long>
+ <passive_grab>false</passive_grab>
+ </option>
+ </subgroup>
+ </group>
+ </display>
<screen>
<group>
- <short>Reflection</short>
+ <_short>Reflection</_short>
<option name="reflection" type="bool">
<_short>Enabled</_short>
<_long>Give cube a reflective ground.</_long>
@@ -93,7 +146,7 @@
</option>
</group>
<group>
- <short>Deformation</short>
+ <_short>Deformation</_short>
<option name="deformation" type="int">
<_short>Deformation</_short>
<_long>Deformation mode.</_long>
@@ -110,7 +163,7 @@
</desc>
<desc>
<value>2</value>
- <_name>Sphere like</_name>
+ <_name>Sphere</_name>
</desc>
</option>
<option name="cylinder_manual_only" type="bool">
@@ -119,29 +172,116 @@
<default>false</default>
</option>
<subgroup>
- <short>Cube caps</short>
- <option name="fill_caps" type="bool">
- <_short>Fill caps</_short>
- <_long>Fill cap areas.</_long>
+ <_short>Sphere</_short>
+ <option name="deform_caps" type="bool">
+ <_short>Deform caps</_short>
+ <_long>Deform cube caps.</_long>
<default>true</default>
</option>
+ <option name="sphere_aspect" type="float">
+ <_short>Aspect ratio</_short>
+ <_long>Aspect ratio of the deformed cube</_long>
+ <min>0.0</min>
+ <max>1.0</max>
+ <precision>0.1</precision>
+ <default>0.0</default>
+ </option>
+ </subgroup>
+ </group>
+ <group>
+ <_short>Cube caps</_short>
+ <subgroup>
+ <_short>Behaviour</_short>
+ <option name="draw_top" type="bool">
+ <_short>Draw top face</_short>
+ <_long>Draw top face of the cube</_long>
+ <default>true</default>
+ </option>
+ <option name="draw_bottom" type="bool">
+ <_short>Draw bottom face</_short>
+ <_long>Draw bottom face of the cube</_long>
+ <default>true</default>
+ </option>
+ <option name="adjust_top" type="bool">
+ <_short>Adjust top image</_short>
+ <_long>Adjust top face image to rotation</_long>
+ <default>false</default>
+ </option>
+ <option name="adjust_bottom" type="bool">
+ <_short>Adjust bottom image</_short>
+ <_long>Adjust bottom face image to rotation</_long>
+ <default>false</default>
+ </option>
+ <option name="top_scale" type="bool">
+ <_short>Scale top image</_short>
+ <_long>Scale image to cover top face of cube</_long>
+ <default>true</default>
+ </option>
+ <option name="bottom_scale" type="bool">
+ <_short>Scale bottom image</_short>
+ <_long>Scale image to cover bottom face of cube</_long>
+ <default>true</default>
+ </option>
+ <option name="top_aspect" type="bool">
+ <_short>Maintain top aspect ratio</_short>
+ <_long>Maintain top cap image aspect ratio.</_long>
+ <default>true</default>
+ </option>
+ <option name="bottom_aspect" type="bool">
+ <_short>Maintain bottom aspect ratio</_short>
+ <_long>Maintain bottom cap image aspect ratio.</_long>
+ <default>true</default>
+ </option>
+ <option name="top_clamp" type="bool">
+ <_short>Clamp top face image to border</_short>
+ <_long>Clamp top face image to border. This is often the best if your image doesn't fit the size of the cube or if it's transparent. It can lead to some ugly dotted lines when enabled (especially with large enough images) though.</_long>
+ <default>true</default>
+ </option>
+ <option name="bottom_clamp" type="bool">
+ <_short>Clamp bottom face image to border</_short>
+ <_long>Clamp bottom face image to border. This is often the best if your image doesn't fit the size of the cube or if it's transparent. It can lead to some ugly dotted lines when enabled (especially with large enough images) though.</_long>
+ <default>true</default>
+ </option>
+ </subgroup>
+ <subgroup>
+ <_short>Appearance</_short>
<option name="top_color" type="color">
- <_short>Top cap fill Color</_short>
- <_long>Color of top cap filled area</_long>
+ <_short>Cube Top Color</_short>
+ <_long>Color of top face of the cube</_long>
<default>
- <red>0xfefe</red>
+ <red>0xffff</red>
<green>0xffff</green>
- <blue>0xc7c7</blue>
+ <blue>0xffff</blue>
</default>
</option>
<option name="bottom_color" type="color">
- <_short>Bottom cap fill Color</_short>
- <_long>Color of bottom cap filled area</_long>
+ <_short>Cube Bottom Color</_short>
+ <_long>Color of bottom face of the cube</_long>
<default>
- <red>0xfefe</red>
+ <red>0xffff</red>
<green>0xffff</green>
- <blue>0xc7c7</blue>
+ <blue>0xffff</blue>
+ </default>
+ </option>
+ <option name="top_images" type="list">
+ <_short>Top image files</_short>
+ <_long>List of PNG and SVG files that should be rendered on top face of cube</_long>
+ <type>string</type>
+ <hints>file;image;</hints>
+ <default>
+ <value>fusioncap.png</value>
+ </default>
+ <hints>file;image;</hints>
+ </option>
+ <option name="bottom_images" type="list">
+ <_short>Bottom image files</_short>
+ <_long>List of PNG and SVG files that should be rendered on bottom face of cube</_long>
+ <type>string</type>
+ <hints>file;image;</hints>
+ <default>
+ <value>compizcap.png</value>
</default>
+ <hints>file;image;</hints>
</option>
</subgroup>
</group>
Modified: fusion/plugins/cubeaddon/images/compizcap.png
new file mode 100644
===================================================================
Binary files /dev/null and b/images/compizcap.png differ
Modified: fusion/plugins/cubeaddon/images/cubecap_release.png
new file mode 100644
===================================================================
Binary files /dev/null and b/images/cubecap_release.png differ
Modified: fusion/plugins/cubeaddon/images/fusioncap.png
new file mode 100644
===================================================================
Binary files /dev/null and b/images/fusioncap.png differ
More information about the commits
mailing list