bond.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. /*
  2. Copyright (C) 2005, 2010 - Cryptic Sea
  3. This file is part of Gish.
  4. Gish is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License
  6. as published by the Free Software Foundation; either version 2
  7. of the License, or (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. See the GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  15. */
  16. void bondsimulation(void)
  17. {
  18. int count,count2;
  19. int part1,part2;
  20. float vec[3];
  21. float bondnormal[3];
  22. float veclength;
  23. float force[2];
  24. for (count=0;count<32;count++)
  25. {
  26. for (count2=0;count2<numofparticles;count2++)
  27. copyvector(particle[count2].prevvelocity,particle[count2].velocity);
  28. for (count2=0;count2<numofbonds;count2++)
  29. if ((count&bond[count2].cycles)==0)
  30. {
  31. part1=bond[count2].part1;
  32. part2=bond[count2].part2;
  33. subtractvectors(bondnormal,particle[part2].position,particle[part1].position);
  34. veclength=vectorlength(bondnormal)-bond[count2].length;
  35. normalizevector(bondnormal,bondnormal);
  36. zerovector(vec);
  37. scaleaddvectors(vec,vec,particle[part2].prevvelocity,1.0f);
  38. scaleaddvectors(vec,vec,particle[part1].prevvelocity,-1.0f);
  39. veclength+=dotproduct(vec,bondnormal);
  40. if (bondtype[bond[count2].type].compression==0.0f)
  41. if (veclength<0.0f)
  42. veclength=0.0f;
  43. veclength*=bond[count2].elasticity;
  44. veclength/=(particle[part1].mass+particle[part2].mass);
  45. force[0]=veclength*particle[part2].mass;
  46. force[1]=veclength*particle[part1].mass;
  47. scaleaddvectors(particle[part1].velocity,particle[part1].velocity,bondnormal,force[0]);
  48. scaleaddvectors(particle[part2].velocity,particle[part2].velocity,bondnormal,-force[1]);
  49. }
  50. }
  51. }
  52. void checkbonds(void)
  53. {
  54. int count,count2;
  55. int numofbondstemp;
  56. int part1,part2;
  57. float vec[3],vec2[3];
  58. float veclength;
  59. float scale;
  60. for (count=0;count<numofbonds;count++)
  61. if (bond[count].type==4 || bond[count].type==6 || bond[count].type==16)
  62. if (bond[count].timetolive!=-1)
  63. {
  64. part1=bond[count].part1;
  65. part2=bond[count].part2;
  66. subtractvectors(vec,particle[part2].position,particle[part1].position);
  67. scaleaddvectors(vec,vec,particle[part2].velocity,1.0f);
  68. scaleaddvectors(vec,vec,particle[part1].velocity,-1.0f);
  69. veclength=vectorlength(vec);
  70. if (bondtype[bond[count].type].compression!=0.0f)
  71. if (veclength<bond[count].length*bond[count].compression)
  72. {
  73. bond[count].timetolive=-1;
  74. /*
  75. if (bond[count].type==6)
  76. {
  77. for (count2=0;count2<numofbonds;count2++)
  78. if (bond[count2].type==6)
  79. if (bond[count2].objectnum==bond[count].objectnum)
  80. bond[count2].timetolive=-1;
  81. }
  82. */
  83. }
  84. if (veclength>bond[count].length*bond[count].tension)
  85. {
  86. bond[count].timetolive=-1;
  87. /*
  88. if (bond[count].type==6)
  89. {
  90. for (count2=0;count2<numofbonds;count2++)
  91. if (bond[count2].type==6)
  92. if (bond[count2].objectnum==bond[count].objectnum)
  93. bond[count2].timetolive=-1;
  94. }
  95. */
  96. }
  97. }
  98. count=0;
  99. while (count<numofbonds)
  100. {
  101. while (count<numofbonds && bond[count].timetolive==-1)
  102. deletebond(count);
  103. count++;
  104. }
  105. }
  106. void createbond(int part1,int part2,int type,int objectnum)
  107. {
  108. int count;
  109. float vec[3];
  110. float length;
  111. if (part1>=numofparticles)
  112. return;
  113. if (part2>=numofparticles)
  114. return;
  115. for (count=0;count<numofbonds;count++)
  116. {
  117. if (bond[count].part1==part1 && bond[count].part2==part2)
  118. return;
  119. if (bond[count].part1==part2 && bond[count].part2==part1)
  120. return;
  121. }
  122. subtractvectors(vec,particle[part1].position,particle[part2].position);
  123. length=vectorlength(vec);
  124. if (length==0.0f)
  125. return;
  126. memset(&bond[numofbonds],0,sizeof(bond[numofbonds]));
  127. bond[numofbonds].part1=part1;
  128. bond[numofbonds].part2=part2;
  129. bond[numofbonds].type=type;
  130. bond[numofbonds].timetolive=10000;
  131. bond[numofbonds].length=length;
  132. bond[numofbonds].maxlength=length;
  133. bond[numofbonds].elasticity=bondtype[type].elasticity;
  134. bond[numofbonds].cycles=bondtype[type].cycles;
  135. bond[numofbonds].compression=bondtype[type].compression;
  136. bond[numofbonds].tension=bondtype[type].tension;
  137. bond[numofbonds].objectnum=objectnum;
  138. numofbonds++;
  139. }
  140. void deletebond(int bondnum)
  141. {
  142. int count;
  143. if (bondnum<0)
  144. return;
  145. if (bondnum>=numofbonds)
  146. return;
  147. if (bond[bondnum].type==4)
  148. deleterope(bond[bondnum].objectnum);
  149. if (bond[bondnum].type==6)
  150. if (bond[bondnum].objectnum!=-1)
  151. if (object[bond[bondnum].objectnum].timetolive>45)
  152. object[bond[bondnum].objectnum].timetolive=45;
  153. numofbonds--;
  154. if (bondnum==numofbonds)
  155. return;
  156. memcpy(&bond[bondnum],&bond[numofbonds],sizeof(bond[0]));
  157. for (count=0;count<numofropes;count++)
  158. if (rope[count].type>=5 && rope[count].type<9)
  159. if (rope[count].bondnum==numofbonds)
  160. rope[count].bondnum=bondnum;
  161. }