OpenSim
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros
AgentCircuitDataTest.cs
Go to the documentation of this file.
1 /*
2  * Copyright (c) Contributors, http://opensimulator.org/
3  * See CONTRIBUTORS.TXT for a full list of copyright holders.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of the OpenSimulator Project nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 using System.Collections.Generic;
29 using OpenMetaverse;
30 using OpenMetaverse.StructuredData;
31 using NUnit.Framework;
32 using OpenSim.Tests.Common;
33 
34 namespace OpenSim.Framework.Tests
35 {
36  [TestFixture]
38  {
39  private UUID AgentId;
40  private AvatarAppearance AvAppearance;
41  private byte[] VisualParams;
42  private UUID BaseFolder;
43  private string CapsPath;
44  private Dictionary<ulong, string> ChildrenCapsPaths;
45  private uint circuitcode = 0949030;
46  private string firstname;
47  private string lastname;
48  private UUID SecureSessionId;
49  private UUID SessionId;
50  private Vector3 StartPos;
51 
52 
53  [SetUp]
54  public void setup()
55  {
56  AgentId = UUID.Random();
57  BaseFolder = UUID.Random();
58  CapsPath = "http://www.opensimulator.org/Caps/Foo";
59  ChildrenCapsPaths = new Dictionary<ulong, string>();
60  ChildrenCapsPaths.Add(ulong.MaxValue, "http://www.opensimulator.org/Caps/Foo2");
61  firstname = "CoolAvatarTest";
62  lastname = "test";
63  StartPos = new Vector3(5,23,125);
64 
65  SecureSessionId = UUID.Random();
66  SessionId = UUID.Random();
67 
68  AvAppearance = new AvatarAppearance();
69  VisualParams = new byte[218];
70 
71  //body
72  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HEIGHT] = 155;
73  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_THICKNESS] = 00;
74  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BODY_FAT] = 0;
75 
76  //Torso
77  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_TORSO_MUSCLES] = 48;
78  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_NECK_THICKNESS] = 43;
79  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_NECK_LENGTH] = 255;
80  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_SHOULDERS] = 94;
81  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_CHEST_MALE_NO_PECS] = 199;
82  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_ARM_LENGTH] = 255;
83  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HAND_SIZE] = 33;
84  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_TORSO_LENGTH] = 240;
85  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_LOVE_HANDLES] = 0;
86  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BELLY_SIZE] = 0;
87 
88  // legs
89  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_LEG_MUSCLES] = 82;
90  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_LEG_LENGTH] = 255;
91  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HIP_WIDTH] = 84;
92  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HIP_LENGTH] = 166;
93  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BUTT_SIZE] = 64;
94  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_SADDLEBAGS] = 89;
95  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BOWED_LEGS] = 127;
96  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_FOOT_SIZE] = 45;
97 
98 
99  // head
100  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HEAD_SIZE] = 255;
101  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_SQUASH_STRETCH_HEAD] = 0; // head stretch
102  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HEAD_SHAPE] = 155;
103  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_EGG_HEAD] = 127;
104  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_POINTY_EARS] = 255;
105  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HEAD_LENGTH] = 45;
106  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_FACE_SHEAR] = 127;
107  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_FOREHEAD_ANGLE] = 104;
108  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BIG_BROW] = 94;
109  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_PUFFY_UPPER_CHEEKS] = 0; // upper cheeks
110  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_DOUBLE_CHIN] = 122; // lower cheeks
111  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HIGH_CHEEK_BONES] = 130;
112 
113 
114 
115  // eyes
116  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_EYE_SIZE] = 105;
117  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_WIDE_EYES] = 135;
118  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_EYE_SPACING] = 184;
119  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_EYELID_CORNER_UP] = 230;
120  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_EYELID_INNER_CORNER_UP] = 120;
121  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_EYE_DEPTH] = 158;
122  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_UPPER_EYELID_FOLD] = 69;
123  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BAGGY_EYES] = 38;
124  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_EYELASHES_LONG] = 127;
125  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_POP_EYE] = 127;
126 
127  VisualParams[(int)AvatarAppearance.VPElement.EYES_EYE_COLOR] = 25;
128  VisualParams[(int)AvatarAppearance.VPElement.EYES_EYE_LIGHTNESS] = 127;
129 
130  // ears
131  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BIG_EARS] = 255;
132  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_EARS_OUT] = 127;
133  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_ATTACHED_EARLOBES] = 127;
134  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_POINTY_EARS] = 255;
135 
136  // nose
137  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_NOSE_BIG_OUT] = 79;
138  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_WIDE_NOSE] = 35;
139  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BROAD_NOSTRILS] = 86;
140  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_LOW_SEPTUM_NOSE] = 112; // nostril division
141  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BULBOUS_NOSE] = 25;
142  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_NOBLE_NOSE_BRIDGE] = 25; // upper bridge
143  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_LOWER_BRIDGE_NOSE] = 25; // lower bridge
144  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_WIDE_NOSE_BRIDGE] = 25;
145  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_UPTURNED_NOSE_TIP] = 107;
146  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BULBOUS_NOSE_TIP] = 25;
147  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_CROOKED_NOSE] = 127;
148 
149 
150  // Mouth
151  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_LIP_WIDTH] = 122;
152  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_TALL_LIPS] = 10; // lip fullness
153  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_LIP_THICKNESS] = 112;
154  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_LIP_RATIO] = 137;
155  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_MOUTH_HEIGHT] = 176;
156  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_MOUTH_CORNER] = 140; // Sad --> happy
157  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_LIP_CLEFT_DEEP] = 84;
158  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_WIDE_LIP_CLEFT] = 84;
159  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_SHIFT_MOUTH] = 127;
160 
161 
162  // chin
163  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_WEAK_CHIN] = 119;
164  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_SQUARE_JAW] = 5;
165  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_DEEP_CHIN] = 132;
166  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_JAW_ANGLE] = 153;
167  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_JAW_JUT] = 100;
168  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_JOWLS] = 38;
169  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_CLEFT_CHIN] = 89;
170  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_CLEFT_CHIN_UPPER] = 89;
171  VisualParams[(int)AvatarAppearance.VPElement.SHAPE_DOUBLE_CHIN] = 0;
172 
173 
174  // hair color
175  VisualParams[(int)AvatarAppearance.VPElement.HAIR_WHITE_HAIR] = 0;
176  VisualParams[(int)AvatarAppearance.VPElement.HAIR_RAINBOW_COLOR_39] = 0;
177  VisualParams[(int)AvatarAppearance.VPElement.HAIR_BLONDE_HAIR] = 24;
178  VisualParams[(int)AvatarAppearance.VPElement.HAIR_RED_HAIR] = 0;
179 
180  // hair style
181  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_VOLUME] = 160;
182  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_FRONT] = 153;
183  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_SIDES] = 153;
184  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_BACK] = 170;
185  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_BIG_FRONT] = 0;
186  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_BIG_TOP] = 117;
187  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_BIG_BACK] = 170;
188  VisualParams[(int)AvatarAppearance.VPElement.HAIR_FRONT_FRINGE] = 0;
189  VisualParams[(int)AvatarAppearance.VPElement.HAIR_SIDE_FRINGE] = 142;
190  VisualParams[(int)AvatarAppearance.VPElement.HAIR_BACK_FRINGE] = 0;
191  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_SIDES_FULL] = 146;
192  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_SWEEP] = 0;
193  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_SHEAR_FRONT] = 0;
194  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_SHEAR_BACK] = 0;
195  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_TAPER_FRONT] = 0;
196  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_TAPER_BACK] = 0;
197  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_RUMPLED] = 0;
198  VisualParams[(int)AvatarAppearance.VPElement.HAIR_PIGTAILS] = 0;
199  VisualParams[(int)AvatarAppearance.VPElement.HAIR_PONYTAIL] = 0;
200  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_SPIKED] = 0;
201  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_TILT] = 0;
202  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_PART_MIDDLE] = 0;
203  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_PART_RIGHT] = 0;
204  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_PART_LEFT] = 0;
205  VisualParams[(int)AvatarAppearance.VPElement.HAIR_BANGS_PART_MIDDLE] = 155;
206 
207  //Eyebrows
208  VisualParams[(int)AvatarAppearance.VPElement.HAIR_EYEBROW_SIZE] = 20;
209  VisualParams[(int)AvatarAppearance.VPElement.HAIR_EYEBROW_DENSITY] = 140;
210  VisualParams[(int)AvatarAppearance.VPElement.HAIR_LOWER_EYEBROWS] = 200; // eyebrow height
211  VisualParams[(int)AvatarAppearance.VPElement.HAIR_ARCED_EYEBROWS] = 124;
212  VisualParams[(int)AvatarAppearance.VPElement.HAIR_POINTY_EYEBROWS] = 65;
213 
214  //Facial hair
215  VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_THICKNESS] = 65;
216  VisualParams[(int)AvatarAppearance.VPElement.HAIR_SIDEBURNS] = 235;
217  VisualParams[(int)AvatarAppearance.VPElement.HAIR_MOUSTACHE] = 75;
218  VisualParams[(int)AvatarAppearance.VPElement.HAIR_CHIN_CURTAINS] = 140;
219  VisualParams[(int)AvatarAppearance.VPElement.HAIR_SOULPATCH] = 0;
220 
221  AvAppearance.VisualParams = VisualParams;
222 
223  List<byte> wearbyte = new List<byte>();
224  for (int i = 0; i < VisualParams.Length; i++)
225  {
226  wearbyte.Add(VisualParams[i]);
227  }
228 
229  AvAppearance.SetAppearance(AvAppearance.Texture, (byte[])VisualParams.Clone());
230  }
231 
238  [Test]
240  {
241  string oldSerialization = "{\"agent_id\":\"522675bd-8214-40c1-b3ca-9c7f7fd170be\",\"base_folder\":\"c40b5f5f-476f-496b-bd69-b5a539c434d8\",\"caps_path\":\"http://www.opensimulator.org/Caps/Foo\",\"children_seeds\":[{\"handle\":\"18446744073709551615\",\"seed\":\"http://www.opensimulator.org/Caps/Foo2\"}],\"child\":false,\"circuit_code\":\"949030\",\"first_name\":\"CoolAvatarTest\",\"last_name\":\"test\",\"inventory_folder\":\"c40b5f5f-476f-496b-bd69-b5a539c434d8\",\"secure_session_id\":\"1e608e2b-0ddb-41f6-be0f-926f61cd3e0a\",\"session_id\":\"aa06f798-9d70-4bdb-9bbf-012a02ee2baf\",\"start_pos\":\"<5, 23, 125>\"}";
242  AgentCircuitData Agent1Data = new AgentCircuitData();
243  Agent1Data.AgentID = new UUID("522675bd-8214-40c1-b3ca-9c7f7fd170be");
244  Agent1Data.Appearance = AvAppearance;
245  Agent1Data.BaseFolder = new UUID("c40b5f5f-476f-496b-bd69-b5a539c434d8");
246  Agent1Data.CapsPath = CapsPath;
247  Agent1Data.child = false;
248  Agent1Data.ChildrenCapSeeds = ChildrenCapsPaths;
249  Agent1Data.circuitcode = circuitcode;
250  Agent1Data.firstname = firstname;
251  Agent1Data.InventoryFolder = new UUID("c40b5f5f-476f-496b-bd69-b5a539c434d8");
252  Agent1Data.lastname = lastname;
253  Agent1Data.SecureSessionID = new UUID("1e608e2b-0ddb-41f6-be0f-926f61cd3e0a");
254  Agent1Data.SessionID = new UUID("aa06f798-9d70-4bdb-9bbf-012a02ee2baf");
255  Agent1Data.startpos = StartPos;
256 
257 
258  OSDMap map2;
259  try
260  {
261  map2 = (OSDMap) OSDParser.DeserializeJson(oldSerialization);
262 
263 
264  AgentCircuitData Agent2Data = new AgentCircuitData();
265  Agent2Data.UnpackAgentCircuitData(map2);
266 
267  Assert.That((Agent1Data.AgentID == Agent2Data.AgentID));
268  Assert.That((Agent1Data.BaseFolder == Agent2Data.BaseFolder));
269 
270  Assert.That((Agent1Data.CapsPath == Agent2Data.CapsPath));
271  Assert.That((Agent1Data.child == Agent2Data.child));
272  Assert.That((Agent1Data.ChildrenCapSeeds.Count == Agent2Data.ChildrenCapSeeds.Count));
273  Assert.That((Agent1Data.circuitcode == Agent2Data.circuitcode));
274  Assert.That((Agent1Data.firstname == Agent2Data.firstname));
275  Assert.That((Agent1Data.InventoryFolder == Agent2Data.InventoryFolder));
276  Assert.That((Agent1Data.lastname == Agent2Data.lastname));
277  Assert.That((Agent1Data.SecureSessionID == Agent2Data.SecureSessionID));
278  Assert.That((Agent1Data.SessionID == Agent2Data.SessionID));
279  Assert.That((Agent1Data.startpos == Agent2Data.startpos));
280  }
281  catch (LitJson.JsonException)
282  {
283  //intermittant litjson errors :P
284  Assert.That(1 == 1);
285  }
286  /*
287  Enable this once VisualParams go in the packing method
288  for (int i=0;i<208;i++)
289  Assert.That((Agent1Data.Appearance.VisualParams[i] == Agent2Data.Appearance.VisualParams[i]));
290  */
291  }
292 
296  [Test]
298  {
299  AgentCircuitData Agent1Data = new AgentCircuitData();
300  Agent1Data.AgentID = AgentId;
301  Agent1Data.Appearance = AvAppearance;
302  Agent1Data.BaseFolder = BaseFolder;
303  Agent1Data.CapsPath = CapsPath;
304  Agent1Data.child = false;
305  Agent1Data.ChildrenCapSeeds = ChildrenCapsPaths;
306  Agent1Data.circuitcode = circuitcode;
307  Agent1Data.firstname = firstname;
308  Agent1Data.InventoryFolder = BaseFolder;
309  Agent1Data.lastname = lastname;
310  Agent1Data.SecureSessionID = SecureSessionId;
311  Agent1Data.SessionID = SessionId;
312  Agent1Data.startpos = StartPos;
313 
315  OSDMap map2;
316  OSDMap map = Agent1Data.PackAgentCircuitData(ctx);
317  try
318  {
319  string str = OSDParser.SerializeJsonString(map);
320  //System.Console.WriteLine(str);
321  map2 = (OSDMap) OSDParser.DeserializeJson(str);
322  }
323  catch (System.NullReferenceException)
324  {
325  //spurious litjson errors :P
326  map2 = map;
327  Assert.That(1==1);
328  return;
329  }
330 
331  AgentCircuitData Agent2Data = new AgentCircuitData();
332  Agent2Data.UnpackAgentCircuitData(map2);
333 
334  Assert.That((Agent1Data.AgentID == Agent2Data.AgentID));
335  Assert.That((Agent1Data.BaseFolder == Agent2Data.BaseFolder));
336 
337  Assert.That((Agent1Data.CapsPath == Agent2Data.CapsPath));
338  Assert.That((Agent1Data.child == Agent2Data.child));
339  Assert.That((Agent1Data.ChildrenCapSeeds.Count == Agent2Data.ChildrenCapSeeds.Count));
340  Assert.That((Agent1Data.circuitcode == Agent2Data.circuitcode));
341  Assert.That((Agent1Data.firstname == Agent2Data.firstname));
342  Assert.That((Agent1Data.InventoryFolder == Agent2Data.InventoryFolder));
343  Assert.That((Agent1Data.lastname == Agent2Data.lastname));
344  Assert.That((Agent1Data.SecureSessionID == Agent2Data.SecureSessionID));
345  Assert.That((Agent1Data.SessionID == Agent2Data.SessionID));
346  Assert.That((Agent1Data.startpos == Agent2Data.startpos));
347 
348  /*
349  Enable this once VisualParams go in the packing method
350  for (int i = 0; i < 208; i++)
351  Assert.That((Agent1Data.Appearance.VisualParams[i] == Agent2Data.Appearance.VisualParams[i]));
352  */
353 
354 
355  }
356  }
357 }
void TestAgentCircuitDataOSDConversion()
Test to ensure that the packing and unpacking methods work.
Contains the Avatar's Appearance and methods to manipulate the appearance.
OpenMetaverse.StructuredData.OSDMap OSDMap
Circuit data for an agent. Connection information shared between regions that accept UDP connections ...
Interactive OpenSim region server
Definition: OpenSim.cs:55
void HistoricalAgentCircuitDataOSDConversion()
Test to ensure that the serialization format is the same and the underlying types don't change withou...
VPElement
Viewer Params Array Element for AgentSetAppearance Generated from LibOMV's Visual Params list ...