ESDL question
Dan Gudmundsson
dgud@REDACTED
Fri Oct 26 08:53:21 CEST 2001
Hi Vlad
You have to use sdl:init_server/1 when using multiple processes.
I havn't used it for a long time so it might be broken..
/Dan
Vlad Dumitrescu writes:
> Hi,
>
> This question should probably go directly to Dan, but maybe others know the answer too...
>
> I have been trying to use esdl by calling gl functions from several processes, but it doesn't work... When calling gl:swapBuffers, the process just locks... Could any wiser than me look at the code? I am not really at home with OpenGL either.
>
> use ui:go() for a clean start.
>
> Thanks a lot,
> Vlad
>
> %%%----------------------------------------------------------------------
> %%% File : ui.erl
> %%% Author : <vladdu@REDACTED>
> %%% Purpose :
> %%% Created : 17 Oct 2001 by <vladdu@REDACTED>
> %%%----------------------------------------------------------------------
>
> -module(ui).
> -author('vladdu@REDACTED').
>
> -compile(export_all).
> %%-export([start/0, start/1, init/2, initWin/2, initWin2/2]).
>
> -include_lib("esdl/include/sdl.hrl").
> -include_lib("esdl/include/sdl_video.hrl").
> -include_lib("esdl/include/sdl_keyboard.hrl").
> -include_lib("esdl/include/gl.hrl").
> -include_lib("esdl/include/glu.hrl").
> -include_lib("esdl/include/sdl_events.hrl").
>
> -define(DBG(Str, Args), io:format("~p/~p: " ++Str ++"~n",
> [?MODULE, ?LINE] ++ Args)).
> -define(DBG1(Str), io:format("~p/~p: " ++Str ++"~n",[?MODULE, ?LINE])).
>
> -record(state, {root=none, wrapper, surface}).
>
> -define(set_wrapper(X), put(sdlwrapper, X)).
> -define(get_wrapper(), element(1, get(sdlwrapper))).
>
> go() ->
> Q=start(),
> W=initWin(600,400),
> Q!{root,W},
> W!start.
>
> start() ->
> spawn(ui, init, [[]]).
>
> start(Mode) when list(Mode) ->
> spawn(ui, init, [Mode]);
> start(_) ->
> error.
>
> init(Mode) ->
> register(ui, self()),
>
> Wrapper = sdl:init(?SDL_INIT_VIDEO bor ?SDL_INIT_ERLDRIVER),
>
> sdl_events:eventState(?SDL_ALLEVENTS ,?SDL_ENABLE),
> sdl_keyboard:enableKeyRepeat(100, 40),
> sdl_mouse:showCursor(false),
>
> Flags =
> case lists:member(fullscreen, Mode) of
> false ->
> ?SDL_OPENGL bor ?SDL_RESIZABLE;
> _ ->
> ?SDL_OPENGL bor ?SDL_FULLSCREEN
> end,
> sdl_video:gl_setAttribute(?SDL_GL_DOUBLEBUFFER, 1),
> R = sdl_video:setVideoMode(640, 480, 16, Flags),
>
> loop(#state{wrapper=Wrapper, surface=R}).
>
> loop(State) ->
> receive
> {root, Desktop} ->
> loop(State#state{root=Desktop});
> {wrapper, Pid} ->
> Pid ! {wrapper, State#state.wrapper},
> loop(State);
> Msg ->
> %%io:format("cmd: ~p ~n", [Msg]),
> loop(State)
> after 1 ->
> {_,Evs} = sdl_events:peepEvents(1, ?SDL_GETEVENT, ?SDL_ALLEVENTS),
> if length(Evs) == 1 ->
> %%io:format("event: ~p ~n", [hd(Evs)]),
> if pid(State#state.root) ->
> State#state.root ! hd(Evs);
> true -> true
> end,
> case hd(Evs) of
> #quit{} ->
> quit();
> _ ->
> ok
> end;
> true ->true
> end,
> loop(State)
> end.
>
> quit() ->
> ?DBG1("quitting..."),
> sdl:quit(),
> exit(normal).
>
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>
> initWin(W, H) ->
> spawn(ui, initWin2, [W, H]).
>
> initWin2(W, H) ->
> ui ! {wrapper, self()},
> receive
> {wrapper, Wrap} ->
> ?set_wrapper(Wrap),
> true
> end,
> receive
> start ->
> true
> end,
>
> sdl_mouse:showCursor(true),
>
> gl:viewport(0, 0, W-1, H-1),
> gl:clearColor(0.0, 0.0, 0.0, 0.0),
> gl:clearDepth(1.0),
> gl:depthFunc(?GL_LESS),
> gl:enable(?GL_DEPTH_TEST),
> gl:shadeModel(?GL_SMOOTH),
>
> gl:matrixMode(?GL_PROJECTION),
> gl:loadIdentity(),
> glu:perspective(45.0, W / H, 0.1, 100.0),
>
> gl:matrixMode(?GL_MODELVIEW),
>
> gl:blendFunc(?GL_SRC_ALPHA, ?GL_ONE_MINUS_SRC_ALPHA),
> gl:clearColor(0, 0, 0, 1),
>
> %%gl:swapBuffers(),
>
> loop_event().
>
> drawscene() ->
> gl:matrixMode(?GL_MODELVIEW),
>
> gl:clear(?GL_COLOR_BUFFER_BIT bor ?GL_DEPTH_BUFFER_BIT),
> gl:loadIdentity(),
>
> gl:translatef(0.0, 0.0, -6.0),
>
> gl:'begin'(?GL_QUADS),
> gl:color3f(0,1,0),
> gl:vertex3f(1.0, 0.0, 0.0),
> gl:color3f(1, 1,1),
> gl:vertex3f(1.0, 1.0, 0.0),
> gl:vertex3f(0.0, 1.0, 0.0),
> gl:color3f(1,0,0),
> gl:vertex3f(0.0, 0.0, 0.0),
> gl:'end'(),
>
> gl:'begin'(?GL_QUADS),
> gl:color3f(0,1,1),
> gl:vertex3f(1.5, 0.5, -1.0),
> gl:color3f(1, 1,1),
> gl:vertex3f(1.5, 1.5, -1.0),
> gl:vertex3f(0.5, 1.5, -1.0),
> gl:color3f(1,0,1),
> gl:vertex3f(0.5, 0.5, -1.0),
> gl:'end'(),
>
> gl:swapBuffers(),
> true.
>
> loop_event() ->
> receive
> {'EXIT', Pid, R} ->
> io:format("Error Pid ~p died with reason ~p ~n", [Pid, R]),
> quit;
> #quit{} ->
> ?DBG1("quit root"),
> quit;
> Else ->
> io:format("got: ~p ~n", [Else]),
> drawscene(),
> loop_event()
> % after 0 ->
> % %%io:format("Jerky?? Your opengl card is probably too slow ~n", []),
> % loop_event()
> end.
>
>
>
>
--
Dan Gudmundsson Project: Mnesia, Erlang/OTP
Ericsson Utvecklings AB Phone: +46 8 727 5762
UAB/F/P Mobile: +46 70 519 9469
S-125 25 Stockholm Visit addr: Armborstv 1
More information about the erlang-questions
mailing list