/* ----------------------------------------------------------------------------- This source file is part of OpenSpace3D For the latest info, see http://www.openspace3d.com Copyright (c) 2012 I-maginer This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA, or go to http://www.gnu.org/copyleft/lesser.txt ----------------------------------------------------------------------------- */ //TODO random position from a point get from items plugit //Defined positions by nodes struct InstUProj = [ INSTUPROJ_iId : I, INSTUPROJ_project : Project, INSTUPROJ_user : NetUser, INSTUPROJ_nodeRef : SO3_OBJECT ]mkInstUProj;; struct PlugInstuser = [ INSTUSER_inst : PInstance, INSTUSER_netcomm : NetComm, INSTUSER_sUserPath : S, INSTUSER_sPath : S, INSTUSER_parent : SO3_OBJECT, INSTUSER_bSons : I, INSTUSER_lProjects : [[NetUser InstUProj] r1], INSTUSER_lSonsPos : [[SO3_OBJECT I] r1], INSTUSER_lUserData : [[I [S r1]] r1] ]mkPlugInstuser;; fun readUserData(obstr, value)= let nil -> ndata in let nil -> odata in ( let readCSVdata value ";" -> lcsv in while (lcsv != nil) do ( let hd lcsv -> line in let atoi hd line -> id in ( //addLogMessage strcatn (itoa id)::" "::(hd tl line)::nil; set odata = [(V3DgetObjectByName c3dXsession (hd tl line)) id]::odata; set ndata = [id tl line]::ndata; ); set lcsv = tl lcsv; ); set obstr.INSTUSER_lSonsPos = odata; set obstr.INSTUSER_lUserData = ndata; );; fun fotmatUserData(obstr)= let obstr.INSTUSER_lUserData -> ldata in let nil -> ndata in ( while (ldata != nil) do ( let hd ldata -> [id lp] in set ndata = (lcat (itoa id)::nil lp)::ndata; set ldata = tl ldata; ); formatCSV ";" nil ndata; );; fun deleteOb(inst, obstr)= let V3DgetSessionView c3dXsession -> viewstr in while (obstr.INSTUSER_lProjects != nil) do ( let hd obstr.INSTUSER_lProjects -> [user uprojstr] in deleteProject uprojstr.INSTUPROJ_project viewstr; set obstr.INSTUSER_lProjects = tl obstr.INSTUSER_lProjects; ); set obstr.INSTUSER_lSonsPos = nil; 0;; fun cbSceneLoaded(projstr, obstr, uprojstr)= SendPluginEvent obstr.INSTUSER_inst "Instance loaded" (itoa uprojstr.INSTUPROJ_iId) nil; 0;; fun cbSceneDestroyed(projstr, obstr, uprojstr)= SendPluginEvent obstr.INSTUSER_inst "Instance destroyed" (itoa uprojstr.INSTUPROJ_iId) nil; 0;; fun cbSortNodes(s1, s2)= strcmpi SO3ObjectGetName s1 SO3ObjectGetName s2;; //TODO check user add order fun getFreeNode(obstr, parent, uprojstr)= let nil -> found in ( let quicksort SO3ObjectGetChildren parent @cbSortNodes -> lchild in while ((lchild != nil) && (found == nil)) do ( let hd lchild -> child in if ((switch obstr.INSTUSER_lSonsPos child) != nil) then nil else ( set uprojstr.INSTUPROJ_nodeRef = child; set obstr.INSTUSER_lSonsPos = [child uprojstr.INSTUPROJ_iId]::obstr.INSTUSER_lSonsPos; set found = child; ); set lchild = tl lchild; ); found; );; fun setProjectPath(inst, from, action, param, rep, obstr)= set obstr.INSTUSER_sPath = param; 0;; fun setProjectUserPath(inst, from, action, param, rep, obstr)= set obstr.INSTUSER_sUserPath = param; 0;; fun addUser(netstr, userstr, obstr)= let if (userstr == (netThisUser netstr)) then obstr.INSTUSER_sUserPath else obstr.INSTUSER_sPath -> projpath in if (projpath == nil) then nil else let netUserGetId userstr -> idx in let V3DgetSessionView c3dXsession -> viewstr in let crProject projpath (strcatn (itoa idx)::"."::(getPluginInstanceName obstr.INSTUSER_inst)::nil) 2 (getPluginInstanceName obstr.INSTUSER_inst) -> projstr in let mkInstUProj [idx projstr userstr nil] -> uprojstr in ( set obstr.INSTUSER_lProjects = [userstr uprojstr]::obstr.INSTUSER_lProjects; set projstr.PRJ_netUser = userstr; setProjectCbSceneLoaded uprojstr.INSTUPROJ_project mkfun2 mkfun3 @cbSceneLoaded uprojstr obstr; setProjectCbSceneDestroyed uprojstr.INSTUPROJ_project mkfun2 mkfun3 @cbSceneDestroyed uprojstr obstr; let if (userstr == (netThisUser netstr)) then nil else V3DgetObjectByName c3dXsession (hd (switch obstr.INSTUSER_lUserData idx)) -> uparent in let if (uparent != nil) then uparent else if (obstr.INSTUSER_parent == nil) then nil else if obstr.INSTUSER_bSons then getFreeNode obstr obstr.INSTUSER_parent uprojstr else obstr.INSTUSER_parent -> parent in ( loadProject uprojstr.INSTUPROJ_project viewstr parent [0.0 0.0 0.0] [0.0 0.0 0.0 1.0] [1.0 1.0 1.0] 0; if (userstr != (netThisUser netstr)) then nil else ( set obstr.INSTUSER_lUserData = [idx (SO3ObjectGetName parent)::nil]::obstr.INSTUSER_lUserData; let strcat getPluginInstanceName obstr.INSTUSER_inst ".data" -> itemname in netUpdateRoomItem netstr itemname fotmatUserData obstr; ); ); ); 0;; fun cbAddUser(inst, netstr, userstr, obstr)= //what is correct user order call ? if (userstr == (netThisUser netstr)) then nil else addUser netstr userstr obstr; 0;; fun cbDelUser(inst, netstr, userstr, obstr)= let V3DgetSessionView c3dXsession -> viewstr in if (userstr == (netThisUser netstr)) then nil else ( let switch obstr.INSTUSER_lProjects userstr -> uprojstr in if (uprojstr == nil) then nil else deleteProject uprojstr.INSTUPROJ_project viewstr; set obstr.INSTUSER_lProjects = remove_idx_from_list obstr.INSTUSER_lProjects userstr; 0; ); set obstr.INSTUSER_lUserData = remove_idx_from_list obstr.INSTUSER_lUserData (netUserGetId userstr); let strcat getPluginInstanceName obstr.INSTUSER_inst ".data" -> itemname in netUpdateRoomItem netstr itemname fotmatUserData obstr; 0;; fun cbGetUserItem(inst, netstr, userstr, item, value, obstr)= //if (userstr == (netThisUser netstr)) then nil else //let switch obstr.INSTUSER_lProjects userstr -> uprojstr in //if (uprojstr == nil) then nil else //( // //); 0;; fun cbDisconnected(inst, netstr, obstr)= deleteOb inst obstr; 0;; fun cbSConnected(inst, netstr, obstr)= 0;; fun cbLoginChanged(inst, netstr, userstr, newlogin, obstr)= //let switch obstr.INSTUSER_lProjects userstr -> uprojstr in //if (uprojstr == nil) then nil else //( //); 0;; fun cbRoomChanged(inst, netstr, room, obstr)= // if item does not exist then we create it with default value let strcat getPluginInstanceName obstr.INSTUSER_inst ".data" -> itemname in if ((netRoomGetItemValue netstr itemname) != nil) then nil else netUpdateRoomItem netstr itemname fotmatUserData obstr; 0;; fun cbGetRoomItem(inst, netstr, item, value, obstr)= let strcat getPluginInstanceName obstr.INSTUSER_inst ".data" -> itemname in if (strcmp item itemname) then nil else ( readUserData obstr value; if ((switch obstr.INSTUSER_lProjects (netThisUser netstr)) != nil) then nil else addUser netstr (netThisUser netstr) obstr; ); 0;; fun newOb(inst)= let (getPluginInstanceParam inst "path") -> path in let (getPluginInstanceParam inst "userpath") -> userpath in let (getPluginInstanceParam inst "object") -> objname in let atoi (getPluginInstanceParam inst "sons") -> sons in let if sons == nil then 0 else sons -> sons in let V3DgetObjectByName c3dXsession objname -> parent in let mkPlugInstuser [inst netcomOS3D userpath path parent sons nil nil nil] -> obstr in ( PluginRegisterAction inst "Set local user project path" mkfun6 @setProjectPath obstr; PluginRegisterAction inst "Set network user project path" mkfun6 @setProjectUserPath obstr; setPluginInstanceCbNetNewUser inst mkfun4 @cbAddUser obstr; setPluginInstanceCbNetDelUser inst mkfun4 @cbDelUser obstr; setPluginInstanceCbNetUserGetItem inst mkfun6 @cbGetUserItem obstr; setPluginInstanceCbNetSConnected inst mkfun3 @cbSConnected obstr; setPluginInstanceCbNetClosed inst mkfun3 @cbDisconnected obstr; setPluginInstanceCbNetUserChangeLogin inst mkfun5 @cbLoginChanged obstr; setPluginInstanceCbNetRoomChanged inst mkfun4 @cbRoomChanged obstr; setPluginInstanceCbNetRoomGetItem inst mkfun5 @cbGetRoomItem obstr; setPluginInstanceCbDel inst mkfun2 @deleteOb obstr; ); 0;; fun IniPlug(file)= PlugRegister @newOb nil; setPluginEditor @dynamicedit; 0;;