diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c index 92990bb51..9c8defe92 100644 --- a/clutter/clutter-actor.c +++ b/clutter/clutter-actor.c @@ -1968,7 +1968,7 @@ _clutter_actor_fully_transform_vertices (ClutterActor *self, ClutterActor *stage; CoglMatrix modelview; CoglMatrix projection; - int viewport[4]; + float viewport[4]; g_return_val_if_fail (CLUTTER_IS_ACTOR (self), FALSE); @@ -11786,7 +11786,7 @@ clutter_actor_get_paint_box (ClutterActor *self, const ClutterPaintVolume *pv; CoglMatrix modelview; CoglMatrix projection; - int viewport[4]; + float viewport[4]; ClutterPaintVolume projected_pv; g_return_val_if_fail (CLUTTER_IS_ACTOR (self), FALSE); diff --git a/clutter/clutter-paint-volume-private.h b/clutter/clutter-paint-volume-private.h index 0b986b89e..6df8118cd 100644 --- a/clutter/clutter-paint-volume-private.h +++ b/clutter/clutter-paint-volume-private.h @@ -113,7 +113,7 @@ void _clutter_paint_volume_transform (ClutterPaintVolu void _clutter_paint_volume_project (ClutterPaintVolume *pv, const CoglMatrix *modelview, const CoglMatrix *projection, - const int *viewport); + const float *viewport); void _clutter_paint_volume_get_bounding_box (ClutterPaintVolume *pv, ClutterActorBox *box); void _clutter_paint_volume_axis_align (ClutterPaintVolume *pv); diff --git a/clutter/clutter-paint-volume.c b/clutter/clutter-paint-volume.c index cd7a4e7b2..5a152c08e 100644 --- a/clutter/clutter-paint-volume.c +++ b/clutter/clutter-paint-volume.c @@ -651,7 +651,7 @@ void _clutter_paint_volume_project (ClutterPaintVolume *pv, const CoglMatrix *modelview, const CoglMatrix *projection, - const int *viewport) + const float *viewport) { int transform_count; diff --git a/clutter/clutter-private.h b/clutter/clutter-private.h index 3fdd3ef15..d336aea72 100644 --- a/clutter/clutter-private.h +++ b/clutter/clutter-private.h @@ -221,11 +221,17 @@ GType _clutter_layout_manager_get_child_meta_type (ClutterLayoutManager *manager void _clutter_util_fully_transform_vertices (const CoglMatrix *modelview, const CoglMatrix *projection, - const int *viewport, + const float *viewport, const ClutterVertex *vertices_in, ClutterVertex *vertices_out, int n_vertices); +typedef struct _ClutterPlane +{ + CoglVector3 v0; + CoglVector3 n; +} ClutterPlane; + G_END_DECLS #endif /* __CLUTTER_PRIVATE_H__ */ diff --git a/clutter/clutter-stage-private.h b/clutter/clutter-stage-private.h index 3217a822f..0238cba18 100644 --- a/clutter/clutter-stage-private.h +++ b/clutter/clutter-stage-private.h @@ -41,15 +41,15 @@ void _clutter_stage_get_projection_matrix (ClutterStage CoglMatrix *projection); void _clutter_stage_dirty_projection (ClutterStage *stage); void _clutter_stage_set_viewport (ClutterStage *stage, - int x, - int y, - int width, - int height); + float x, + float y, + float width, + float height); void _clutter_stage_get_viewport (ClutterStage *stage, - int *x, - int *y, - int *width, - int *height); + float *x, + float *y, + float *width, + float *height); void _clutter_stage_dirty_viewport (ClutterStage *stage); void _clutter_stage_maybe_setup_viewport (ClutterStage *stage); void _clutter_stage_maybe_relayout (ClutterActor *stage); diff --git a/clutter/clutter-stage.c b/clutter/clutter-stage.c index 5832b7209..f81d319a4 100644 --- a/clutter/clutter-stage.c +++ b/clutter/clutter-stage.c @@ -115,7 +115,7 @@ struct _ClutterStagePrivate ClutterColor color; ClutterPerspective perspective; CoglMatrix projection; - int viewport[4]; + float viewport[4]; ClutterFog fog; gchar *title; @@ -1880,14 +1880,19 @@ _clutter_stage_dirty_projection (ClutterStage *stage) * (XXX: If we were to make this API public then we might want to do * add that property.) * + * Note: currently this interface only support integer precision + * offsets and sizes for viewports but the interface takes floats because + * OpenGL 4.0 has introduced floating point viewports which we might + * want to expose via this API eventually. + * * Since: 1.6 */ void _clutter_stage_set_viewport (ClutterStage *stage, - int x, - int y, - int width, - int height) + float x, + float y, + float width, + float height) { ClutterStagePrivate *priv; @@ -1943,10 +1948,10 @@ _clutter_stage_dirty_viewport (ClutterStage *stage) */ void _clutter_stage_get_viewport (ClutterStage *stage, - int *x, - int *y, - int *width, - int *height) + float *x, + float *y, + float *width, + float *height) { ClutterStagePrivate *priv; @@ -2753,7 +2758,7 @@ _clutter_stage_maybe_setup_viewport (ClutterStage *stage) if (priv->dirty_viewport) { CLUTTER_NOTE (PAINT, - "Setting up the viewport { w:%d, h:%d }", + "Setting up the viewport { w:%f, h:%f }", priv->viewport[2], priv->viewport[3]); cogl_set_viewport (priv->viewport[0], diff --git a/clutter/clutter-util.c b/clutter/clutter-util.c index aa4056d1f..a45d00fac 100644 --- a/clutter/clutter-util.c +++ b/clutter/clutter-util.c @@ -84,7 +84,7 @@ _clutter_gettext (const gchar *str) void _clutter_util_fully_transform_vertices (const CoglMatrix *modelview, const CoglMatrix *projection, - const int *viewport, + const float *viewport, const ClutterVertex *vertices_in, ClutterVertex *vertices_out, int n_vertices) diff --git a/clutter/cogl/cogl/cogl-framebuffer-private.h b/clutter/cogl/cogl/cogl-framebuffer-private.h index 27e137dc1..44fc84f37 100644 --- a/clutter/cogl/cogl/cogl-framebuffer-private.h +++ b/clutter/cogl/cogl/cogl-framebuffer-private.h @@ -46,10 +46,10 @@ struct _CoglFramebuffer CoglMatrixStack *modelview_stack; CoglMatrixStack *projection_stack; - int viewport_x; - int viewport_y; - int viewport_width; - int viewport_height; + float viewport_x; + float viewport_y; + float viewport_width; + float viewport_height; CoglClipState clip_state; @@ -173,25 +173,25 @@ _cogl_framebuffer_set_clip_stack (CoglFramebuffer *framebuffer, void _cogl_framebuffer_set_viewport (CoglFramebuffer *framebuffer, - int x, - int y, - int width, - int height); -int + float x, + float y, + float width, + float height); +float _cogl_framebuffer_get_viewport_x (CoglFramebuffer *framebuffer); -int +float _cogl_framebuffer_get_viewport_y (CoglFramebuffer *framebuffer); -int +float _cogl_framebuffer_get_viewport_width (CoglFramebuffer *framebuffer); -int +float _cogl_framebuffer_get_viewport_height (CoglFramebuffer *framebuffer); void _cogl_framebuffer_get_viewport4fv (CoglFramebuffer *framebuffer, - int *viewport); + float *viewport); CoglMatrixStack * _cogl_framebuffer_get_modelview_stack (CoglFramebuffer *framebuffer); diff --git a/clutter/cogl/cogl/cogl-framebuffer.c b/clutter/cogl/cogl/cogl-framebuffer.c index fbe0b457d..f006407ce 100644 --- a/clutter/cogl/cogl/cogl-framebuffer.c +++ b/clutter/cogl/cogl/cogl-framebuffer.c @@ -499,10 +499,10 @@ _cogl_framebuffer_set_clip_stack (CoglFramebuffer *framebuffer, void _cogl_framebuffer_set_viewport (CoglFramebuffer *framebuffer, - int x, - int y, - int width, - int height) + float x, + float y, + float width, + float height) { _COGL_GET_CONTEXT (ctx, NO_RETVAL); @@ -523,32 +523,33 @@ _cogl_framebuffer_set_viewport (CoglFramebuffer *framebuffer, ctx->dirty_gl_viewport = TRUE; } -int +float _cogl_framebuffer_get_viewport_x (CoglFramebuffer *framebuffer) { return framebuffer->viewport_x; } -int +float _cogl_framebuffer_get_viewport_y (CoglFramebuffer *framebuffer) { return framebuffer->viewport_y; } -int +float _cogl_framebuffer_get_viewport_width (CoglFramebuffer *framebuffer) { return framebuffer->viewport_width; } -int +float _cogl_framebuffer_get_viewport_height (CoglFramebuffer *framebuffer) { return framebuffer->viewport_height; } void -_cogl_framebuffer_get_viewport4fv (CoglFramebuffer *framebuffer, int *viewport) +_cogl_framebuffer_get_viewport4fv (CoglFramebuffer *framebuffer, + float *viewport) { viewport[0] = framebuffer->viewport_x; viewport[1] = framebuffer->viewport_y; @@ -1290,7 +1291,7 @@ _cogl_framebuffer_flush_state (CoglFramebuffer *draw_buffer, if (ctx->dirty_gl_viewport) { - int gl_viewport_y; + float gl_viewport_y; /* Convert the Cogl viewport y offset to an OpenGL viewport y offset * NB: OpenGL defines its window and viewport origins to be bottom @@ -1303,7 +1304,7 @@ _cogl_framebuffer_flush_state (CoglFramebuffer *draw_buffer, gl_viewport_y = draw_buffer->height - (draw_buffer->viewport_y + draw_buffer->viewport_height); - COGL_NOTE (OPENGL, "Calling glViewport(%d, %d, %d, %d)", + COGL_NOTE (OPENGL, "Calling glViewport(%f, %f, %f, %f)", draw_buffer->viewport_x, gl_viewport_y, draw_buffer->viewport_width, diff --git a/clutter/cogl/cogl/cogl-journal.c b/clutter/cogl/cogl/cogl-journal.c index ea152f31e..88fbb9848 100644 --- a/clutter/cogl/cogl/cogl-journal.c +++ b/clutter/cogl/cogl/cogl-journal.c @@ -1552,7 +1552,7 @@ entry_to_screen_polygon (const CoglJournalEntry *entry, CoglMatrixStack *projection_stack; CoglMatrix projection; int i; - int viewport[4]; + float viewport[4]; poly[0] = vertices[0]; poly[1] = vertices[1]; diff --git a/clutter/cogl/cogl/cogl-matrix-mesa.c b/clutter/cogl/cogl/cogl-matrix-mesa.c index 59d9e6f4c..0356a1127 100644 --- a/clutter/cogl/cogl/cogl-matrix-mesa.c +++ b/clutter/cogl/cogl/cogl-matrix-mesa.c @@ -1251,13 +1251,15 @@ _math_matrix_translate (CoglMatrix *matrix, float x, float y, float z) * Transforms Normalized Device Coords to window/Z values. */ void -_math_matrix_viewport (CoglMatrix *matrix, int x, int y, int width, int height, +_math_matrix_viewport (CoglMatrix *matrix, + float x, float y, + float width, float height, float zNear, float zFar, float depthMax) { float *m = (float *)matrix; - m[MAT_SX] = (float)width / 2.0f; + m[MAT_SX] = width / 2.0f; m[MAT_TX] = m[MAT_SX] + x; - m[MAT_SY] = (float) height / 2.0f; + m[MAT_SY] = height / 2.0f; m[MAT_TY] = m[MAT_SY] + y; m[MAT_SZ] = depthMax * ((zFar - zNear) / 2.0f); m[MAT_TZ] = depthMax * ((zFar - zNear) / 2.0f + zNear); diff --git a/clutter/cogl/cogl/cogl-matrix-mesa.h b/clutter/cogl/cogl/cogl-matrix-mesa.h index 79f4558d4..72ac8650f 100644 --- a/clutter/cogl/cogl/cogl-matrix-mesa.h +++ b/clutter/cogl/cogl/cogl-matrix-mesa.h @@ -134,7 +134,7 @@ _math_matrix_frustum (CoglMatrix *matrix, void _math_matrix_viewport (CoglMatrix *matrix, - int x, int y, int width, int height, + float x, float y, float width, float height, float z_near, float z_far, float depth_max); void diff --git a/clutter/cogl/cogl/cogl-texture.c b/clutter/cogl/cogl/cogl-texture.c index 2b4c09762..3348f483d 100644 --- a/clutter/cogl/cogl/cogl-texture.c +++ b/clutter/cogl/cogl/cogl-texture.c @@ -929,7 +929,7 @@ cogl_texture_set_region (CoglHandle handle, static void do_texture_draw_and_read (CoglHandle handle, CoglBitmap *target_bmp, - GLint *viewport) + float *viewport) { int bpp; float rx1, ry1; @@ -1036,7 +1036,7 @@ _cogl_texture_draw_and_read (CoglHandle handle, { int bpp; CoglFramebuffer *framebuffer; - int viewport[4]; + float viewport[4]; CoglBitmap *alpha_bmp; CoglMatrixStack *projection_stack; CoglMatrixStack *modelview_stack; @@ -1064,10 +1064,10 @@ _cogl_texture_draw_and_read (CoglHandle handle, _cogl_matrix_stack_push (projection_stack); _cogl_matrix_stack_load_identity (projection_stack); _cogl_matrix_stack_ortho (projection_stack, - 0, (float)(viewport[2]), - (float)(viewport[3]), 0, - (float)(0), - (float)(100)); + 0, viewport[2], + viewport[3], 0, + 0, + 100); modelview_stack = _cogl_framebuffer_get_modelview_stack (framebuffer); _cogl_matrix_stack_push (modelview_stack); diff --git a/clutter/cogl/cogl/cogl.c b/clutter/cogl/cogl/cogl.c index 515e4dd3c..b79452db3 100644 --- a/clutter/cogl/cogl/cogl.c +++ b/clutter/cogl/cogl/cogl.c @@ -407,19 +407,14 @@ _cogl_features_available_private (CoglFeatureFlagsPrivate features) * _cogl_framebuffer_get_viewport* functions public. */ void -cogl_get_viewport (float v[4]) +cogl_get_viewport (float viewport[4]) { CoglFramebuffer *framebuffer; - int viewport[4]; - int i; _COGL_GET_CONTEXT (ctx, NO_RETVAL); framebuffer = _cogl_get_draw_buffer (); _cogl_framebuffer_get_viewport4fv (framebuffer, viewport); - - for (i = 0; i < 4; i++) - v[i] = viewport[i]; } void diff --git a/clutter/cogl/cogl/cogl.h b/clutter/cogl/cogl/cogl.h index a55b4ed4e..f3a354361 100644 --- a/clutter/cogl/cogl/cogl.h +++ b/clutter/cogl/cogl/cogl.h @@ -1281,9 +1281,6 @@ _cogl_check_extension (const char *name, const char *ext); void _cogl_set_indirect_context (gboolean indirect); -void -_cogl_set_viewport (int x, int y, int width, int height); - gboolean _cogl_check_driver_valid (GError **error);