diff options
author | UbitUmarov | 2012-09-22 21:14:15 +0100 |
---|---|---|
committer | UbitUmarov | 2012-09-22 21:14:15 +0100 |
commit | 11e05217df2de7ce7da581a2332ee4871f75a527 (patch) | |
tree | 2ec4e2bdf1d9f85f02089e029832c31b8872f189 | |
parent | removed AssetUploaderWithCost, fixing AssetUploader. add parsing of some (diff) | |
download | opensim-SC-11e05217df2de7ce7da581a2332ee4871f75a527.zip opensim-SC-11e05217df2de7ce7da581a2332ee4871f75a527.tar.gz opensim-SC-11e05217df2de7ce7da581a2332ee4871f75a527.tar.bz2 opensim-SC-11e05217df2de7ce7da581a2332ee4871f75a527.tar.xz |
report asset upload errors the right away
4 files changed, 87 insertions, 29 deletions
diff --git a/OpenSim/Capabilities/LLSDAssetUploadComplete.cs b/OpenSim/Capabilities/LLSDAssetUploadComplete.cs index ab6cee5..596a556 100644 --- a/OpenSim/Capabilities/LLSDAssetUploadComplete.cs +++ b/OpenSim/Capabilities/LLSDAssetUploadComplete.cs | |||
@@ -30,12 +30,14 @@ using OpenMetaverse; | |||
30 | 30 | ||
31 | namespace OpenSim.Framework.Capabilities | 31 | namespace OpenSim.Framework.Capabilities |
32 | { | 32 | { |
33 | |||
33 | [LLSDType("MAP")] | 34 | [LLSDType("MAP")] |
34 | public class LLSDAssetUploadComplete | 35 | public class LLSDAssetUploadComplete |
35 | { | 36 | { |
36 | public string new_asset = String.Empty; | 37 | public string new_asset = String.Empty; |
37 | public UUID new_inventory_item = UUID.Zero; | 38 | public UUID new_inventory_item = UUID.Zero; |
38 | public string state = String.Empty; | 39 | public string state = String.Empty; |
40 | public LLSDAssetUploadError error = null; | ||
39 | //public bool success = false; | 41 | //public bool success = false; |
40 | 42 | ||
41 | public LLSDAssetUploadComplete() | 43 | public LLSDAssetUploadComplete() |
diff --git a/OpenSim/Capabilities/LLSDAssetUploadResponse.cs b/OpenSim/Capabilities/LLSDAssetUploadResponse.cs index 18285b5..7c4bc97 100644 --- a/OpenSim/Capabilities/LLSDAssetUploadResponse.cs +++ b/OpenSim/Capabilities/LLSDAssetUploadResponse.cs | |||
@@ -26,10 +26,18 @@ | |||
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using OpenMetaverse; | ||
29 | 30 | ||
30 | namespace OpenSim.Framework.Capabilities | 31 | namespace OpenSim.Framework.Capabilities |
31 | { | 32 | { |
32 | [OSDMap] | 33 | [OSDMap] |
34 | public class LLSDAssetUploadError | ||
35 | { | ||
36 | public string message = String.Empty; | ||
37 | public UUID identifier = UUID.Zero; | ||
38 | } | ||
39 | |||
40 | [OSDMap] | ||
33 | public class LLSDAssetUploadResponsePricebrkDown | 41 | public class LLSDAssetUploadResponsePricebrkDown |
34 | { | 42 | { |
35 | public int mesh_streaming; | 43 | public int mesh_streaming; |
@@ -56,11 +64,13 @@ namespace OpenSim.Framework.Capabilities | |||
56 | public string state = String.Empty; | 64 | public string state = String.Empty; |
57 | public int upload_price = 0; | 65 | public int upload_price = 0; |
58 | public LLSDAssetUploadResponseData data = null; | 66 | public LLSDAssetUploadResponseData data = null; |
67 | public LLSDAssetUploadError error = null; | ||
59 | public LLSDAssetUploadResponse() | 68 | public LLSDAssetUploadResponse() |
60 | { | 69 | { |
61 | } | 70 | } |
62 | } | 71 | } |
63 | 72 | ||
73 | |||
64 | [OSDMap] | 74 | [OSDMap] |
65 | public class LLSDNewFileAngentInventoryVariablePriceReplyResponse | 75 | public class LLSDNewFileAngentInventoryVariablePriceReplyResponse |
66 | { | 76 | { |
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index b64453a..a934113 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs | |||
@@ -55,7 +55,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
55 | { | 55 | { |
56 | public delegate void UpLoadedAsset( | 56 | public delegate void UpLoadedAsset( |
57 | string assetName, string description, UUID assetID, UUID inventoryItem, UUID parentFolder, | 57 | string assetName, string description, UUID assetID, UUID inventoryItem, UUID parentFolder, |
58 | byte[] data, string inventoryType, string assetType, int cost); | 58 | byte[] data, string inventoryType, string assetType, int cost, ref string error); |
59 | 59 | ||
60 | public delegate UUID UpdateItem(UUID itemID, byte[] data); | 60 | public delegate UUID UpdateItem(UUID itemID, byte[] data); |
61 | 61 | ||
@@ -455,11 +455,14 @@ namespace OpenSim.Region.ClientStack.Linden | |||
455 | { | 455 | { |
456 | case FileAgentInventoryState.processRequest: | 456 | case FileAgentInventoryState.processRequest: |
457 | case FileAgentInventoryState.processUpload: | 457 | case FileAgentInventoryState.processUpload: |
458 | if (client != null) | 458 | LLSDAssetUploadError resperror = new LLSDAssetUploadError(); |
459 | client.SendAgentAlertMessage("Unable to upload asset. Processing previus request", false); | 459 | resperror.message = "Uploader busy processing previus request"; |
460 | resperror.identifier = UUID.Zero; | ||
461 | |||
460 | LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse(); | 462 | LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse(); |
461 | errorResponse.uploader = ""; | 463 | errorResponse.uploader = ""; |
462 | errorResponse.state = "error"; | 464 | errorResponse.state = "error"; |
465 | errorResponse.error = resperror; | ||
463 | return errorResponse; | 466 | return errorResponse; |
464 | break; | 467 | break; |
465 | case FileAgentInventoryState.waitUpload: | 468 | case FileAgentInventoryState.waitUpload: |
@@ -489,12 +492,15 @@ namespace OpenSim.Region.ClientStack.Linden | |||
489 | { | 492 | { |
490 | if (avatar.UserLevel < m_levelUpload) | 493 | if (avatar.UserLevel < m_levelUpload) |
491 | { | 494 | { |
492 | if (client != null) | 495 | LLSDAssetUploadError resperror = new LLSDAssetUploadError(); |
493 | client.SendAgentAlertMessage("Unable to upload asset. Insufficient permissions.", false); | 496 | resperror.message = "Insufficient permissions to upload"; |
497 | resperror.identifier = UUID.Zero; | ||
498 | |||
494 | 499 | ||
495 | LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse(); | 500 | LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse(); |
496 | errorResponse.uploader = ""; | 501 | errorResponse.uploader = ""; |
497 | errorResponse.state = "error"; | 502 | errorResponse.state = "error"; |
503 | errorResponse.error = resperror; | ||
498 | lock (m_ModelCost) | 504 | lock (m_ModelCost) |
499 | m_FileAgentInventoryState = FileAgentInventoryState.idle; | 505 | m_FileAgentInventoryState = FileAgentInventoryState.idle; |
500 | return errorResponse; | 506 | return errorResponse; |
@@ -518,11 +524,15 @@ namespace OpenSim.Region.ClientStack.Linden | |||
518 | if (!m_ModelCost.MeshModelCost(llsdRequest.asset_resources, baseCost, out modelcost, | 524 | if (!m_ModelCost.MeshModelCost(llsdRequest.asset_resources, baseCost, out modelcost, |
519 | meshcostdata, out error)) | 525 | meshcostdata, out error)) |
520 | { | 526 | { |
521 | client.SendAgentAlertMessage(error, false); | 527 | LLSDAssetUploadError resperror = new LLSDAssetUploadError(); |
528 | resperror.message = error; | ||
529 | resperror.identifier = UUID.Zero; | ||
522 | 530 | ||
523 | LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse(); | 531 | LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse(); |
524 | errorResponse.uploader = ""; | 532 | errorResponse.uploader = ""; |
525 | errorResponse.state = "error"; | 533 | errorResponse.state = "error"; |
534 | errorResponse.error = resperror; | ||
535 | |||
526 | lock (m_ModelCost) | 536 | lock (m_ModelCost) |
527 | m_FileAgentInventoryState = FileAgentInventoryState.idle; | 537 | m_FileAgentInventoryState = FileAgentInventoryState.idle; |
528 | return errorResponse; | 538 | return errorResponse; |
@@ -539,11 +549,14 @@ namespace OpenSim.Region.ClientStack.Linden | |||
539 | { | 549 | { |
540 | if (!mm.UploadCovered(client.AgentId, (int)cost)) | 550 | if (!mm.UploadCovered(client.AgentId, (int)cost)) |
541 | { | 551 | { |
542 | client.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false); | 552 | LLSDAssetUploadError resperror = new LLSDAssetUploadError(); |
553 | resperror.message = "Insuficient funds"; | ||
554 | resperror.identifier = UUID.Zero; | ||
543 | 555 | ||
544 | LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse(); | 556 | LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse(); |
545 | errorResponse.uploader = ""; | 557 | errorResponse.uploader = ""; |
546 | errorResponse.state = "error"; | 558 | errorResponse.state = "error"; |
559 | errorResponse.error = resperror; | ||
547 | lock (m_ModelCost) | 560 | lock (m_ModelCost) |
548 | m_FileAgentInventoryState = FileAgentInventoryState.idle; | 561 | m_FileAgentInventoryState = FileAgentInventoryState.idle; |
549 | return errorResponse; | 562 | return errorResponse; |
@@ -607,8 +620,9 @@ namespace OpenSim.Region.ClientStack.Linden | |||
607 | /// <param name="data"></param> | 620 | /// <param name="data"></param> |
608 | public void UploadCompleteHandler(string assetName, string assetDescription, UUID assetID, | 621 | public void UploadCompleteHandler(string assetName, string assetDescription, UUID assetID, |
609 | UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType, | 622 | UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType, |
610 | string assetType, int cost) | 623 | string assetType, int cost, ref string error) |
611 | { | 624 | { |
625 | |||
612 | lock (m_ModelCost) | 626 | lock (m_ModelCost) |
613 | m_FileAgentInventoryState = FileAgentInventoryState.processUpload; | 627 | m_FileAgentInventoryState = FileAgentInventoryState.processUpload; |
614 | 628 | ||
@@ -619,17 +633,13 @@ namespace OpenSim.Region.ClientStack.Linden | |||
619 | sbyte assType = 0; | 633 | sbyte assType = 0; |
620 | sbyte inType = 0; | 634 | sbyte inType = 0; |
621 | 635 | ||
622 | IClientAPI client = null; | ||
623 | |||
624 | IMoneyModule mm = m_Scene.RequestModuleInterface<IMoneyModule>(); | 636 | IMoneyModule mm = m_Scene.RequestModuleInterface<IMoneyModule>(); |
625 | if (mm != null) | 637 | if (mm != null) |
626 | { | 638 | { |
627 | // make sure client still has enougth credit | 639 | // make sure client still has enougth credit |
628 | if (!mm.UploadCovered(m_HostCapsObj.AgentID, (int)cost)) | 640 | if (!mm.UploadCovered(m_HostCapsObj.AgentID, (int)cost)) |
629 | { | 641 | { |
630 | m_Scene.TryGetClient(m_HostCapsObj.AgentID, out client); | 642 | error = "Insufficient funds."; |
631 | if (client != null) | ||
632 | client.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false); | ||
633 | return; | 643 | return; |
634 | } | 644 | } |
635 | } | 645 | } |
@@ -668,6 +678,25 @@ namespace OpenSim.Region.ClientStack.Linden | |||
668 | List<Vector3> positions = new List<Vector3>(); | 678 | List<Vector3> positions = new List<Vector3>(); |
669 | List<Quaternion> rotations = new List<Quaternion>(); | 679 | List<Quaternion> rotations = new List<Quaternion>(); |
670 | OSDMap request = (OSDMap)OSDParser.DeserializeLLSDXml(data); | 680 | OSDMap request = (OSDMap)OSDParser.DeserializeLLSDXml(data); |
681 | |||
682 | // compare and get updated information | ||
683 | |||
684 | bool mismatchError = true; | ||
685 | |||
686 | while (mismatchError) | ||
687 | { | ||
688 | mismatchError = false; | ||
689 | } | ||
690 | |||
691 | if (mismatchError) | ||
692 | { | ||
693 | error = "Upload and fee estimation information don't match"; | ||
694 | lock (m_ModelCost) | ||
695 | m_FileAgentInventoryState = FileAgentInventoryState.idle; | ||
696 | |||
697 | return; | ||
698 | } | ||
699 | |||
671 | OSDArray instance_list = (OSDArray)request["instance_list"]; | 700 | OSDArray instance_list = (OSDArray)request["instance_list"]; |
672 | OSDArray mesh_list = (OSDArray)request["mesh_list"]; | 701 | OSDArray mesh_list = (OSDArray)request["mesh_list"]; |
673 | OSDArray texture_list = (OSDArray)request["texture_list"]; | 702 | OSDArray texture_list = (OSDArray)request["texture_list"]; |
@@ -1240,7 +1269,8 @@ namespace OpenSim.Region.ClientStack.Linden | |||
1240 | private string m_invType = String.Empty; | 1269 | private string m_invType = String.Empty; |
1241 | private string m_assetType = String.Empty; | 1270 | private string m_assetType = String.Empty; |
1242 | private int m_cost; | 1271 | private int m_cost; |
1243 | 1272 | private string m_error = String.Empty; | |
1273 | |||
1244 | private Timer m_timeoutTimer = new Timer(); | 1274 | private Timer m_timeoutTimer = new Timer(); |
1245 | 1275 | ||
1246 | 1276 | ||
@@ -1278,12 +1308,13 @@ namespace OpenSim.Region.ClientStack.Linden | |||
1278 | UUID inv = inventoryItemID; | 1308 | UUID inv = inventoryItemID; |
1279 | string res = String.Empty; | 1309 | string res = String.Empty; |
1280 | LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete(); | 1310 | LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete(); |
1311 | /* | ||
1281 | uploadComplete.new_asset = newAssetID.ToString(); | 1312 | uploadComplete.new_asset = newAssetID.ToString(); |
1282 | uploadComplete.new_inventory_item = inv; | 1313 | uploadComplete.new_inventory_item = inv; |
1283 | uploadComplete.state = "complete"; | 1314 | uploadComplete.state = "complete"; |
1284 | 1315 | ||
1285 | res = LLSDHelpers.SerialiseLLSDReply(uploadComplete); | 1316 | res = LLSDHelpers.SerialiseLLSDReply(uploadComplete); |
1286 | 1317 | */ | |
1287 | m_timeoutTimer.Stop(); | 1318 | m_timeoutTimer.Stop(); |
1288 | httpListener.RemoveStreamHandler("POST", uploaderPath); | 1319 | httpListener.RemoveStreamHandler("POST", uploaderPath); |
1289 | 1320 | ||
@@ -1301,8 +1332,25 @@ namespace OpenSim.Region.ClientStack.Linden | |||
1301 | handlerUpLoad = OnUpLoad; | 1332 | handlerUpLoad = OnUpLoad; |
1302 | if (handlerUpLoad != null) | 1333 | if (handlerUpLoad != null) |
1303 | { | 1334 | { |
1304 | handlerUpLoad(m_assetName, m_assetDes, newAssetID, inv, parentFolder, data, m_invType, m_assetType,m_cost); | 1335 | handlerUpLoad(m_assetName, m_assetDes, newAssetID, inv, parentFolder, data, m_invType, m_assetType,m_cost, ref m_error); |
1305 | } | 1336 | } |
1337 | if(m_error == String.Empty) | ||
1338 | { | ||
1339 | uploadComplete.new_asset = newAssetID.ToString(); | ||
1340 | uploadComplete.new_inventory_item = inv; | ||
1341 | uploadComplete.state = "complete"; | ||
1342 | } | ||
1343 | else | ||
1344 | { | ||
1345 | LLSDAssetUploadError resperror = new LLSDAssetUploadError(); | ||
1346 | resperror.message = m_error; | ||
1347 | resperror.identifier = inv; | ||
1348 | |||
1349 | uploadComplete.error = resperror; | ||
1350 | uploadComplete.state = "failed"; | ||
1351 | } | ||
1352 | |||
1353 | res = LLSDHelpers.SerialiseLLSDReply(uploadComplete); | ||
1306 | return res; | 1354 | return res; |
1307 | } | 1355 | } |
1308 | 1356 | ||
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/MeshCost.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/MeshCost.cs index 830c46d..7a80c72 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/MeshCost.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/MeshCost.cs | |||
@@ -105,7 +105,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
105 | resources.instance_list == null || | 105 | resources.instance_list == null || |
106 | resources.instance_list.Array.Count == 0) | 106 | resources.instance_list.Array.Count == 0) |
107 | { | 107 | { |
108 | error = "Unable to upload mesh model. missing information."; | 108 | error = "missing model information."; |
109 | return false; | 109 | return false; |
110 | } | 110 | } |
111 | 111 | ||
@@ -113,7 +113,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
113 | 113 | ||
114 | if( numberInstances > ObjectLinkedPartsMax ) | 114 | if( numberInstances > ObjectLinkedPartsMax ) |
115 | { | 115 | { |
116 | error = "upload failed: Model whould have two many linked prims"; | 116 | error = "Model whould have more than " + ObjectLinkedPartsMax.ToString() + " linked prims"; |
117 | return false; | 117 | return false; |
118 | } | 118 | } |
119 | 119 | ||
@@ -186,15 +186,13 @@ namespace OpenSim.Region.ClientStack.Linden | |||
186 | 186 | ||
187 | if (scale.X < PrimScaleMin || scale.Y < PrimScaleMin || scale.Z < PrimScaleMin) | 187 | if (scale.X < PrimScaleMin || scale.Y < PrimScaleMin || scale.Z < PrimScaleMin) |
188 | { | 188 | { |
189 | // error = " upload fail: Model contains parts with a dimension lower than 0.001. Please adjust scaling"; | ||
190 | // return false; | ||
191 | skipedSmall++; | 189 | skipedSmall++; |
192 | continue; | 190 | continue; |
193 | } | 191 | } |
194 | 192 | ||
195 | if (scale.X > NonPhysicalPrimScaleMax || scale.Y > NonPhysicalPrimScaleMax || scale.Z > NonPhysicalPrimScaleMax) | 193 | if (scale.X > NonPhysicalPrimScaleMax || scale.Y > NonPhysicalPrimScaleMax || scale.Z > NonPhysicalPrimScaleMax) |
196 | { | 194 | { |
197 | error = "upload fail: Model contains parts larger than maximum allowed. Please adjust scaling"; | 195 | error = "Model contains parts with sides larger than " + NonPhysicalPrimScaleMax.ToString() + "m. Please ajust scale"; |
198 | return false; | 196 | return false; |
199 | } | 197 | } |
200 | 198 | ||
@@ -204,7 +202,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
204 | 202 | ||
205 | if (mesh >= numberMeshs) | 203 | if (mesh >= numberMeshs) |
206 | { | 204 | { |
207 | error = "Unable to upload mesh model. incoerent information."; | 205 | error = "Incoerent model information."; |
208 | return false; | 206 | return false; |
209 | } | 207 | } |
210 | 208 | ||
@@ -233,7 +231,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
233 | 231 | ||
234 | if (skipedSmall >0 && skipedSmall > numberInstances / 2) | 232 | if (skipedSmall >0 && skipedSmall > numberInstances / 2) |
235 | { | 233 | { |
236 | error = "Upload failed: Model contains too much prims smaller than minimum size to ignore"; | 234 | error = "Model contains too many prims smaller than " + PrimScaleMin.ToString() + "m"; |
237 | return false; | 235 | return false; |
238 | } | 236 | } |
239 | 237 | ||
@@ -279,14 +277,14 @@ namespace OpenSim.Region.ClientStack.Linden | |||
279 | 277 | ||
280 | if (data == null || data.Length == 0) | 278 | if (data == null || data.Length == 0) |
281 | { | 279 | { |
282 | error = "Unable to upload mesh model. missing information."; | 280 | error = "Missing model information."; |
283 | return false; | 281 | return false; |
284 | } | 282 | } |
285 | 283 | ||
286 | OSD meshOsd = null; | 284 | OSD meshOsd = null; |
287 | int start = 0; | 285 | int start = 0; |
288 | 286 | ||
289 | error = "Unable to upload mesh model. Invalid data"; | 287 | error = "Invalid model data"; |
290 | 288 | ||
291 | using (MemoryStream ms = new MemoryStream(data)) | 289 | using (MemoryStream ms = new MemoryStream(data)) |
292 | { | 290 | { |
@@ -334,13 +332,13 @@ namespace OpenSim.Region.ClientStack.Linden | |||
334 | 332 | ||
335 | if (submesh_offset < 0 || hulls_size == 0) | 333 | if (submesh_offset < 0 || hulls_size == 0) |
336 | { | 334 | { |
337 | error = "Unable to upload mesh model. missing physics_convex block"; | 335 | error = "Missing physics_convex block"; |
338 | return false; | 336 | return false; |
339 | } | 337 | } |
340 | 338 | ||
341 | if (!hulls(data, submesh_offset, hulls_size, out phys_hullsvertices, out phys_nhulls)) | 339 | if (!hulls(data, submesh_offset, hulls_size, out phys_hullsvertices, out phys_nhulls)) |
342 | { | 340 | { |
343 | error = "Unable to upload mesh model. bad physics_convex block"; | 341 | error = "Bad physics_convex block"; |
344 | return false; | 342 | return false; |
345 | } | 343 | } |
346 | 344 | ||
@@ -360,7 +358,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
360 | 358 | ||
361 | if (submesh_offset < 0 || highlod_size <= 0) | 359 | if (submesh_offset < 0 || highlod_size <= 0) |
362 | { | 360 | { |
363 | error = "Unable to upload mesh model. missing high_lod"; | 361 | error = "Missing high_lod block"; |
364 | return false; | 362 | return false; |
365 | } | 363 | } |
366 | 364 | ||
@@ -418,7 +416,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
418 | 416 | ||
419 | if (!submesh(data, submesh_offset, physmesh_size, out phys_ntriangles)) | 417 | if (!submesh(data, submesh_offset, physmesh_size, out phys_ntriangles)) |
420 | { | 418 | { |
421 | error = "Unable to upload mesh model. parsing error"; | 419 | error = "Model data parsing error"; |
422 | return false; | 420 | return false; |
423 | } | 421 | } |
424 | } | 422 | } |