Skip to content

Commit

Permalink
Merge branch 'android' of git://192.168.21.75/lightning into android
Browse files Browse the repository at this point in the history
  • Loading branch information
nazarov-andrey committed Sep 13, 2012
2 parents 3874f62 + 9198397 commit d4a9a97
Show file tree
Hide file tree
Showing 22 changed files with 308 additions and 177 deletions.
79 changes: 46 additions & 33 deletions src/Atlas.ml
Expand Up @@ -8,12 +8,12 @@ external atlas_render: atlas -> Matrix.t -> Render.prg -> float -> option (DynAr

type glow = Image.glow ==
{
(* g_valid: mutable bool; *)
g_texture: mutable option Texture.c;
g_texture: mutable option RenderTexture.c;
g_image: mutable option Render.Image.t;
g_make_program: Render.prg;
g_program: mutable Render.prg;
g_matrix: mutable Matrix.t;
g_valid: mutable bool;
g_params: Filters.glow
};

Expand Down Expand Up @@ -133,41 +133,52 @@ DEFINE RENDER_QUADS(program,transform,color,alpha) =

method private updateGlowFilter () =
match glowFilter with
[ Some ({g_texture = None; g_make_program; g_params = glow; _ } as gf) ->
[ Some ({g_valid = False; g_texture; g_image; g_make_program; g_params = glow; _ } as gf) ->
let () = debug:glow "%s update glow %d" self#name glow.Filters.glowSize in
let bounds = self#boundsInSpace (Some self) in
if bounds.Rectangle.width <> 0. && bounds.Rectangle.height <> 0.
then
let hgs = (powOfTwo glow.Filters.glowSize) - 1 in
let gs = hgs * 2 in
let rw = bounds.Rectangle.width +. (float gs)
and rh = bounds.Rectangle.height +. (float gs) in
let ip = {Point.x = (float hgs) -. bounds.Rectangle.x;y= (float hgs) -. bounds.Rectangle.y} in
let cm = Matrix.create ~translate:ip () in
let tex = RenderTexture.draw rw rh begin fun fb ->
(
Render.push_matrix cm;
(* Render.clear 0 0.; *)
RENDER_QUADS(g_make_program,Matrix.identity,`NoColor,1.);
match glow.Filters.glowKind with
[ `linear -> proftimer:glow "linear time: %f" RenderFilters.glow_make fb glow
| `soft -> proftimer:glow "soft time: %f" RenderFilters.glow2_make fb glow
];
RENDER_QUADS(g_make_program,Matrix.identity,`NoColor,1.);
Render.restore_matrix ();
)
end in
(
let g_image = Render.Image.create tex#renderInfo color alpha in
(
gf.g_matrix :=
Matrix.create
~translate:{Point.x = (bounds.Rectangle.x -. (float hgs)); y = (bounds.Rectangle.y -. (float hgs))} ();
gf.g_texture := Some (tex :> Texture.c);
gf.g_image := Some g_image;
)
let gs = hgs * 2 in
let rw = bounds.Rectangle.width +. (float gs)
and rh = bounds.Rectangle.height +. (float gs) in
let ip = {Point.x = (float hgs) -. bounds.Rectangle.x;y= (float hgs) -. bounds.Rectangle.y} in
let cm = Matrix.create ~translate:ip () in
let drawf fb =
(
Render.push_matrix cm;
(* Render.clear 0 0.; *)
RENDER_QUADS(g_make_program,Matrix.identity,`NoColor,1.);
match glow.Filters.glowKind with
[ `linear -> proftimer:glow "linear time: %f" RenderFilters.glow_make fb glow
| `soft -> proftimer:glow "soft time: %f" RenderFilters.glow2_make fb glow
];
RENDER_QUADS(g_make_program,Matrix.identity,`NoColor,1.);
Render.restore_matrix ();
)
in
match (g_texture,g_image) with
[ (Some gtex,Some gimg) ->
match gtex#draw ~clear:(0,0.) ~width:rw ~height:rh drawf with
[ True -> Render.Image.update gimg gtex#renderInfo False False
| False -> ()
]
| (None,None) ->
let tex = RenderTexture.draw ~filter:Texture.FilterLinear rw rh drawf in
let g_image = Render.Image.create tex#renderInfo color alpha in
(
gf.g_texture := Some tex;
gf.g_image := Some g_image;
)
| _ -> assert False
];
gf.g_matrix :=
Matrix.create
~translate:{Point.x = (bounds.Rectangle.x -. (float hgs)); y = (bounds.Rectangle.y -. (float hgs))} ();
gf.g_valid := True;
)
else ()
else gf.g_valid := True
| _ -> () (* Debug.w "update glow not need" *)
];

Expand Down Expand Up @@ -276,15 +287,17 @@ DEFINE RENDER_QUADS(program,transform,color,alpha) =
then
(
match glowFilter with
[ Some ({g_texture;_} as gf) ->
[ Some {g_valid=True;_} ->
(
(*
match g_texture with
[ Some tex -> (tex#release (); gf.g_texture := None)
| None -> ()
];
*)
self#addPrerender self#updateGlowFilter;
)
| None -> ()
| _ -> ()
];
dirty := True;
)
Expand All @@ -302,7 +315,7 @@ DEFINE RENDER_QUADS(program,transform,color,alpha) =
if DynArray.length children > 0
then
match glowFilter with
[ Some {g_image = Some g_image; g_matrix; g_program; _ } ->
[ Some {g_valid = True; g_image = Some g_image; g_matrix; g_program; _ } ->
Render.Image.render (if transform then Matrix.concat g_matrix self#transformationMatrix else g_matrix) g_program ?alpha:alpha' g_image
| _ ->
let alpha = match alpha' with [ Some a -> a *. alpha | None -> alpha ] in
Expand Down
2 changes: 2 additions & 0 deletions src/DisplayObject.ml
Expand Up @@ -122,6 +122,7 @@ value prerender () =
RefList.copy prerender_objects locked_prerenders;
prerender_locked.val := None;
);
debug:prerender "end prerender";
)
];

Expand Down Expand Up @@ -221,6 +222,7 @@ class virtual _c [ 'parent ] = (*{{{*)
value prerenders : Queue.t (unit -> unit) = Queue.create ();
method private addToPrerenders _ _ lid =
(
debug:prerender "addToPrerenders: %s" self#name;
match Queue.is_empty prerenders with
[ False -> add_prerender (self :> prerenderObj)
| True -> ()
Expand Down
106 changes: 59 additions & 47 deletions src/Image.ml
Expand Up @@ -33,11 +33,12 @@ DEFINE TEX_COORDS_ROTATE_LEFT =

type glow =
{
g_texture: mutable option Texture.c;
g_texture: mutable option RenderTexture.c;
g_image: mutable option Render.Image.t;
g_make_program: Render.prg;
g_program: mutable Render.prg;
g_matrix: mutable Matrix.t;
g_valid: mutable bool;
g_params: Filters.glow
};

Expand All @@ -62,18 +63,19 @@ class virtual base texture =
method virtual private updateGlowFilter: unit -> unit;
method private setGlowFilter g_program glow =
(
match glowFilter with
[ Some {g_texture=Some gtex;_} -> gtex#release() (* FIXME: может не стоит здесь рушить нахуй текстуру???? а рисовать в ту же, должно быть чутахи быстрее *)
| _ -> ()
];
let g_make_program =
match texture#kind with
[ Texture.Simple _ -> GLPrograms.Image.create ()
| Texture.Alpha -> GLPrograms.ImageAlpha.create ()
| Texture.Pallete _ -> GLPrograms.ImagePallete.create ()
]
in
glowFilter := Some {g_image=None;g_matrix=Matrix.identity;g_texture=None;g_program;g_make_program;g_params=glow};
glowFilter := Some
(match glowFilter with
[ Some {g_texture=Some gtex;g_image=Some gimg; _} ->
{g_image=Some gimg; g_texture=Some gtex; g_matrix=Matrix.identity; g_program;g_make_program;g_params=glow;g_valid=False}
| _ -> {g_image=None;g_matrix=Matrix.identity;g_texture=None;g_program;g_make_program;g_params=glow;g_valid=False}
]);
self#addPrerender self#updateGlowFilter;
);

Expand Down Expand Up @@ -295,37 +297,52 @@ class _c _texture =

method private updateGlowFilter () =
match glowFilter with
[ Some ({g_texture = None; g_make_program; g_params = glow; _ } as gf) ->
let () = debug:glow "update glow filter on %s" self#name in
let renderInfo = texture#renderInfo in
let w = renderInfo.Texture.rwidth
and h = renderInfo.Texture.rheight in
let hgs = (powOfTwo glow.Filters.glowSize) - 1 in
let gs = hgs * 2 in
let rw = w +. (float gs)
and rh = h +. (float gs) in
let cm = Matrix.create ~translate:{Point.x = float hgs; y = float hgs} () in
let image = Render.Image.create renderInfo `NoColor 1. in
let tex = RenderTexture.draw rw rh begin fun fb ->
(
Render.Image.render cm g_make_program image;
match glow.Filters.glowKind with
[ `linear -> proftimer:glow "linear time: %f" RenderFilters.glow_make fb glow
| `soft -> proftimer:glow "soft time: %f" RenderFilters.glow2_make fb glow
];
Render.Image.render cm g_make_program image;
)
end in
[ Some ({g_valid = False; g_texture; g_image; g_make_program; g_params = glow; _ } as gf) ->
(
let g_image = Render.Image.create tex#renderInfo color alpha in
(
if texFlipX then Render.Image.flipTexX g_image else ();
if texFlipY then Render.Image.flipTexY g_image else ();
gf.g_image := Some g_image;
);
let () = debug:glow "update glow filter on %s" self#name in
let renderInfo = texture#renderInfo in
let w = renderInfo.Texture.rwidth
and h = renderInfo.Texture.rheight in
let hgs = (powOfTwo glow.Filters.glowSize) - 1 in
let gs = hgs * 2 in
let mhgs = float ~-hgs in
gf.g_matrix := Matrix.create ~translate:{Point.x = mhgs; y = mhgs} ();
gf.g_texture := Some (tex :> Texture.c)
let () = gf.g_matrix := Matrix.create ~translate:{Point.x = mhgs; y = mhgs} () in
let rw = w +. (float gs)
and rh = h +. (float gs) in
let cm = Matrix.create ~translate:{Point.x = float hgs; y = float hgs} () in
let image = Render.Image.create renderInfo `NoColor 1. in
let drawf fb =
(
Render.Image.render cm g_make_program image;
match glow.Filters.glowKind with
[ `linear -> proftimer:glow "linear time: %f" RenderFilters.glow_make fb glow
| `soft -> proftimer:glow "soft time: %f" RenderFilters.glow2_make fb glow
];
Render.Image.render cm g_make_program image;
)
in
match (g_texture,g_image) with
[ (None,None) ->
let tex = RenderTexture.draw ~filter:Texture.FilterLinear rw rh drawf in
(
let g_image = Render.Image.create tex#renderInfo color alpha in
(
if texFlipX then Render.Image.flipTexX g_image else ();
if texFlipY then Render.Image.flipTexY g_image else ();
gf.g_image := Some g_image;
);
gf.g_texture := Some tex;
)
| (Some gtex,Some gimg) ->
match gtex#draw ~clear:(0,0.) ~width:rw ~height:rh drawf with
[ True ->
let () = debug:glow "texture resized" in
Render.Image.update gimg gtex#renderInfo ~flipX:texFlipX ~flipY:texFlipY
| False -> debug:glow "texture not resized"
]
| _ -> assert False
];
gf.g_valid := True;
)
| _ -> ()
];
Expand Down Expand Up @@ -412,24 +429,19 @@ class _c _texture =
self#boundsChanged();
);

method onTextureEvent (ev:Texture.event) _ =
method onTextureEvent resized _ =
(
debug "[%s] texture %ld changed" self#name (Texture.int32_of_textureID texture#textureID);
match ev with
[ `RESIZE -> self#updateSize()
match resized with
[ True -> self#updateSize()
| _ -> ()
];
match glowFilter with
[ Some gf ->
(
match gf.g_texture with
[ Some gtex ->
(
gtex#release();
gf.g_texture := None;
self#addPrerender self#updateGlowFilter;
)
| None -> ()
match gf.g_valid with
[ True -> (self#addPrerender self#updateGlowFilter; gf.g_valid := False)
| False -> ()
]
)
| _ -> ()
Expand Down Expand Up @@ -504,7 +516,7 @@ class _c _texture =
method private render' ?alpha:(alpha') ~transform _ =
(
match glowFilter with
[ Some {g_image=Some g_image;g_matrix;g_program;_} ->
[ Some {g_valid=True; g_image = Some g_image;g_matrix;g_program;_} ->
Render.Image.render (if transform then Matrix.concat g_matrix self#transformationMatrix else g_matrix) g_program ?alpha:alpha' g_image
| _ -> Render.Image.render (if transform then self#transformationMatrix else Matrix.identity) shaderProgram ?alpha:alpha' image
]
Expand Down
5 changes: 3 additions & 2 deletions src/Image.mli
Expand Up @@ -2,11 +2,12 @@ open LightCommon;

type glow =
{
g_texture: mutable option Texture.c;
g_texture: mutable option RenderTexture.c;
g_image: mutable option Render.Image.t;
g_make_program: Render.prg;
g_program: mutable Render.prg;
g_matrix: mutable Matrix.t;
g_valid: mutable bool;
g_params: Filters.glow
};

Expand Down Expand Up @@ -42,7 +43,7 @@ class _c : [ Texture.c ] ->
*)

method texture: Texture.c;
method onTextureEvent: Texture.event -> Texture.c -> unit;
method onTextureEvent: bool -> Texture.c -> unit;
method setTexture: Texture.c -> unit;

(* method setTexScale: float -> unit; *)
Expand Down
8 changes: 8 additions & 0 deletions src/Lightning.ml
Expand Up @@ -83,6 +83,14 @@ ELSE
external getLocale: unit -> string = "ml_getLocale";
ENDIF;

IFDEF IOS THEN
external getVersion: unit -> string = "ml_getVersion";
ELSE
value getVersion () = "PC version";
ENDIF;



external memUsage: unit -> int = "ml_memUsage";
type malinfo =
{
Expand Down
3 changes: 2 additions & 1 deletion src/Lightning.mli
Expand Up @@ -23,10 +23,11 @@ type remoteNotification = [= `RNBadge | `RNSound | `RNAlert ];
value request_remote_notifications: list remoteNotification -> (string -> unit) -> (string -> unit) -> unit;

value getLocale: unit -> string;
value getVersion: unit -> string;

value addExceptionInfo: string -> unit;
value setSupportEmail: string -> unit;
value getMACID: unit -> string;

value extractAssetsIfRequired: (bool -> unit) -> unit;
value extractAssetsAndExpansionsIfRequired: (bool -> unit) -> unit;
value extractAssetsAndExpansionsIfRequired: (bool -> unit) -> unit;
13 changes: 6 additions & 7 deletions src/RenderTexture.ml
Expand Up @@ -7,8 +7,8 @@ external delete_textureID: textureID -> unit = "ml_texture_id_delete" "noalloc";


type framebuffer;
external renderbuffer_draw: ?filter:filter -> ?color:int -> ?alpha:float -> float -> float -> (framebuffer -> unit) -> renderInfo = "ml_renderbuffer_draw_byte" "ml_renderbuffer_draw";
external renderbuffer_draw_to_texture: ?color:int -> ?alpha:float -> ?width:float -> ?height:float -> renderInfo -> (framebuffer -> unit) -> bool = "ml_renderbuffer_draw_to_texture_byte" "ml_renderbuffer_draw_to_texture";
external renderbuffer_draw: ~filter:filter -> ?color:int -> ?alpha:float -> float -> float -> (framebuffer -> unit) -> renderInfo = "ml_renderbuffer_draw_byte" "ml_renderbuffer_draw";
external renderbuffer_draw_to_texture: ?clear:(int*float) -> ?width:float -> ?height:float -> renderInfo -> (framebuffer -> unit) -> bool = "ml_renderbuffer_draw_to_texture";


module Renderers = Weak.Make(struct type t = renderer; value equal r1 r2 = r1 = r2; value hash = Hashtbl.hash; end);
Expand All @@ -30,7 +30,6 @@ class c renderInfo =
value renderers = Renderers.create 1;
method addRenderer r = Renderers.add renderers r;
method removeRenderer r = Renderers.remove renderers r;
method private changed () = Renderers.iter (fun r -> r#onTextureEvent `CHANGE (self :> Texture.c)) renderers;
method setFilter filter = set_texture_filter renderInfo.rtextureID filter;


Expand Down Expand Up @@ -66,14 +65,14 @@ class c renderInfo =
*)

method draw ?color ?alpha ?width ?height (f:(framebuffer -> unit)) =
let resized = renderbuffer_draw_to_texture ?color ?alpha ?width ?height renderInfo f in
method draw ?clear ?width ?height (f:(framebuffer -> unit)) =
let resized = renderbuffer_draw_to_texture ?clear ?width ?height renderInfo f in
(
Renderers.iter (fun r -> r#onTextureEvent `CHANGE (self :> Texture.c)) renderers;
Renderers.iter (fun r -> r#onTextureEvent resized (self :> Texture.c)) renderers;
resized;
);

end; (*}}}*)


value draw ?filter ?color ?alpha width height f = new c (renderbuffer_draw ?filter width height f);
value draw ~filter ?color ?alpha width height f = new c (renderbuffer_draw ?filter width height f);

0 comments on commit d4a9a97

Please sign in to comment.