Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ DrawInstancedPrimitives()

unsafe void Microsoft.Xna.Framework.Graphics.GraphicsDevice.DrawInstancedPrimitives ( PrimitiveType primitiveType,
int baseVertex,
int minVertexIndex,
int numVertices,
int startIndex,
int primitiveCount,
int instanceCount )
inline

Definition at line 1348 of file GraphicsDevice.cs.

1349 {
1350 IntPtr intPtr = (IntPtr)pComPtr;
1351 Helpers.CheckDisposed(this, intPtr);
1352 if (numVertices <= 0)
1353 {
1354 throw new ArgumentOutOfRangeException("numVertices", FrameworkResources.NumberVerticesMustBeGreaterZero);
1355 }
1356 if (primitiveCount <= 0)
1357 {
1358 throw new ArgumentOutOfRangeException("primitiveCount", FrameworkResources.MustDrawSomething);
1359 }
1360 int maxPrimitiveCount = _profileCapabilities.MaxPrimitiveCount;
1361 if (primitiveCount > maxPrimitiveCount)
1362 {
1363 _profileCapabilities.ThrowNotSupportedException(FrameworkResources.ProfileMaxPrimitiveCount, maxPrimitiveCount);
1364 }
1365 if (instanceCount <= 0)
1366 {
1367 throw new ArgumentOutOfRangeException("instanceCount", FrameworkResources.MustDrawSomething);
1368 }
1369 maxPrimitiveCount = _profileCapabilities.MaxPrimitiveCount;
1370 if (instanceCount > maxPrimitiveCount)
1371 {
1372 _profileCapabilities.ThrowNotSupportedException(FrameworkResources.ProfileMaxPrimitiveCount, maxPrimitiveCount);
1373 }
1374 VerifyCanDraw(bUserPrimitives: false, bIndexedPrimitives: true);
1375 int num = instanceStreamMask;
1376 bool flag = num == 0;
1377 bool flag2 = num == (1 << currentVertexBufferCount) - 1;
1378 if (!flag && !flag2)
1379 {
1380 _D3DPRIMITIVETYPE d3DPRIMITIVETYPE = _003CModule_003E.ConvertXnaPrimitiveTypeToDx(primitiveType);
1381 if (!_insideScene)
1382 {
1383 IDirect3DDevice9* intPtr2 = pComPtr;
1384 ((delegate* unmanaged[Stdcall, Stdcall]<IntPtr, int>)(int)(*(uint*)(*(int*)intPtr2 + 164)))((nint)intPtr2);
1385 _insideScene = true;
1386 }
1387 if ((uint)(*(int*)((byte*)pStateTracker + 20)) >= 768u)
1388 {
1389 try
1390 {
1391 for (int i = 0; i < currentVertexBufferCount; i++)
1392 {
1393 uint num2 = 1073741823u;
1394 uint instanceFrequency = (uint)currentVertexBuffers[i]._instanceFrequency;
1395 uint num3 = ((instanceFrequency == 0) ? ((uint)instanceCount | 0x40000000u) : (((instanceFrequency >= 1073741823) ? 1073741823u : instanceFrequency) | 0x80000000u));
1396 IDirect3DDevice9* ptr = pComPtr;
1397 int num4 = ((delegate* unmanaged[Stdcall, Stdcall]<IntPtr, uint, uint, int>)(int)(*(uint*)(*(int*)ptr + 408)))((nint)ptr, (uint)i, num3);
1398 if (num4 < 0)
1399 {
1400 throw GraphicsHelpers.GetExceptionFromResult((uint)num4);
1401 }
1402 }
1403 IDirect3DDevice9* ptr2 = pComPtr;
1404 int num5 = ((delegate* unmanaged[Stdcall, Stdcall]<IntPtr, _D3DPRIMITIVETYPE, int, uint, uint, uint, uint, int>)(int)(*(uint*)(*(int*)ptr2 + 328)))((nint)ptr2, d3DPRIMITIVETYPE, baseVertex, (uint)minVertexIndex, (uint)numVertices, (uint)startIndex, (uint)primitiveCount);
1405 if (num5 < 0)
1406 {
1407 throw GraphicsHelpers.GetExceptionFromResult((uint)num5);
1408 }
1409 return;
1410 }
1411 finally
1412 {
1413 int num6 = 0;
1415 {
1416 do
1417 {
1418 IDirect3DDevice9* ptr3 = pComPtr;
1419 ((delegate* unmanaged[Stdcall, Stdcall]<IntPtr, uint, uint, int>)(int)(*(uint*)(*(int*)ptr3 + 408)))((nint)ptr3, (uint)num6, 1u);
1420 num6++;
1421 }
1422 while (num6 < currentVertexBufferCount);
1423 }
1424 }
1425 }
1426 int num7 = 0;
1427 int num8 = 0;
1428 System.Runtime.CompilerServices.Unsafe.SkipInit(out _0024ArrayType_0024_0024_0024BY0BA_0040H _0024ArrayType_0024_0024_0024BY0BA_0040H);
1429 System.Runtime.CompilerServices.Unsafe.SkipInit(out _0024ArrayType_0024_0024_0024BY0BA_0040I _0024ArrayType_0024_0024_0024BY0BA_0040I);
1430 System.Runtime.CompilerServices.Unsafe.SkipInit(out _0024ArrayType_0024_0024_0024BY0BA_0040I _0024ArrayType_0024_0024_0024BY0BA_0040I2);
1431 System.Runtime.CompilerServices.Unsafe.SkipInit(out _0024ArrayType_0024_0024_0024BY0BA_0040I _0024ArrayType_0024_0024_0024BY0BA_0040I3);
1432 System.Runtime.CompilerServices.Unsafe.SkipInit(out _0024ArrayType_0024_0024_0024BY0BA_0040PAUIDirect3DVertexBuffer9_0040_0040 _0024ArrayType_0024_0024_0024BY0BA_0040PAUIDirect3DVertexBuffer9_0040_0040);
1434 {
1435 do
1436 {
1437 if (num8 < 16)
1438 {
1439 if ((instanceStreamMask & (1 << num8)) != 0)
1440 {
1441 *(int*)((ref *(_003F*)(num7 * 4)) + (ref *(_003F*)(&_0024ArrayType_0024_0024_0024BY0BA_0040H))) = num8;
1442 VertexBufferBinding[] array = currentVertexBuffers;
1443 *(int*)((ref *(_003F*)(num7 * 4)) + (ref *(_003F*)(&_0024ArrayType_0024_0024_0024BY0BA_0040I))) = array[num8]._vertexOffset;
1444 *(int*)((ref *(_003F*)(num7 * 4)) + (ref *(_003F*)(&_0024ArrayType_0024_0024_0024BY0BA_0040I2))) = array[num8]._instanceFrequency;
1445 VertexBuffer vertexBuffer = array[num8]._vertexBuffer;
1446 *(int*)((ref *(_003F*)(num7 * 4)) + (ref *(_003F*)(&_0024ArrayType_0024_0024_0024BY0BA_0040I3))) = vertexBuffer._vertexDeclaration._vertexStride;
1447 *(int*)((ref *(_003F*)(num7 * 4)) + (ref *(_003F*)(&_0024ArrayType_0024_0024_0024BY0BA_0040PAUIDirect3DVertexBuffer9_0040_0040))) = (int)vertexBuffer.pComPtr;
1448 num7++;
1449 }
1450 num8++;
1451 continue;
1452 }
1453 throw new InvalidOperationException();
1454 }
1455 while (num8 < currentVertexBufferCount);
1456 }
1457 int num9 = 0;
1458 if (0 >= instanceCount)
1459 {
1460 return;
1461 }
1462 int num13;
1463 while (true)
1464 {
1465 int num10 = 0;
1466 if (0 < num7)
1467 {
1468 do
1469 {
1470 uint num11 = (uint)(((int)((uint)num9 / (uint)(*(int*)((ref *(_003F*)(num10 * 4)) + (ref *(_003F*)(&_0024ArrayType_0024_0024_0024BY0BA_0040I2))))) + *(int*)((ref *(_003F*)(num10 * 4)) + (ref *(_003F*)(&_0024ArrayType_0024_0024_0024BY0BA_0040I)))) * *(int*)((ref *(_003F*)(num10 * 4)) + (ref *(_003F*)(&_0024ArrayType_0024_0024_0024BY0BA_0040I3))));
1471 IDirect3DDevice9* ptr4 = pComPtr;
1472 int num12 = ((delegate* unmanaged[Stdcall, Stdcall]<IntPtr, uint, IDirect3DVertexBuffer9*, uint, uint, int>)(int)(*(uint*)(*(int*)ptr4 + 400)))((nint)ptr4, *(uint*)((ref *(_003F*)(num10 * 4)) + (ref *(_003F*)(&_0024ArrayType_0024_0024_0024BY0BA_0040H))), (IDirect3DVertexBuffer9*)(int)(*(uint*)((ref *(_003F*)(num10 * 4)) + (ref *(_003F*)(&_0024ArrayType_0024_0024_0024BY0BA_0040PAUIDirect3DVertexBuffer9_0040_0040)))), num11, 0u);
1473 if (num12 >= 0)
1474 {
1475 num10++;
1476 continue;
1477 }
1478 throw GraphicsHelpers.GetExceptionFromResult((uint)num12);
1479 }
1480 while (num10 < num7);
1481 }
1482 IDirect3DDevice9* ptr5 = pComPtr;
1483 num13 = ((delegate* unmanaged[Stdcall, Stdcall]<IntPtr, _D3DPRIMITIVETYPE, int, uint, uint, uint, uint, int>)(int)(*(uint*)(*(int*)ptr5 + 328)))((nint)ptr5, d3DPRIMITIVETYPE, baseVertex, (uint)minVertexIndex, (uint)numVertices, (uint)startIndex, (uint)primitiveCount);
1484 if (num13 < 0)
1485 {
1486 break;
1487 }
1488 num9++;
1489 if (num9 >= instanceCount)
1490 {
1491 return;
1492 }
1493 }
1494 throw GraphicsHelpers.GetExceptionFromResult((uint)num13);
1495 }
1496 throw new InvalidOperationException(FrameworkResources.InvalidInstanceStreams);
1497 }
unsafe void VerifyCanDraw([MarshalAs(UnmanagedType.U1)] bool bUserPrimitives, [MarshalAs(UnmanagedType.U1)] bool bIndexedPrimitives)

References Microsoft.Xna.Framework.Graphics.GraphicsDevice._insideScene, Microsoft.Xna.Framework.Graphics.GraphicsDevice._profileCapabilities, Microsoft.Xna.Framework.Graphics.VertexBuffer._vertexDeclaration, Microsoft.Xna.Framework.Graphics.VertexBufferBinding._vertexOffset, Microsoft.Xna.Framework.Graphics.VertexDeclaration._vertexStride, System.array, Microsoft.Xna.Framework.Helpers.CheckDisposed(), Microsoft.Xna.Framework.Graphics.GraphicsDevice.currentVertexBufferCount, Microsoft.Xna.Framework.Graphics.GraphicsDevice.currentVertexBuffers, Microsoft.Xna.Framework.Graphics.GraphicsHelpers.GetExceptionFromResult(), Microsoft.Xna.Framework.Graphics.GraphicsDevice.instanceStreamMask, Microsoft.Xna.Framework.FrameworkResources.InvalidInstanceStreams, Microsoft.Xna.Framework.Graphics.ProfileCapabilities.MaxPrimitiveCount, Microsoft.Xna.Framework.FrameworkResources.MustDrawSomething, Microsoft.Xna.Framework.FrameworkResources.NumberVerticesMustBeGreaterZero, Microsoft.Xna.Framework.Graphics.GraphicsDevice.pComPtr, Microsoft.Xna.Framework.Graphics.VertexBuffer.pComPtr, Microsoft.Xna.Framework.FrameworkResources.ProfileMaxPrimitiveCount, Microsoft.Xna.Framework.Graphics.GraphicsDevice.pStateTracker, System.startIndex, Microsoft.Xna.Framework.Graphics.ProfileCapabilities.ThrowNotSupportedException(), and Microsoft.Xna.Framework.Graphics.GraphicsDevice.VerifyCanDraw().