aboutsummaryrefslogtreecommitdiffstats
path: root/lib/dialyzer/test/opaque_tests_SUITE_data/src/wings/wings_facemat.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dialyzer/test/opaque_tests_SUITE_data/src/wings/wings_facemat.erl')
-rw-r--r--lib/dialyzer/test/opaque_tests_SUITE_data/src/wings/wings_facemat.erl299
1 files changed, 0 insertions, 299 deletions
diff --git a/lib/dialyzer/test/opaque_tests_SUITE_data/src/wings/wings_facemat.erl b/lib/dialyzer/test/opaque_tests_SUITE_data/src/wings/wings_facemat.erl
deleted file mode 100644
index 6e018e49b5..0000000000
--- a/lib/dialyzer/test/opaque_tests_SUITE_data/src/wings/wings_facemat.erl
+++ /dev/null
@@ -1,299 +0,0 @@
-%%
-%% wings_facemat.erl --
-%%
-%% This module keeps tracks of the mapping from a face number
-%% to its material name.
-%%
-%% 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_facemat.erl,v 1.1 2009/01/25 18:55:33 kostis Exp $
-%%
-%%
-%%
-
--module(wings_facemat).
--export([all/1,face/2,used_materials/1,mat_faces/2,
- assign/2,assign/3,
- delete_face/2,delete_faces/2,keep_faces/2,
- hide_faces/1,show_faces/1,
- renumber/2,gc/1,merge/1]).
-
--include("wings.hrl").
--import(lists, [keysearch/3,reverse/1,reverse/2,sort/1]).
-
-%%%
-%%% API functions for retrieving information.
-%%%
-
-%% all(We) -> [{Face,MaterialName}]
-%% Return materials for all faces as an ordered list.
-all(#we{mat=M}=We) when is_atom(M) ->
- Vis = visible_faces(We),
- make_tab(Vis, M);
-all(#we{mat=L}) when is_list(L) ->
- remove_invisible(L).
-
-%% face(Face, We) -> MaterialName
-%% Return the material for the face Face.
-face(_, #we{mat=M}) when is_atom(M) -> M;
-face(Face, #we{mat=Tab}) ->
- {value,{_,Mat}} = keysearch(Face, 1, Tab),
- Mat.
-
-%% used_materials(We) -> [MaterialName]
-%% Return an ordered list of all materials used in the We.
-used_materials(#we{mat=M}) when is_atom(M) -> [M];
-used_materials(#we{mat=L}) when is_list(L) ->
- used_materials_1(L, []).
-
-%% mat_faces([{Face,Info}], We) -> [{Mat,[{Face,Info}]}]
-%% Group face tab into groups based on material.
-%% Used for displaying objects.
-mat_faces(Ftab, #we{mat=AtomMat}) when is_atom(AtomMat) ->
- [{AtomMat,Ftab}];
-mat_faces(Ftab, #we{mat=MatTab}) ->
- mat_faces_1(Ftab, remove_invisible(MatTab), []).
-
-%%%
-%%% API functions for updating material name mapping.
-%%%
-
-%% assign([{Face,MaterialName}], We) -> We'
-%% Assign materials.
-assign([], We) -> We;
-assign([{F,M}|_]=FaceMs, We) when is_atom(M), is_integer(F) ->
- Tab = ordsets:from_list(FaceMs),
- assign_face_ms(Tab, We).
-
-%% assign(MaterialName, Faces, We) -> We'
-%% Assign MaterialName to all faces Faces.
-assign(Mat, _, #we{mat=Mat}=We) when is_atom(Mat) -> We;
-assign(Mat, Fs, We) when is_atom(Mat), is_list(Fs) ->
- assign_1(Mat, Fs, We);
-assign(Mat, Fs, We) when is_atom(Mat) ->
- assign_1(Mat, gb_sets:to_list(Fs), We).
-
-%% delete_face(Face, We) -> We'
-%% Delete the material name mapping for the face Face.
-delete_face(_, #we{mat=AtomMat}=We) when is_atom(AtomMat) -> We;
-delete_face(Face, #we{mat=MatTab0}=We) ->
- MatTab = orddict:erase(Face, MatTab0),
- We#we{mat=MatTab}.
-
-%% delete_face(Faces, We) -> We'
-%% Delete the material name mapping for all faces Faces.
-delete_faces(_, #we{mat=AtomMat}=We) when is_atom(AtomMat) -> We;
-delete_faces(Faces0, #we{mat=MatTab0}=We) when is_list(Faces0) ->
- Faces = sofs:from_external(Faces0, [face]),
- MatTab1 = sofs:from_external(MatTab0, [{face,mat}]),
- MatTab2 = sofs:drestriction(MatTab1, Faces),
- MatTab = sofs:to_external(MatTab2),
- We#we{mat=MatTab};
-delete_faces(Faces, We) ->
- delete_faces(gb_sets:to_list(Faces), We).
-
-%% keep_faces(Faces, We) -> We'
-%% Delete all the other material names mapping for all faces other Faces.
-keep_faces(_, #we{mat=AtomMat}=We) when is_atom(AtomMat) -> We;
-keep_faces([Face], We) ->
- Mat = face(Face,We),
- We#we{mat=[{Face,Mat}]};
-keep_faces(Faces0, #we{mat=MatTab0}=We) when is_list(Faces0) ->
- Faces = sofs:from_external(Faces0, [face]),
- MatTab1 = sofs:from_external(MatTab0, [{face,mat}]),
- MatTab2 = sofs:restriction(MatTab1, Faces),
- MatTab = sofs:to_external(MatTab2),
- We#we{mat=MatTab};
-keep_faces(Faces, We) ->
- keep_faces(gb_sets:to_list(Faces), We).
-
-%% hide_faces(We) -> We'
-%% Update the material name mapping in the We to reflect
-%% the newly hidden faces in the face tab.
-hide_faces(#we{mat=M}=We) when is_atom(M) -> We;
-hide_faces(#we{mat=L0,fs=Ftab}=We) ->
- L = hide_faces_1(L0, Ftab, []),
- We#we{mat=L}.
-
-%% show_faces(We) -> We'
-%% Update the material name mapping in the We to reflect
-%% that all faces are again visible.
-show_faces(#we{mat=M}=We) when is_atom(M) -> We;
-show_faces(#we{mat=L0}=We) ->
- L = show_faces_1(L0, []),
- We#we{mat=L}.
-
-%% renumber(MaterialMapping, FaceOldToNew) -> MaterialMapping.
-%% Renumber face number in material name mapping.
-renumber(Mat, _) when is_atom(Mat) -> Mat;
-renumber(L, Fmap) when is_list(L) -> renumber_1(L, Fmap, []).
-
-%% gc(We) -> We'
-%% Garbage collect the material mapping information, removing
-%% the mapping for any face no longer present in the face table.
-gc(#we{mat=Mat}=We) when is_atom(Mat) -> We;
-gc(#we{mat=Tab0,fs=Ftab}=We) ->
- Fs = sofs:from_external(gb_trees:keys(Ftab), [face]),
- Tab1 = sofs:from_external(Tab0, [{face,material}]),
- Tab2 = sofs:restriction(Tab1, Fs),
- Tab = sofs:to_external(Tab2),
- We#we{mat=compress(Tab)}.
-
-%% merge([We]) -> [{Face,MaterialName}] | MaterialName.
-%% Merge materials for several objects.
-merge([#we{mat=M}|Wes]=L) when is_atom(M) ->
- case merge_all_same(Wes, M) of
- true -> M;
- false -> merge_1(L, [])
- end;
-merge(L) -> merge_1(L, []).
-
-merge_1([#we{mat=M,es=Etab}|T], Acc) when is_atom(M) ->
- FsM = merge_2(gb_trees:values(Etab), M, []),
- merge_1(T, [FsM|Acc]);
-merge_1([#we{mat=FsMs}|T], Acc) ->
- merge_1(T, [FsMs|Acc]);
-merge_1([], Acc) -> lists:merge(Acc).
-
-merge_2([#edge{lf=Lf,rf=Rf}|T], M, Acc) ->
- merge_2(T, M, [{Lf,M},{Rf,M}|Acc]);
-merge_2([], _, Acc) -> ordsets:from_list(Acc).
-
-merge_all_same([#we{mat=M}|Wes], M) -> merge_all_same(Wes, M);
-merge_all_same([_|_], _) -> false;
-merge_all_same([], _) -> true.
-
-%%%
-%%% Local functions.
-%%%
-
-assign_1(Mat, Fs, #we{fs=Ftab}=We) ->
- case length(Fs) =:= gb_trees:size(Ftab) of
- true -> We#we{mat=Mat};
- false -> assign_2(Mat, Fs, We)
- end.
-
-assign_2(Mat, Fs0, #we{fs=Ftab,mat=Mat0}=We) when is_atom(Mat0) ->
- Fs = ordsets:from_list(Fs0),
- OtherFaces = ordsets:subtract(gb_trees:keys(Ftab), Fs),
- Tab0 = make_tab(OtherFaces, Mat0),
- Tab1 = make_tab(Fs, Mat),
- Tab = lists:merge(Tab0, Tab1),
- We#we{mat=Tab};
-assign_2(Mat, Fs0, #we{mat=Tab0}=We) when is_list(Tab0) ->
- Fs = ordsets:from_list(Fs0),
- Tab1 = make_tab(Fs, Mat),
- Tab = mat_merge(Tab1, Tab0, []),
- We#we{mat=Tab}.
-
-assign_face_ms(Tab, #we{fs=Ftab}=We) ->
- case length(Tab) =:= gb_trees:size(Ftab) of
- true -> We#we{mat=compress(Tab)};
- false -> assign_face_ms_1(Tab, We)
- end.
-
-assign_face_ms_1(Tab1, #we{fs=Ftab,mat=Mat0}=We) when is_atom(Mat0) ->
- Tab0 = make_tab(gb_trees:keys(Ftab), Mat0),
- Tab = mat_merge(Tab1, Tab0, []),
- We#we{mat=Tab};
-assign_face_ms_1(Tab1, #we{mat=Tab0}=We) when is_list(Tab0) ->
- Tab = mat_merge(Tab1, Tab0, []),
- We#we{mat=Tab}.
-
-mat_merge([{Fn,_}|_]=Fns, [{Fo,_}=Fold|Fos], Acc) when Fo < Fn ->
- mat_merge(Fns, Fos, [Fold|Acc]);
-mat_merge([{Fn,_}=Fnew|Fns], [{Fo,_}|_]=Fos, Acc) when Fo > Fn ->
- mat_merge(Fns, Fos, [Fnew|Acc]);
-mat_merge([Fnew|Fns], [_|Fos], Acc) -> % Equality
- mat_merge(Fns, Fos, [Fnew|Acc]);
-mat_merge([], Fos, Acc) ->
- rev_compress(Acc, Fos);
-mat_merge(Fns, [], Acc) ->
- rev_compress(Acc, Fns).
-
-make_tab(Fs, M) ->
- make_tab_1(Fs, M, []).
-
-make_tab_1([F|Fs], M, Acc) ->
- make_tab_1(Fs, M, [{F,M}|Acc]);
-make_tab_1([], _, Acc) -> reverse(Acc).
-
-
-visible_faces(#we{fs=Ftab}) ->
- visible_faces_1(gb_trees:keys(Ftab)).
-
-visible_faces_1([F|Fs]) when F < 0 ->
- visible_faces_1(Fs);
-visible_faces_1(Fs) -> Fs.
-
-remove_invisible([{F,_}|Fs]) when F < 0 ->
- remove_invisible(Fs);
-remove_invisible(Fs) -> Fs.
-
-hide_faces_1([{F,_}=P|Fms], Ftab, Acc) when F < 0 ->
- hide_faces_1(Fms, Ftab, [P|Acc]);
-hide_faces_1([{F,M}=P|Fms], Ftab, Acc) ->
- case gb_trees:is_defined(F, Ftab) of
- false -> hide_faces_1(Fms, Ftab, [{-F-1,M}|Acc]);
- true -> hide_faces_1(Fms, Ftab, [P|Acc])
- end;
-hide_faces_1([], _, Acc) -> sort(Acc).
-
-show_faces_1([{F,M}|Fms], Acc) when F < 0 ->
- show_faces_1(Fms, [{-F-1,M}|Acc]);
-show_faces_1(Fs, Acc) -> sort(Acc++Fs).
-
-renumber_1([{F,M}|T], Fmap, Acc) ->
- renumber_1(T, Fmap, [{gb_trees:get(F, Fmap),M}|Acc]);
-renumber_1([], _, Acc) -> sort(Acc).
-
-%% rev_compress([{Face,Mat}], [{Face,Mat}]) -> [{Face,Mat}] | Mat.
-%% Reverse just like lists:reverse/2, but if all materials
-%% turns out to be just the same, return that material.
-rev_compress(L, Acc) ->
- case same_mat(Acc) of
- [] -> reverse(L, Acc);
- M -> rev_compress_1(L, M, Acc)
- end.
-
-rev_compress_1([{_,M}=E|T], M, Acc) ->
- %% Same material.
- rev_compress_1(T, M, [E|Acc]);
-rev_compress_1([_|_]=L, _, Acc) ->
- %% Another material. Finish by using reverse/2.
- reverse(L, Acc);
-rev_compress_1([], M, _) ->
- %% All materials turned out to be the same.
- M.
-
-%% compress(MaterialTab) -> [{Face,Mat}] | Mat.
-%% Compress a face mapping if possible.
-compress(M) when is_atom(M) -> M;
-compress(L) when is_list(L) ->
- case same_mat(L) of
- [] -> L;
- M -> M
- end.
-
-same_mat([]) -> [];
-same_mat([{_,M}|T]) -> same_mat_1(T, M).
-
-same_mat_1([{_,M}|T], M) -> same_mat_1(T, M);
-same_mat_1([], M) -> M;
-same_mat_1(_, _) -> [].
-
-used_materials_1([{_,M}|T], [M|_]=Acc) ->
- used_materials_1(T, Acc);
-used_materials_1([{_,M}|T], Acc) ->
- used_materials_1(T, [M|Acc]);
-used_materials_1([], Acc) ->
- ordsets:from_list(Acc).
-
-mat_faces_1([{F1,_}|_]=Fs, [{F2,_}|Ms], Acc) when F2 < F1 ->
- mat_faces_1(Fs, Ms, Acc);
-mat_faces_1([{F,Info}|Fs], [{F,Mat}|Ms], Acc) ->
- mat_faces_1(Fs, Ms, [{Mat,{F,Info}}|Acc]);
-mat_faces_1([], _, Acc) -> wings_util:rel2fam(Acc).