Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
ShaderParameter.cs
浏览该文件的文档.
1namespace Engine.Graphics {
2 public class ShaderParameter {
3 public object Resource;
4 public bool IsChanged = true;
5 public readonly Shader Shader;
6 public readonly string Name;
7 public readonly ShaderParameterType Type;
8 public readonly int Count;
9#if DIRECT3D11
10 public int VsResourceBindingSlot = -1;
11 public int PsResourceBindingSlot = -1;
12 public int VsBufferIndex = -1;
13 public IntPtr VsBufferPtr;
14 public int PsBufferIndex = -1;
15 public IntPtr PsBufferPtr;
16#else
17 public int Location;
18 public float[] Value;
19#endif
20
21 public ShaderParameter(string name, ShaderParameterType type) {
22 Name = name;
23 Type = type;
24 }
25
26 public ShaderParameter(Shader shader, string name, ShaderParameterType type, int count) {
27 Shader = shader;
28 Name = name;
29 Type = type;
30 Count = count;
31#if !DIRECT3D11
32 switch (type) {
33 case ShaderParameterType.Texture2D:
34 case ShaderParameterType.Sampler2D: break;
35 case ShaderParameterType.Float: Value = new float[count]; break;
36 case ShaderParameterType.Vector2: Value = new float[2 * count]; break;
37 case ShaderParameterType.Vector3: Value = new float[3 * count]; break;
38 case ShaderParameterType.Vector4: Value = new float[4 * count]; break;
39 case ShaderParameterType.Matrix: Value = new float[16 * count]; break;
40 default: throw new ArgumentException("type");
41 }
42#endif
43 }
44
45 public void SetValue(float value) {
46#if DIRECT3D11
47 unsafe {
48 if (Type != ShaderParameterType.Float
49 || Count != 1) {
50 throw new InvalidOperationException("Shader parameter type mismatch.");
51 }
52 if (VsBufferIndex != -1
53 && *(float*)(void*)VsBufferPtr != value) {
54 *(float*)(void*)VsBufferPtr = value;
55 IsChanged = true;
56 }
57 if (PsBufferIndex != -1
58 && *(float*)(void*)PsBufferPtr != value) {
59 *(float*)(void*)PsBufferPtr = value;
60 IsChanged = true;
61 }
62 }
63#else
64 if (Type == ShaderParameterType.Null) {
65 return;
66 }
67 if (Type != ShaderParameterType.Float
68 || Count != 1) {
69 throw new InvalidOperationException("Shader parameter type mismatch.");
70 }
71 if (value != Value[0]) {
72 Value[0] = value;
73 IsChanged = true;
74 }
75#endif
76 }
77
78 public void SetValue(float[] value, int count) {
79#if DIRECT3D11
80 unsafe {
81 if (Type != ShaderParameterType.Float) {
82 throw new InvalidOperationException("Shader parameter type mismatch.");
83 }
84 if (count < 0
85 || count > value.Length
86 || count > Count) {
87 throw new ArgumentOutOfRangeException("count");
88 }
89 for (int i = 0; i < count; i++) {
90 if (VsBufferIndex != -1) {
91 float* ptr = (float*)((byte*)(void*)VsBufferPtr + (IntPtr)i * 4);
92 if (*ptr != value[i]) {
93 *ptr = value[i];
94 IsChanged = true;
95 }
96 }
97 if (PsBufferIndex != -1) {
98 float* ptr2 = (float*)((byte*)(void*)PsBufferPtr + (IntPtr)i * 4);
99 if (*ptr2 != value[i]) {
100 *ptr2 = value[i];
101 IsChanged = true;
102 }
103 }
104 }
105 }
106#else
107 if (Type == ShaderParameterType.Null) {
108 return;
109 }
110 if (Type != ShaderParameterType.Float) {
111 throw new InvalidOperationException("Shader parameter type mismatch.");
112 }
113 if (count < 0
114 || count > value.Length
115 || count > Count) {
116 throw new ArgumentOutOfRangeException(nameof(count));
117 }
118 if (!IsChanged) {
119 for (int i = 0; i < count; i++) {
120 if (Value[i] != value[i]) {
121 IsChanged = true;
122 break;
123 }
124 }
125 }
126 if (IsChanged) {
127 for (int j = 0; j < count; j++) {
128 Value[j] = value[j];
129 }
130 IsChanged = true;
131 }
132#endif
133 }
134
135 public void SetValue(Vector2 value) {
136#if DIRECT3D11
137 unsafe {
138 if (Type != ShaderParameterType.Vector2
139 || Count != 1) {
140 throw new InvalidOperationException("Shader parameter type mismatch.");
141 }
142 if (VsBufferIndex != -1
143 && (IsChanged || !Compare((Vector2*)(void*)VsBufferPtr, &value))) {
144 *(Vector2*)(void*)VsBufferPtr = value;
145 IsChanged = true;
146 }
147 if (PsBufferIndex != -1
148 && (IsChanged || !Compare((Vector2*)(void*)PsBufferPtr, &value))) {
149 *(Vector2*)(void*)PsBufferPtr = value;
150 IsChanged = true;
151 }
152 }
153#else
154 if (Type == ShaderParameterType.Null) {
155 return;
156 }
157 if (Type != ShaderParameterType.Vector2
158 || Count != 1) {
159 throw new InvalidOperationException("Shader parameter type mismatch.");
160 }
161 if (IsChanged
162 || value.X != Value[0]
163 || value.Y != Value[1]) {
164 Value[0] = value.X;
165 Value[1] = value.Y;
166 IsChanged = true;
167 }
168#endif
169 }
170
171 public void SetValue(Vector2[] value, int count) {
172#if DIRECT3D11
173 unsafe {
174 if (Type != ShaderParameterType.Vector2) {
175 throw new InvalidOperationException("Shader parameter type mismatch.");
176 }
177 if (count < 0
178 || count > value.Length
179 || count > Count) {
180 throw new ArgumentOutOfRangeException("count");
181 }
182 fixed (Vector2* ptr = value) {
183 if (VsBufferIndex != -1) {
184 for (int i = 0; i < count; i++) {
185 if (IsChanged || !Compare((Vector2*)((byte*)(void*)VsBufferPtr + i * (IntPtr)sizeof(Vector2)), ptr + i)) {
186 *(Vector2*)((byte*)(void*)VsBufferPtr + i * (IntPtr)sizeof(Vector2)) = ptr[i];
187 IsChanged = true;
188 }
189 }
190 }
191 if (PsBufferIndex != -1) {
192 for (int j = 0; j < count; j++) {
193 if (IsChanged || !Compare((Vector2*)((byte*)(void*)PsBufferPtr + j * (IntPtr)sizeof(Vector2)), ptr + j)) {
194 *(Vector2*)((byte*)(void*)PsBufferPtr + j * (IntPtr)sizeof(Vector2)) = ptr[j];
195 IsChanged = true;
196 }
197 }
198 }
199 }
200 }
201#else
202 if (Type == ShaderParameterType.Null) {
203 return;
204 }
205 if (Type != ShaderParameterType.Vector2) {
206 throw new InvalidOperationException("Shader parameter type mismatch.");
207 }
208 if (count < 0
209 || count > value.Length
210 || count > Count) {
211 throw new ArgumentOutOfRangeException(nameof(count));
212 }
213 if (!IsChanged) {
214 int i = 0;
215 int num = 0;
216 for (; i < count; i++) {
217 if (Value[num++] != value[i].X
218 || Value[num++] != value[i].Y) {
219 IsChanged = true;
220 break;
221 }
222 }
223 }
224 if (IsChanged) {
225 int j = 0;
226 int num2 = 0;
227 for (; j < count; j++) {
228 Value[num2++] = value[j].X;
229 Value[num2++] = value[j].Y;
230 }
231 }
232#endif
233 }
234
235 public void SetValue(Vector3 value) {
236#if DIRECT3D11
237 unsafe {
238 if (Type != ShaderParameterType.Vector3
239 || Count != 1) {
240 throw new InvalidOperationException("Shader parameter type mismatch.");
241 }
242 if (VsBufferIndex != -1
243 && (IsChanged || !Compare((Vector3*)(void*)VsBufferPtr, &value))) {
244 *(Vector3*)(void*)VsBufferPtr = value;
245 IsChanged = true;
246 }
247 if (PsBufferIndex != -1
248 && (IsChanged || !Compare((Vector3*)(void*)PsBufferPtr, &value))) {
249 *(Vector3*)(void*)PsBufferPtr = value;
250 IsChanged = true;
251 }
252 }
253#else
254 if (Type == ShaderParameterType.Null) {
255 return;
256 }
257 if (Type != ShaderParameterType.Vector3
258 || Count != 1) {
259 throw new InvalidOperationException("Shader parameter type mismatch.");
260 }
261 if (IsChanged
262 || value.X != Value[0]
263 || value.Y != Value[1]
264 || value.Z != Value[2]) {
265 Value[0] = value.X;
266 Value[1] = value.Y;
267 Value[2] = value.Z;
268 IsChanged = true;
269 }
270#endif
271 }
272
273 public void SetValue(Vector3[] value, int count) {
274#if DIRECT3D11
275 unsafe {
276 if (Type != ShaderParameterType.Vector3) {
277 throw new InvalidOperationException("Shader parameter type mismatch.");
278 }
279 if (count < 0
280 || count > value.Length
281 || count > Count) {
282 throw new ArgumentOutOfRangeException("count");
283 }
284 fixed (Vector3* ptr = value) {
285 if (VsBufferIndex != -1) {
286 for (int i = 0; i < count; i++) {
287 if (IsChanged || !Compare((Vector3*)((byte*)(void*)VsBufferPtr + i * (IntPtr)sizeof(Vector3)), ptr + i)) {
288 *(Vector3*)((byte*)(void*)VsBufferPtr + i * (IntPtr)sizeof(Vector3)) = ptr[i];
289 IsChanged = true;
290 }
291 }
292 }
293 if (PsBufferIndex != -1) {
294 for (int j = 0; j < count; j++) {
295 if (IsChanged || !Compare((Vector3*)((byte*)(void*)PsBufferPtr + j * (IntPtr)sizeof(Vector3)), ptr + j)) {
296 *(Vector3*)((byte*)(void*)PsBufferPtr + j * (IntPtr)sizeof(Vector3)) = ptr[j];
297 IsChanged = true;
298 }
299 }
300 }
301 }
302 }
303#else
304 if (Type == ShaderParameterType.Null) {
305 return;
306 }
307 if (Type != ShaderParameterType.Vector3) {
308 throw new InvalidOperationException("Shader parameter type mismatch.");
309 }
310 if (count < 0
311 || count > value.Length
312 || count > Count) {
313 throw new ArgumentOutOfRangeException(nameof(count));
314 }
315 if (!IsChanged) {
316 int i = 0;
317 int num = 0;
318 for (; i < count; i++) {
319 if (Value[num++] != value[i].X
320 || Value[num++] != value[i].Y
321 || Value[num++] != value[i].Z) {
322 IsChanged = true;
323 break;
324 }
325 }
326 }
327 if (IsChanged) {
328 int j = 0;
329 int num2 = 0;
330 for (; j < count; j++) {
331 Value[num2++] = value[j].X;
332 Value[num2++] = value[j].Y;
333 Value[num2++] = value[j].Z;
334 }
335 }
336#endif
337 }
338
339 public void SetValue(Vector4 value) {
340#if DIRECT3D11
341 unsafe {
342 if (Type != ShaderParameterType.Vector4
343 || Count != 1) {
344 throw new InvalidOperationException("Shader parameter type mismatch.");
345 }
346 if (VsBufferIndex != -1
347 && (IsChanged || !Compare((Vector4*)(void*)VsBufferPtr, &value))) {
348 *(Vector4*)(void*)VsBufferPtr = value;
349 IsChanged = true;
350 }
351 if (PsBufferIndex != -1
352 && (IsChanged || !Compare((Vector4*)(void*)PsBufferPtr, &value))) {
353 *(Vector4*)(void*)PsBufferPtr = value;
354 IsChanged = true;
355 }
356 }
357#else
358 if (Type == ShaderParameterType.Null) {
359 return;
360 }
361 if (Type != ShaderParameterType.Vector4
362 || Count != 1) {
363 throw new InvalidOperationException("Shader parameter type mismatch.");
364 }
365 if (IsChanged
366 || value.X != Value[0]
367 || value.Y != Value[1]
368 || value.Z != Value[2]
369 || value.W != Value[3]) {
370 Value[0] = value.X;
371 Value[1] = value.Y;
372 Value[2] = value.Z;
373 Value[3] = value.W;
374 IsChanged = true;
375 }
376#endif
377 }
378
379 public void SetValue(Vector4[] value, int count) {
380#if DIRECT3D11
381 unsafe {
382 if (Type != ShaderParameterType.Vector4) {
383 throw new InvalidOperationException("Shader parameter type mismatch.");
384 }
385 if (count < 0
386 || count > value.Length
387 || count > Count) {
388 throw new ArgumentOutOfRangeException("count");
389 }
390 fixed (Vector4* ptr = value) {
391 if (VsBufferIndex != -1) {
392 for (int i = 0; i < count; i++) {
393 if (IsChanged || !Compare((Vector4*)((byte*)(void*)VsBufferPtr + i * (IntPtr)sizeof(Vector4)), ptr + i)) {
394 *(Vector4*)((byte*)(void*)VsBufferPtr + i * (IntPtr)sizeof(Vector4)) = ptr[i];
395 IsChanged = true;
396 }
397 }
398 }
399 if (PsBufferIndex != -1) {
400 for (int j = 0; j < count; j++) {
401 if (IsChanged || !Compare((Vector4*)((byte*)(void*)PsBufferPtr + j * (IntPtr)sizeof(Vector4)), ptr + j)) {
402 *(Vector4*)((byte*)(void*)PsBufferPtr + j * (IntPtr)sizeof(Vector4)) = ptr[j];
403 IsChanged = true;
404 }
405 }
406 }
407 }
408 }
409#else
410 if (Type == ShaderParameterType.Null) {
411 return;
412 }
413 if (Type != ShaderParameterType.Vector4) {
414 throw new InvalidOperationException("Shader parameter type mismatch.");
415 }
416 if (count < 0
417 || count > value.Length
418 || count > Count) {
419 throw new ArgumentOutOfRangeException(nameof(count));
420 }
421 if (!IsChanged) {
422 int i = 0;
423 int num = 0;
424 for (; i < count; i++) {
425 if (Value[num++] != value[i].X
426 || Value[num++] != value[i].Y
427 || Value[num++] != value[i].Z
428 || Value[num++] != value[i].W) {
429 IsChanged = true;
430 break;
431 }
432 }
433 }
434 if (IsChanged) {
435 int j = 0;
436 int num2 = 0;
437 for (; j < count; j++) {
438 Value[num2++] = value[j].X;
439 Value[num2++] = value[j].Y;
440 Value[num2++] = value[j].Z;
441 Value[num2++] = value[j].W;
442 }
443 }
444#endif
445 }
446
447 public void SetValue(Matrix value) {
448#if DIRECT3D11
449 unsafe {
450 if (Type != ShaderParameterType.Matrix
451 || Count != 1) {
452 throw new InvalidOperationException("Shader parameter type mismatch.");
453 }
454 if (VsBufferIndex != -1
455 && (IsChanged || !Compare((Matrix*)(void*)VsBufferPtr, &value))) {
456 *(Matrix*)(void*)VsBufferPtr = value;
457 IsChanged = true;
458 }
459 if (PsBufferIndex != -1
460 && (IsChanged || !Compare((Matrix*)(void*)PsBufferPtr, &value))) {
461 *(Matrix*)(void*)PsBufferPtr = value;
462 IsChanged = true;
463 }
464 }
465#else
466 if (Type == ShaderParameterType.Null) {
467 return;
468 }
469 if (Type != ShaderParameterType.Matrix
470 || Count != 1) {
471 throw new InvalidOperationException("Shader parameter type mismatch.");
472 }
473 if (IsChanged
474 || value.M11 != Value[0]
475 || value.M12 != Value[1]
476 || value.M13 != Value[2]
477 || value.M14 != Value[3]
478 || value.M21 != Value[4]
479 || value.M22 != Value[5]
480 || value.M23 != Value[6]
481 || value.M24 != Value[7]
482 || value.M31 != Value[8]
483 || value.M32 != Value[9]
484 || value.M33 != Value[10]
485 || value.M34 != Value[11]
486 || value.M41 != Value[12]
487 || value.M42 != Value[13]
488 || value.M43 != Value[14]
489 || value.M44 != Value[15]) {
490 Value[0] = value.M11;
491 Value[1] = value.M12;
492 Value[2] = value.M13;
493 Value[3] = value.M14;
494 Value[4] = value.M21;
495 Value[5] = value.M22;
496 Value[6] = value.M23;
497 Value[7] = value.M24;
498 Value[8] = value.M31;
499 Value[9] = value.M32;
500 Value[10] = value.M33;
501 Value[11] = value.M34;
502 Value[12] = value.M41;
503 Value[13] = value.M42;
504 Value[14] = value.M43;
505 Value[15] = value.M44;
506 IsChanged = true;
507 }
508#endif
509 }
510
511 public void SetValue(Matrix[] value, int count) {
512#if DIRECT3D11
513 unsafe {
514 if (Type != ShaderParameterType.Matrix) {
515 throw new InvalidOperationException("Shader parameter type mismatch.");
516 }
517 if (count < 0
518 || count > value.Length
519 || count > Count) {
520 throw new ArgumentOutOfRangeException("count");
521 }
522 fixed (Matrix* ptr = value) {
523 if (VsBufferIndex != -1) {
524 for (int i = 0; i < count; i++) {
525 if (IsChanged || !Compare((Matrix*)((byte*)(void*)VsBufferPtr + i * (IntPtr)sizeof(Matrix)), ptr + i)) {
526 *(Matrix*)((byte*)(void*)VsBufferPtr + i * (IntPtr)sizeof(Matrix)) = ptr[i];
527 IsChanged = true;
528 }
529 }
530 }
531 if (PsBufferIndex != -1) {
532 for (int j = 0; j < count; j++) {
533 if (IsChanged || !Compare((Matrix*)((byte*)(void*)PsBufferPtr + j * (IntPtr)sizeof(Matrix)), ptr + j)) {
534 *(Matrix*)((byte*)(void*)PsBufferPtr + j * (IntPtr)sizeof(Matrix)) = ptr[j];
535 IsChanged = true;
536 }
537 }
538 }
539 }
540 }
541#else
542 if (Type == ShaderParameterType.Null) {
543 return;
544 }
545 if (Type != ShaderParameterType.Matrix) {
546 throw new InvalidOperationException("Shader parameter type mismatch.");
547 }
548 if (count < 0
549 || count > value.Length
550 || count > Count) {
551 throw new ArgumentOutOfRangeException(nameof(count));
552 }
553 if (!IsChanged) {
554 int i = 0;
555 int num = 0;
556 for (; i < count; i++) {
557 if (Value[num++] != value[i].M11
558 || Value[num++] != value[i].M12
559 || Value[num++] != value[i].M13
560 || Value[num++] != value[i].M14
561 || Value[num++] != value[i].M21
562 || Value[num++] != value[i].M22
563 || Value[num++] != value[i].M23
564 || Value[num++] != value[i].M24
565 || Value[num++] != value[i].M31
566 || Value[num++] != value[i].M32
567 || Value[num++] != value[i].M33
568 || Value[num++] != value[i].M34
569 || Value[num++] != value[i].M41
570 || Value[num++] != value[i].M42
571 || Value[num++] != value[i].M43
572 || Value[num++] != value[i].M44) {
573 IsChanged = true;
574 break;
575 }
576 }
577 }
578 if (IsChanged) {
579 int j = 0;
580 int num2 = 0;
581 for (; j < count; j++) {
582 Value[num2++] = value[j].M11;
583 Value[num2++] = value[j].M12;
584 Value[num2++] = value[j].M13;
585 Value[num2++] = value[j].M14;
586 Value[num2++] = value[j].M21;
587 Value[num2++] = value[j].M22;
588 Value[num2++] = value[j].M23;
589 Value[num2++] = value[j].M24;
590 Value[num2++] = value[j].M31;
591 Value[num2++] = value[j].M32;
592 Value[num2++] = value[j].M33;
593 Value[num2++] = value[j].M34;
594 Value[num2++] = value[j].M41;
595 Value[num2++] = value[j].M42;
596 Value[num2++] = value[j].M43;
597 Value[num2++] = value[j].M44;
598 }
599 }
600#endif
601 }
602
603 public void SetValue(Texture2D value) {
604#if DIRECT3D11
605 if (Type != ShaderParameterType.Texture2D
606 || Count != 1) {
607 throw new InvalidOperationException("Shader parameter type mismatch.");
608 }
609 if (value != Resource) {
610 Resource = value;
611 IsChanged = true;
612 }
613#else
614 if (Type == ShaderParameterType.Null) {
615 return;
616 }
617 if (Type != ShaderParameterType.Texture2D
618 || Count != 1) {
619 throw new InvalidOperationException("Shader parameter type mismatch.");
620 }
621 if (value != Resource) {
622 Resource = value;
623 IsChanged = true;
624 }
625#endif
626 }
627
628 public void SetValue(SamplerState value) {
629#if DIRECT3D11
630 if (Type != ShaderParameterType.Sampler2D
631 || Count != 1) {
632 throw new InvalidOperationException("Shader parameter type mismatch.");
633 }
634 if (value != Resource) {
635 Resource = value;
636 IsChanged = true;
637 }
638#else
639 if (Type == ShaderParameterType.Null) {
640 return;
641 }
642 if (Type != ShaderParameterType.Sampler2D
643 || Count != 1) {
644 throw new InvalidOperationException("Shader parameter type mismatch.");
645 }
646 if (value != Resource) {
647 Resource = value;
648 IsChanged = true;
649 }
650#endif
651 }
652
653 public static unsafe bool Compare(Vector2* a, Vector2* b) => *(long*)a == *(long*)b;
654
655 public static unsafe bool Compare(Vector3* a, Vector3* b) {
656 if (*(long*)a != *(long*)b) {
657 return false;
658 }
659 if (*(int*)((byte*)a + 2 * (nint)4) != *(int*)((byte*)b + 2 * (nint)4)) {
660 return false;
661 }
662 return true;
663 }
664
665 public static unsafe bool Compare(Vector4* a, Vector4* b) {
666 if (*(long*)a != *(long*)b) {
667 return false;
668 }
669 if (*(long*)((byte*)a + 8) != *(long*)((byte*)b + 8)) {
670 return false;
671 }
672 return true;
673 }
674
675 public static unsafe bool Compare(Matrix* a, Matrix* b) {
676 if (*(long*)a != *(long*)b) {
677 return false;
678 }
679 if (*(long*)((byte*)a + 8) != *(long*)((byte*)b + 8)) {
680 return false;
681 }
682 if (*(long*)((byte*)a + 2 * (nint)8) != *(long*)((byte*)b + 2 * (nint)8)) {
683 return false;
684 }
685 if (*(long*)((byte*)a + 3 * (nint)8) != *(long*)((byte*)b + 3 * (nint)8)) {
686 return false;
687 }
688 if (*(long*)((byte*)a + 4 * (nint)8) != *(long*)((byte*)b + 4 * (nint)8)) {
689 return false;
690 }
691 if (*(long*)((byte*)a + 5 * (nint)8) != *(long*)((byte*)b + 5 * (nint)8)) {
692 return false;
693 }
694 if (*(long*)((byte*)a + 6 * (nint)8) != *(long*)((byte*)b + 6 * (nint)8)) {
695 return false;
696 }
697 if (*(long*)((byte*)a + 7 * (nint)8) != *(long*)((byte*)b + 7 * (nint)8)) {
698 return false;
699 }
700 return true;
701 }
702 }
703}
unsafe
定义 Main.cs:15
void SetValue(Matrix[] value, int count)
readonly ShaderParameterType Type
static unsafe bool Compare(Vector4 *a, Vector4 *b)
void SetValue(Vector3[] value, int count)
ShaderParameter(string name, ShaderParameterType type)
static unsafe bool Compare(Vector2 *a, Vector2 *b)
static unsafe bool Compare(Vector3 *a, Vector3 *b)
ShaderParameter(Shader shader, string name, ShaderParameterType type, int count)
void SetValue(Vector2[] value, int count)
void SetValue(Vector4[] value, int count)
void SetValue(float[] value, int count)
static unsafe bool Compare(Matrix *a, Matrix *b)