You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

224 lines
7.6 KiB

#ifndef _COMPIZ_ANIMATIONADDON_H
#define _COMPIZ_ANIMATIONADDON_H
#define ANIMATIONADDON_ABIVERSION 20081023
// Polygon tesselation type: Rectangular, Hexagonal
typedef enum
{
PolygonTessRect = 0,
PolygonTessHex,
PolygonTessGlass
} PolygonTess;
#define LAST_POLYGON_TESS 2
// This is intended to be a closed 3D piece of a window with convex polygon
// faces and quad-strip sides. Since decoration texture is separate from
// the window texture, it is more complicated than it would be with a single
// texture: we use glClipPlane with the rectangles (clips) to clip 3D space
// to the region falling within that clip.
// If the polygon is on an edge/corner, it also has 2D shadow quad(s)
// (to be faded out at the beginning of 3D animation if necessary).
typedef struct _PolygonObject
{
int nVertices; // number of total vertices (front + back)
int nSides; // number of sides
GLfloat *vertices; // Positions of vertices relative to center
GLushort *sideIndices; // Indices of quad strip for "sides"
GLfloat *normals; // Surface normals for 2+nSides faces
Box boundingBox; // Bound. box to test intersection with clips
// Animation effect parameters
Point3d centerPosStart; // Starting position of center
float rotAngleStart; // Starting rotation angle
Point3d centerPos; // Position of center
Vector3d rotAxis; // Rotation axis vector
float rotAngle; // Rotation angle
Point3d rotAxisOffset; // Rotation axis translate amount
Point centerRelPos; // Relative pos of center within the window
Vector3d finalRelPos; // Velocity factor for scripted movement
float finalRotAng; // Final rotation angle around rotAxis
float moveStartTime; // Movement starts at this time ([0-1] range)
float moveDuration; // Movement lasts this long ([0-1] range)
float fadeStartTime; // Fade out starts at this time ([0,1] range)
float fadeDuration; // Duration of fade out ([0,1] range)
void *effectParameters; /* Pointer to a struct that can contain
custom parameters for an individual effect */
float boundSphereRadius; // Radius of bounding sphere
} PolygonObject;
typedef struct _Clip4Polygons // Rectangular clips
{ // (to hold clips passed to AddWindowGeometry)
int id; // clip id (what number this clip is among
// passed clips)
Box box; // Coords
Boxf boxf; // Float coords (for small clipping adjustment)
CompMatrix texMatrix; // Corresponding texture coord. matrix
int *intersectingPolygons;
int nIntersectingPolygons; // Clips (in PolygonSet) that intersect
GLfloat *polygonVertexTexCoords;
// Tex coords for each intersecting polygon and for each vertex
// ordered as p1.v1.x, p1.v1.y, p1.v2.x, p1.v2.y, p2.v1.x, p2.v1.y, ...
} Clip4Polygons;
typedef enum
{
CorrectPerspectiveNone = 0,
CorrectPerspectivePolygon,
CorrectPerspectiveWindow
} CorrectPerspective;
typedef struct _PolygonSet // Polygon objects with same thickness
{
int nClips; // Rect. clips collected in AddWindowGeometries
Clip4Polygons *clips; // List of clips
int clipCapacity; // # of clips this list can hold
int firstNondrawnClip;
int *lastClipInGroup; // index of the last clip in each group of clips
// drawn in drawGeometry func.
Bool doDepthTest; // whether depth testing should be used in the effect
Bool doLighting; // whether lighting should be used in the effect
CorrectPerspective correctPerspective;
PolygonObject *polygons; // The polygons in this set
int nPolygons;
float thickness; // Window thickness (depth along z axis)
int nTotalFrontVertices; // Total # of polygon vertices on front faces
float backAndSidesFadeDur; // How long side and back faces should fade in/out
float allFadeDuration; /* Duration of fade out at the end in [0,1] range
when all polygons fade out at the same time.
If >-1, this overrides fadeDuration in PolygonObject */
Bool includeShadows; // include shadows in polygon
void (*extraPolygonTransformFunc) (PolygonObject *);
} PolygonSet;
typedef struct _Particle
{
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 r; // red value
float g; // green value
float b; // blue value
float a; // alpha value
float x; // X position
float y; // Y position
float z; // Z position
float xi; // X direction
float yi; // Y direction
float zi; // Z direction
float xg; // X gravity
float yg; // Y gravity
float zg; // Z gravity
float xo; // orginal X position
float yo; // orginal Y position
float zo; // orginal Z position
} Particle;
typedef struct _ParticleSystem
{
int numParticles;
Particle *particles;
float slowdown;
GLuint tex;
Bool active;
int x, y;
float darken;
GLuint blendMode;
// Moved from drawParticles to get rid of spurious malloc's
GLfloat *vertices_cache;
int vertex_cache_count;
GLfloat *coords_cache;
int coords_cache_count;
GLfloat *colors_cache;
int color_cache_count;
GLfloat *dcolors_cache;
int dcolors_cache_count;
} ParticleSystem;
// Window properties for particle or polygon based animation effects
typedef struct _AnimWindowEngineData
{
// for polygon engine
PolygonSet *polygonSet;
// for particle engine
int numPs;
ParticleSystem *ps;
} AnimWindowEngineData;
typedef Bool
(*tessellateProc) (CompWindow * w,
int gridSizeX,
int gridSizeY,
float thickness);
// Animaddon plugin functions for extension plugins to call
// (only for plugins with effects that use polygon or particle engines).
typedef struct _AnimAddonFunctions {
AnimWindowEngineData * (*getAnimWindowEngineData) (CompWindow *w);
int (*getIntenseTimeStep) (CompScreen *s);
// Particle engine functions
void (*initParticles) (int numParticles,
ParticleSystem * ps);
void (*finiParticles) (ParticleSystem * ps);
void (*drawParticleSystems) (CompWindow *w);
UpdateBBProc particlesUpdateBB;
void (*particlesCleanup) (CompWindow * w);
Bool (*particlesPrePrepPaintScreen) (CompWindow * w,
int msSinceLastPaint);
// Polygon engine functions
Bool (*polygonsAnimInit) (CompWindow * w);
void (*polygonsAnimStep) (CompWindow * w, float time);
void (*polygonsPrePaintWindow) (CompWindow * w);
void (*polygonsPostPaintWindow) (CompWindow * w);
void (*polygonsStoreClips) (CompWindow * w,
int nClip, BoxPtr pClip,
int nMatrix, CompMatrix * matrix);
void (*polygonsDrawCustomGeometry) (CompWindow * w);
UpdateBBProc polygonsUpdateBB;
Bool (*polygonsPrePreparePaintScreen) (CompWindow *w,
int msSinceLastPaint);
void (*polygonsCleanup) (CompWindow *w);
void (*polygonsRefresh) (CompWindow *w,
Bool animInitialized);
void (*polygonsDeceleratingAnimStepPolygon) (CompWindow * w,
PolygonObject *p,
float forwardProgress);
void (*freePolygonObjects) (PolygonSet * pset);
tessellateProc tessellateIntoRectangles;
tessellateProc tessellateIntoHexagons;
tessellateProc tessellateIntoGlass;
} AnimAddonFunctions;
typedef void (*AnimStepPolygonProc) (CompWindow *w,
PolygonObject *p,
float forwardProgress);
typedef struct _AnimAddonEffectProperties
{
AnimStepPolygonProc animStepPolygonFunc;
} AnimAddonEffectProperties;
#endif