Micheus ... Dan ... I think I'm seeing a potential weakness in OpenGL version vetting ...
Look at this testing I have done on command line ...
Code:
1> {2,1} < {3,1,2}.
true
2> {2,1} < {2,1,2}.
true
3> {2,1} < {2,0,2}.
true
4>
My thought would be to put in an "assertion" that both tuples are three tuples ... else toss in a fatal.
Anyways ... I'm going to try to PUSH an improved version for you guys to ponder.
Maybe something like this is better ...
Code:
minor_gl_version() ->
Major = 2,
Minor = 1,
Req = {Major,Minor,0},
case ets:lookup(wings_gl_ext, version) of
[{_,{MajorCurrent,MinorCurrent,_}=VerTuple}] when VerTuple < Req ->
fatal("Wings3D requires OpenGL ~p.~p or higher.\nYour available version ~p.~p",
[Major,Minor, MajorCurrent,MinorCurrent]);
[{_,{_,_,_}=_VerTuple}] -> % assert that a 3 tuple is returned as expected
ok;
Unexpected ->
fatal("Unexpected current OpenGL info : ~p", [ Unexpected ])
end.
ggaliens, there is no reason for all that extra code you want to add:
Code:
[{_,{_,_,_}=_VerTuple}] -> % assert that a 3 tuple is returned as expected
ok;
Unexpected ->
fatal("Unexpected current OpenGL info : ~p", [ Unexpected ])
The
version tuple is already ensured to have three elements. Just look in
wings_gl.erl -
init_extensions/0, where the
version is stored:
Code:
init_extensions() ->
ets:new(wings_gl_ext, [named_table,public,ordered_set]),
Exts0 = lists:sort(string:tokens(gl:getString(?GL_EXTENSIONS), " ")),
Exts = [{list_to_atom(E)} || E <- Exts0],
ets:insert(wings_gl_ext, Exts),
Ver = case catch get_version() of
{_,_,_}=V -> V;
_ -> {1,1,0}
end,
ets:insert(wings_gl_ext, {version,Ver}).
Each unit of code should be a bit independent when possible. Assumptions that cut across modules are ugly.
I find aspects of init_extentions to also be scary. If the items besides major and minor version can be hard to predict ... why try to cast this stuff to zero 0 ? Just catch what is there and pass it on to the next consumer.
Then just let the compare happen on two digits. That should be enough.