%%
%% wings.hrl --
%%
%% Global record definition and defines.
%%
%% Copyright (c) 2001-2005 Bjorn Gustavsson
%%
%% See the file "license.terms" for information on usage and redistribution
%% of this file, and for a DISCLAIMER OF ALL WARRANTIES.
%%
%% $Id: wings.hrl,v 1.1 2009/01/25 18:55:33 kostis Exp $
%%
-include("wings_intl.hrl").
-ifdef(NEED_ESDL).
-include_lib("esdl/include/sdl.hrl").
-include_lib("esdl/include/sdl_events.hrl").
-include_lib("esdl/include/sdl_video.hrl").
-include_lib("esdl/include/sdl_keyboard.hrl").
-include_lib("esdl/include/sdl_mouse.hrl").
-include_lib("esdl/src/sdl_util.hrl").
-define(CTRL_BITS, ?KMOD_CTRL).
-define(ALT_BITS, ?KMOD_ALT).
-define(SHIFT_BITS, ?KMOD_SHIFT).
-define(META_BITS, ?KMOD_META).
-endif.
-define(WINGS_VERSION, ?wings_version).
-define(CHAR_HEIGHT, wings_text:height()).
-define(CHAR_WIDTH, wings_text:width()).
-define(LINE_HEIGHT, (?CHAR_HEIGHT+2)).
-define(GROUND_GRID_SIZE, 1).
-define(CAMERA_DIST, (8.0*?GROUND_GRID_SIZE)).
-define(NORMAL_LINEWIDTH, 1.0).
-define(DEGREE, 176). %Degree character.
-define(HIT_BUF_SIZE, (1024*1024)).
-define(PANE_COLOR, {0.52,0.52,0.52}).
-define(BEVEL_HIGHLIGHT, {0.9,0.9,0.9}).
-define(BEVEL_LOWLIGHT, {0.3,0.3,0.3}).
-define(BEVEL_HIGHLIGHT_MIX, 0.5).
-define(BEVEL_LOWLIGHT_MIX, 0.5).
-define(SLOW(Cmd), begin wings_io:hourglass(), Cmd end).
-define(TC(Cmd), wings_util:tc(fun() -> Cmd end, ?MODULE, ?LINE)).
-ifdef(DEBUG).
-define(ASSERT(E), case E of
true -> ok;
_ ->
erlang:error({assertion_failed,?MODULE,?LINE})
end).
-define(CHECK_ERROR(), wings_gl:check_error(?MODULE, ?LINE)).
-else.
-define(ASSERT(E),ok).
-define(CHECK_ERROR(), ok).
-endif.
%% Display lists per object.
%% Important: Plain integers and integers in lists will be assumed to
%% be display lists. Arbitrary integers must be stored inside a tuple
%% or record to not be interpreted as a display list.
-record(dlo,
{work=none, %Workmode faces.
smooth=none, %Smooth-shaded faces.
edges=none, %Edges and wire-frame.
vs=none, %Unselected vertices.
hard=none, %Hard edges.
sel=none, %Selected items.
orig_sel=none, %Original selection.
normals=none, %Normals.
pick=none, %For picking.
proxy_faces=none, %Smooth proxy faces.
proxy_edges=none, %Smooth proxy edges.
%% Miscellanous.
hilite=none, %Hilite display list.
mirror=none, %Virtual mirror data.
ns=none, %Normals/positions per face.
%% Source for display lists.
src_we=none, %Source object.
src_sel=none, %Source selection.
orig_mode=none, %Original selection mode.
split=none, %Split data.
drag=none, %For dragging.
transparent=false, %Object includes transparancy.
proxy_data=none, %Data for smooth proxy.
open=false, %Open (has hole).
%% List of display lists known to be needed only based
%% on display modes, not whether the lists themselves exist.
%% Example: [work,edges]
needed=[]
}).
%% Main state record containing all objects and other important state.
-record(st,
{shapes, %All visible shapes
selmode, %Selection mode:
% vertex, edge, face, body
sh=false, %Smart highlight active: true|false
sel=[], %Current sel: [{Id,GbSet}]
ssels=[], %Saved selections:
% [{Name,Mode,GbSet}]
temp_sel=none, %Selection only temporary?
mat, %Defined materials (GbTree).
pal=[], %Palette
file, %Current filename.
saved, %True if model has been saved.
onext, %Next object id to use.
bb=none, %Saved bounding box.
edge_loop=none, %Previous edge loop.
views={0,{}}, %{Current,TupleOfViews}
pst=gb_trees:empty(), %Plugin State Info
% gb_tree where key is plugin module
%% Previous commands.
repeatable, %Last repeatable command.
ask_args, %Ask arguments.
drag_args, %Drag arguments for command.
def, %Default operations.
%% Undo information.
top, %Top of stack.
bottom, %Bottom of stack.
next_is_undo, %State of undo/redo toggle.
undone %States that were undone.
}).
%% The Winged-Edge data structure.
%% See http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/model/winged-e.html
-record(we,
{id, %Shape id.
perm=0, %Permissions:
% 0 - Everything allowed.
% 1 - Visible, can't select.
% [] or {Mode,GbSet} -
% Invisible, can't select.
% The GbSet contains the
% object's selection.
name, %Name.
es, %gb_tree containing edges
fs, %gb_tree containing faces
he, %gb_sets containing hard edges
vc, %Connection info (=incident edge)
% for vertices.
vp, %Vertex positions.
pst=gb_trees:empty(), %Plugin State Info,
% gb_tree where key is plugin module
mat=default, %Materials.
next_id, %Next free ID for vertices,
% edges, and faces.
% (Needed because we never re-use
% IDs.)
mode, %'vertex'/'material'/'uv'
mirror=none, %Mirror: none|Face
light=none, %Light data: none|Light
has_shape=true %true|false
}).
-define(IS_VISIBLE(Perm), (Perm =< 1)).
-define(IS_NOT_VISIBLE(Perm), (Perm > 1)).
-define(IS_SELECTABLE(Perm), (Perm == 0)).
-define(IS_NOT_SELECTABLE(Perm), (Perm =/= 0)).
-define(IS_LIGHT(We), ((We#we.light =/= none) and (not We#we.has_shape))).
-define(IS_ANY_LIGHT(We), (We#we.light =/= none)).
-define(HAS_SHAPE(We), (We#we.has_shape)).
%-define(IS_LIGHT(We), (We#we.light =/= none)).
%-define(IS_NOT_LIGHT(We), (We#we.light =:= none)).
%% Edge in a winged-edge shape.
-record(edge,
{vs, %Start vertex for edge
ve, %End vertex for edge
a=none, %Color or UV coordinate.
b=none, %Color or UV coordinate.
lf, %Left face
rf, %Right face
ltpr, %Left traversal predecessor
ltsu, %Left traversal successor
rtpr, %Right traversal predecessor
rtsu %Right traversal successor
}).
%% The current view/camera.
-record(view,
{origin,
distance, % From origo.
azimuth,
elevation,
pan_x, %Panning in X direction.
pan_y, %Panning in Y direction.
along_axis=none, %Which axis viewed along.
fov, %Field of view.
hither, %Near clipping plane.
yon %Far clipping plane.
}).