diff options
Diffstat (limited to 'OpenSim/Region/ClientStack/Linden')
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/MeshCost.cs | 79 |
1 files changed, 41 insertions, 38 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/MeshCost.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/MeshCost.cs index 622a2d9..ba73a25 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/MeshCost.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/MeshCost.cs | |||
@@ -42,7 +42,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
42 | const float physMeshSizeWth = 6f; // counts 7x | 42 | const float physMeshSizeWth = 6f; // counts 7x |
43 | const float physHullSizeWth = 8f; // counts 9x | 43 | const float physHullSizeWth = 8f; // counts 9x |
44 | 44 | ||
45 | // stream cost size factors | 45 | // stream cost area factors |
46 | const float highLodFactor = 17.36f; | 46 | const float highLodFactor = 17.36f; |
47 | const float midLodFactor = 277.78f; | 47 | const float midLodFactor = 277.78f; |
48 | const float lowLodFactor = 1111.11f; | 48 | const float lowLodFactor = 1111.11f; |
@@ -94,13 +94,12 @@ namespace OpenSim.Region.ClientStack.Linden | |||
94 | totalcost += textures_cost; | 94 | totalcost += textures_cost; |
95 | } | 95 | } |
96 | 96 | ||
97 | float meshsfee = 0; | ||
98 | |||
99 | // meshs assets cost | 97 | // meshs assets cost |
100 | 98 | float meshsfee = 0; | |
101 | int numberMeshs = 0; | 99 | int numberMeshs = 0; |
100 | bool haveMeshs = false; | ||
102 | List<ameshCostParam> meshsCosts = new List<ameshCostParam>(); | 101 | List<ameshCostParam> meshsCosts = new List<ameshCostParam>(); |
103 | // a model could have no mesh actually | 102 | |
104 | if (resources.mesh_list != null && resources.mesh_list.Array.Count > 0) | 103 | if (resources.mesh_list != null && resources.mesh_list.Array.Count > 0) |
105 | { | 104 | { |
106 | numberMeshs = resources.mesh_list.Array.Count; | 105 | numberMeshs = resources.mesh_list.Array.Count; |
@@ -117,6 +116,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
117 | meshsCosts.Add(curCost); | 116 | meshsCosts.Add(curCost); |
118 | meshsfee += curCost.costFee; | 117 | meshsfee += curCost.costFee; |
119 | } | 118 | } |
119 | haveMeshs = true; | ||
120 | } | 120 | } |
121 | 121 | ||
122 | // instances (prims) cost | 122 | // instances (prims) cost |
@@ -126,44 +126,43 @@ namespace OpenSim.Region.ClientStack.Linden | |||
126 | { | 126 | { |
127 | Hashtable inst = (Hashtable)resources.instance_list.Array[i]; | 127 | Hashtable inst = (Hashtable)resources.instance_list.Array[i]; |
128 | 128 | ||
129 | // streamming cost | 129 | if (haveMeshs && inst.ContainsKey("mesh")) |
130 | // assume all instances have a mesh | ||
131 | // but in general they can have normal prims | ||
132 | // but for now that seems not suported | ||
133 | // when they do, we will need to inspect pbs information | ||
134 | // and have cost funtions for all prims types | ||
135 | // don't check for shape type none, since | ||
136 | // that could be used to upload meshs with low cost | ||
137 | // changing later inworld | ||
138 | |||
139 | ArrayList ascale = (ArrayList)inst["scale"]; | ||
140 | Vector3 scale; | ||
141 | double tmp; | ||
142 | tmp = (double)ascale[0]; | ||
143 | scale.X = (float)tmp; | ||
144 | tmp = (double)ascale[1]; | ||
145 | scale.Y = (float)tmp; | ||
146 | tmp = (double)ascale[2]; | ||
147 | scale.Z = (float)tmp; | ||
148 | |||
149 | float sqdiam = scale.LengthSquared(); | ||
150 | |||
151 | mesh = (int)inst["mesh"]; | ||
152 | |||
153 | if(mesh >= numberMeshs) | ||
154 | { | 130 | { |
155 | error = "Unable to upload mesh model. incoerent information."; | 131 | mesh = (int)inst["mesh"]; |
156 | return false; | ||
157 | } | ||
158 | 132 | ||
159 | ameshCostParam curCost = meshsCosts[mesh]; | 133 | if (mesh >= numberMeshs) |
160 | float mesh_streaming = streamingCost(curCost, sqdiam); | 134 | { |
135 | error = "Unable to upload mesh model. incoerent information."; | ||
136 | return false; | ||
137 | } | ||
138 | |||
139 | // streamming cost | ||
140 | ArrayList ascale = (ArrayList)inst["scale"]; | ||
141 | Vector3 scale; | ||
142 | double tmp; | ||
143 | tmp = (double)ascale[0]; | ||
144 | scale.X = (float)tmp; | ||
145 | tmp = (double)ascale[1]; | ||
146 | scale.Y = (float)tmp; | ||
147 | tmp = (double)ascale[2]; | ||
148 | scale.Z = (float)tmp; | ||
161 | 149 | ||
162 | meshcostdata.model_streaming_cost += mesh_streaming; | 150 | float sqdiam = scale.LengthSquared(); |
163 | 151 | ||
164 | meshcostdata.physics_cost += curCost.physicsCost; | 152 | ameshCostParam curCost = meshsCosts[mesh]; |
153 | float mesh_streaming = streamingCost(curCost, sqdiam); | ||
154 | |||
155 | meshcostdata.model_streaming_cost += mesh_streaming; | ||
156 | meshcostdata.physics_cost += curCost.physicsCost; | ||
157 | } | ||
158 | else // instance as no mesh ?? | ||
159 | { | ||
160 | // to do later if needed | ||
161 | meshcostdata.model_streaming_cost += 0.5f; | ||
162 | meshcostdata.physics_cost += 1.0f; | ||
163 | } | ||
165 | 164 | ||
166 | // unscripted and static prim server cost | 165 | // assume unscripted and static prim server cost |
167 | meshcostdata.simulation_cost += 0.5f; | 166 | meshcostdata.simulation_cost += 0.5f; |
168 | // charge for prims creation | 167 | // charge for prims creation |
169 | meshsfee += primCreationCost; | 168 | meshsfee += primCreationCost; |
@@ -174,6 +173,10 @@ namespace OpenSim.Region.ClientStack.Linden | |||
174 | else | 173 | else |
175 | meshcostdata.resource_cost = meshcostdata.physics_cost; | 174 | meshcostdata.resource_cost = meshcostdata.physics_cost; |
176 | 175 | ||
176 | if (meshcostdata.resource_cost < meshcostdata.simulation_cost) | ||
177 | meshcostdata.resource_cost = meshcostdata.simulation_cost; | ||
178 | |||
179 | |||
177 | if (meshsfee < ModelMinCost) | 180 | if (meshsfee < ModelMinCost) |
178 | meshsfee = ModelMinCost; | 181 | meshsfee = ModelMinCost; |
179 | 182 | ||