1. C++ / Говнокод #14413

    +11

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    #define EDGE_EDGE_TEST(V0,U0,U1)                      \
    	Bx=U0[i0]-U1[i0];                                   \
    	By=U0[i1]-U1[i1];                                   \
    	Cx=V0[i0]-U0[i0];                                   \
    	Cy=V0[i1]-U0[i1];                                   \
    	f=Ay*Bx-Ax*By;                                      \
    	d=By*Cx-Bx*Cy;                                      \
    	if((f>0 && d>=0 && d<=f) || (f<0 && d<=0 && d>=f))  \
    {                                                   \
    	e=Ax*Cy-Ay*Cx;                                    \
    	if(f>0)                                           \
    {                                                 \
    	if(e>=0 && e<=f) return 1;                      \
    	}                                                 \
    	else                                              \
    {                                                 \
    	if(e<=0 && e>=f) return 1;                      \
    	}                                                 \
    	}
    
    #define POINT_IN_TRI(V0,U0,U1,U2)           \
    {                                           \
    	double a,b,c,d0,d1,d2;                     \
    	/* is T1 completly inside T2? */          \
    	/* check if V0 is inside tri(U0,U1,U2) */ \
    	a=U1[i1]-U0[i1];                          \
    	b=-(U1[i0]-U0[i0]);                       \
    	c=-a*U0[i0]-b*U0[i1];                     \
    	d0=a*V0[i0]+b*V0[i1]+c;                   \
    	\
    	a=U2[i1]-U1[i1];                          \
    	b=-(U2[i0]-U1[i0]);                       \
    	c=-a*U1[i0]-b*U1[i1];                     \
    	d1=a*V0[i0]+b*V0[i1]+c;                   \
    	\
    	a=U0[i1]-U2[i1];                          \
    	b=-(U0[i0]-U2[i0]);                       \
    	c=-a*U2[i0]-b*U2[i1];                     \
    	d2=a*V0[i0]+b*V0[i1]+c;                   \
    	if(d0*d1>0.0)                             \
    {                                         \
    	if(d0*d2>0.0) return 1;                 \
    	}                                         \
    	}
    
    #define NEWCOMPUTE_INTERVALS(VV0,VV1,VV2,D0,D1,D2,D0D1,D0D2,A,B,C,X0,X1) \
    { \
    	if(D0D1>0.0f) \
    { \
    	/* here we know that D0D2<=0.0 */ \
    	/* that is D0, D1 are on the same side, D2 on the other or on the plane */ \
    	A=VV2; B=(VV0-VV2)*D2; C=(VV1-VV2)*D2; X0=D2-D0; X1=D2-D1; \
    	} \
    	else if(D0D2>0.0f)\
    { \
    	/* here we know that d0d1<=0.0 */ \
    	A=VV1; B=(VV0-VV1)*D1; C=(VV2-VV1)*D1; X0=D1-D0; X1=D1-D2; \
    	} \
    	else if(D1*D2>0.0f || D0!=0.0f) \
    { \
    	/* here we know that d0d1<=0.0 or that D0!=0.0 */ \
    	A=VV0; B=(VV1-VV0)*D0; C=(VV2-VV0)*D0; X0=D0-D1; X1=D0-D2; \
    	} \
    	else if(D1!=0.0f) \
    { \
    	A=VV1; B=(VV0-VV1)*D1; C=(VV2-VV1)*D1; X0=D1-D0; X1=D1-D2; \
    	} \
    	else if(D2!=0.0f) \
    { \
    	A=VV2; B=(VV0-VV2)*D2; C=(VV1-VV2)*D2; X0=D2-D0; X1=D2-D1; \
    	} \
    	else \
    { \
    	/* triangles are coplanar */ \
    	return coplanar_tri_tri(N1,V0,V1,V2,U0,U1,U2); \
    	} \
    	}

    Макросы макросики. Inline? Нет, не слышал.

    Запостил: Abbath, 25 Января 2014

    Комментарии (9) RSS

    • То что временные переменные используемые макросом должны быть объявлены заранее, отлично показывает отношение автора к тем, кто его код будет сопровождать.
      Ответить
      • Где?
        Ответить
        • строки 2-8, 52 и другие.
          Ретурн внутри тоже радует. Как и то, что произойдёт, если первый макрос использовать в ифе или цикле без обрамления его фигурными скобками.

          Если писать документацию к этому чуду, то она выйдет во много раз длиннее кода.
          Ответить
    • /*Здесь много возмущений и лучи ненависти к автору - также грусная история про попытку трассировки такого добра*/
      Ответить
    • > else if(D1!=0.0f)

      ндя. автор /точно/ знал что делал.
      Ответить
      • Я так делаю иногда.
        У меня каждый кадр величина сначала уменьшается на dt, потом проверяется, если она меньше нуля, то приравнивается к нулю. В этом случае с такой проверкой проблем не будет. И деления на неё у меня не делается, это делается тупо для проверки что "свеча сгорела".

        В данном же случае я вижу векторные операции и с вероятностью 90% могу сказать, что автор косил вычи.
        Ответить
        • а почему сначала не проверить а уже потом не присвоить?
          Ответить
        • "В этом случае с такой проверкой проблем не будет."

          Да. Но я лично походив по граблям, больше не рискую. У нас тут макросы глобальные есть которые все эти проверки с epsilon энкапсулируют, и народ везде ими обязан пользоватся.

          Последний раз когда кто-то второпях добавил проверку без эпсилона, маленькая эскаляция (которую проверка должна была исправить) переросла в кризис где CEO был лично на СС.
          Ответить
    • О функциях автор не слышал?
      Ответить

    Добавить комментарий