2007-05-31 Matthew Allum <mallum@openedhand.com>
+ * clutter/clutter-actor.c:
+ * clutter/clutter-actor.h:
+ Add clutter_actor_get_transformed_point()
+
+ * clutter/clutter-main.c:
+ Plug in perspective setup to redraw
+
+ * clutter/clutter-stage.c:
+ * clutter/clutter-stage.h:
+ Remove audience code for now.
+
+2007-05-31 Matthew Allum <mallum@openedhand.com>
+
* clutter/egl/clutter-backend-egl.c:
* clutter/egl/clutter-backend-egl.h:
* clutter/egl/clutter-event-egl.c:
CFX_MUL (M (m,2,2), _z) + M (m,2,3);
}
-/**
- * clutter_actor_get_transformed_vertices:
- * @self: A #ClutterActor
- * @verts: Pointer to a location of #ClutterVertices where to store the result.
- * Calculates the vertices of the translated, rotated and scaled actor in 3D
- * space.
- *
- * Since: 0.4
- **/
-void
-clutter_actor_get_transformed_vertices (ClutterActor * self,
- ClutterVertices * verts)
+static void
+mtx_create (ClutterActor *self, ClutterFixed *mtx)
{
- ClutterActorPrivate * priv;
- ClutterFixed mtx[16];
- ClutterFixed x, y, z;
-
- g_return_if_fail (CLUTTER_IS_ACTOR (self));
- priv = self->priv;
+ ClutterActorPrivate *priv = self->priv;
+
+ /* FIXME: need to apply perspective / viewport transforms */
mtx_identity (&mtx[0]);
* 0,0 to where our actor is.
*/
mtx_translate (&mtx[0],
- CLUTTER_UNITS_TO_FIXED (priv->coords.x1),
- CLUTTER_UNITS_TO_FIXED (priv->coords.y1),
- CLUTTER_INT_TO_FIXED (priv->z));
+ CLUTTER_UNITS_TO_FIXED (priv->coords.x1),
+ CLUTTER_UNITS_TO_FIXED (priv->coords.y1),
+ CLUTTER_INT_TO_FIXED (priv->z));
if (self->priv->rzang)
{
{
mtx_scale (&mtx[0], priv->scale_x, priv->scale_y);
}
+}
+
+/**
+ * clutter_actor_get_transformed_point:
+ * @self: A #ClutterActor
+ * @x: X screen position in pixels
+ * @y: Y screen position in pixels
+ * @x_return: location to store tranformed X Axis value in #ClutterUnits
+ * @y_return: location to store tranformed Y Axis value in #ClutterUnits
+ * @z_return: location to store tranformed Z Axis value in #ClutterUnits
+ *
+ * Transforms a 2D point (relative to the actor) into 3D space defined by
+ * the actors current tranformation matrix.
+ *
+ * Since: 0.4
+ **/
+void
+clutter_actor_get_transformed_point (ClutterActor *actor,
+ gint x,
+ gint y,
+ ClutterUnit *x_return,
+ ClutterUnit *y_return,
+ ClutterUnit *z_return)
+{
+ ClutterFixed mtx[16];
+
+ g_return_if_fail (CLUTTER_IS_ACTOR (actor));
+
+ mtx_create (actor, &mtx[0]);
+
+ *x_return = CLUTTER_UNITS_FROM_INT(x);
+ *y_return = CLUTTER_UNITS_FROM_INT(y);
+ *z_return = 0;
+
+ mtx_transform (&mtx[0], x_return, y_return, z_return);
+}
+
+/**
+ * clutter_actor_get_transformed_vertices:
+ * @self: A #ClutterActor
+ * @verts: Pointer to a location of #ClutterVertices where to store the result.
+ * Calculates the vertices of the translated, rotated and scaled actor in 3D
+ * space.
+ *
+ * Since: 0.4
+ **/
+void
+clutter_actor_get_transformed_vertices (ClutterActor * self,
+ ClutterVertices * verts)
+{
+ ClutterFixed mtx[16];
+ ClutterFixed x, y, z;
+ ClutterActorPrivate *priv;
+
+ g_return_if_fail (CLUTTER_IS_ACTOR (self));
+
+ /* FIXME: we should probably call allocate_cords on the actor to make
+ * sure untransformed box is up to date.
+ */
+
+ priv = self->priv;
+
+ mtx_create (self, &mtx[0]);
#if 0
g_debug ("Matrix\n"
void clutter_actor_get_transformed_vertices (ClutterActor *self,
ClutterVertices * verts);
+void clutter_actor_get_transformed_point (ClutterActor *actor,
+ gint x,
+ gint y,
+ ClutterUnit *x_return,
+ ClutterUnit *y_return,
+ ClutterUnit *z_return);
+
G_END_DECLS
#endif /* _HAVE_CLUTTER_ACTOR_H */
*/
if (CLUTTER_PRIVATE_FLAGS (stage) & CLUTTER_ACTOR_SYNC_MATRICES)
{
+ ClutterPerspective perspective;
+
+ clutter_stage_get_perspectivex (stage, &perspective);
+
cogl_setup_viewport (clutter_actor_get_width (stage),
clutter_actor_get_height (stage),
- 171, /* 60 degrees */
- CFX_ONE,
- CLUTTER_FLOAT_TO_FIXED (0.1),
- CLUTTER_FLOAT_TO_FIXED (100.0));
+ perspective.fovy,
+ perspective.aspect,
+ perspective.z_near,
+ perspective.z_far);
}
/* Setup the initial paint */
{
ClutterColor color;
ClutterPerspective perspective;
- ClutterAudience audience;
guint is_fullscreen : 1;
guint is_offscreen : 1;
PROP_OFFSCREEN,
PROP_CURSOR_VISIBLE,
PROP_PERSPECTIVE,
- PROP_AUDIENCE
};
enum
case PROP_PERSPECTIVE:
clutter_stage_set_perspectivex (stage, g_value_get_boxed (value));
break;
- case PROP_AUDIENCE:
- clutter_stage_set_audience (stage, g_value_get_boxed (value));
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
ClutterStage *stage;
ClutterStagePrivate *priv;
ClutterColor color;
- ClutterAudience audience;
ClutterPerspective perspective;
stage = CLUTTER_STAGE(object);
clutter_stage_get_perspectivex (stage, &perspective);
g_value_set_boxed (value, &perspective);
break;
- case PROP_AUDIENCE:
- clutter_stage_get_audience (stage, &audience);
- g_value_set_boxed (value, &audience);
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
priv->color.green = 0xff;
priv->color.blue = 0xff;
priv->color.alpha = 0xff;
+
+ priv->perspective.fovy = 171; /* 60 Degrees */
+ priv->perspective.aspect = CFX_ONE;
+ priv->perspective.z_near = CLUTTER_FLOAT_TO_FIXED (0.1);
+ priv->perspective.z_far = CLUTTER_FLOAT_TO_FIXED (100.0);
clutter_actor_set_size (CLUTTER_ACTOR (self), 640, 480);
}
*z_far = CLUTTER_FIXED_TO_FLOAT(priv->perspective.z_far);
}
-
-void
-clutter_stage_set_audience (ClutterStage *stage,
- ClutterAudience *audience)
-{
-
-}
-
-void
-clutter_stage_get_audience (ClutterStage *stage,
- ClutterAudience *audience)
-{
-
-}
-
/**
* clutter_stage_fullscreen:
* @stage: a #ClutterStage
glGetIntegerv(GL_VIEWPORT, viewport);
glReadPixels(x, viewport[3] - y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel);
- /* printf("x: %i , y: %i %x:%x:%x\n", x, y, pixel[0], pixel[1], pixel[2]); */
-
if (pixel[0] == 0xff && pixel[1] == 0xff && pixel[2] == 0xff)
return CLUTTER_ACTOR(stage);
return our_type;
}
-/*** Audience boxed type ******/
-
-/**
- * clutter_audience_copy:
- * @audience: a #ClutterAudience
- *
- * Makes a copy of the audience structure. The result must be
- * freed using clutter_audience_free().
- *
- * Return value: an allocated copy of @audience.
- *
- * Since: 0.4
- */
-ClutterAudience *
-clutter_audience_copy (const ClutterAudience *audience)
-{
- ClutterAudience *result;
-
- g_return_val_if_fail (audience != NULL, NULL);
-
- result = g_slice_new (ClutterAudience);
- *result = *audience;
-
- return result;
-}
-
-/**
- * clutter_audience_free:
- * @audience: a #ClutterAudience
- *
- * Frees a audience structure created with clutter_audience_copy().
- *
- * Since: 0.4
- */
-void
-clutter_audience_free (ClutterAudience *audience)
-{
- g_return_if_fail (audience != NULL);
-
- g_slice_free (ClutterAudience, audience);
-}
-
-GType
-clutter_audience_get_type (void)
-{
- static GType our_type = 0;
-
- if (!our_type)
- our_type = g_boxed_type_register_static
- ("ClutterAudience",
- (GBoxedCopyFunc) clutter_audience_copy,
- (GBoxedFreeFunc) clutter_audience_free);
- return our_type;
-}
ClutterFixed z_far;
};
-#define CLUTTER_TYPE_AUDIENCE (clutter_audience_get_type ())
-
-typedef struct _ClutterAudience ClutterAudience;
-
-struct _ClutterAudience
-{
-};
-
GType clutter_perspective_get_type (void) G_GNUC_CONST;
ClutterPerspective *clutter_perspective_copy (const ClutterPerspective *perspective);
void clutter_perspective_free (ClutterPerspective *perspective);
-GType clutter_audience_get_type (void) G_GNUC_CONST;
-ClutterAudience *clutter_audience_copy (const ClutterAudience *audience);
-void clutter_audience_free (ClutterAudience *audience);
-
GType clutter_stage_get_type (void) G_GNUC_CONST;
ClutterActor *clutter_stage_get_default (void);
gfloat *aspect,
gfloat *z_near,
gfloat *z_far);
-void clutter_stage_set_audience (ClutterStage *stage,
- ClutterAudience *audience);
-void clutter_stage_get_audience (ClutterStage *stage,
- ClutterAudience *audience);
void clutter_stage_fullscreen (ClutterStage *stage);
void clutter_stage_unfullscreen (ClutterStage *stage);
void clutter_stage_show_cursor (ClutterStage *stage);