1
0

__BulbAddOcclusionHard.gml 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. function __BulbAddOcclusionHard(_vbuff)
  2. {
  3. //Set up basic transforms to turn relative coordinates in arr_shadowGeometry[] into world-space coordinates
  4. var _sin = dsin(angle);
  5. var _cos = dcos(angle);
  6. var _xSin = xscale*_sin;
  7. var _xCos = xscale*_cos;
  8. var _ySin = yscale*_sin;
  9. var _yCos = yscale*_cos;
  10. //Loop through every line segment, remembering that we're storing coordinate data sequentially: { Ax1, Ay1, Bx1, Bx1, Ax2, Ay2, Bx2, Bx2, ... }
  11. var _vertexArray = vertexArray;
  12. var _i = 0;
  13. repeat(array_length(_vertexArray) div 6)
  14. {
  15. //Collect first coordinate pair
  16. var _oldAx = _vertexArray[_i++];
  17. var _oldAy = _vertexArray[_i++];
  18. var _oldBx = _vertexArray[_i++];
  19. var _oldBy = _vertexArray[_i++];
  20. var _oldDx = _vertexArray[_i++];
  21. var _oldDy = _vertexArray[_i++];
  22. //...and transform
  23. var _newAx = x + _oldAx*_xCos + _oldAy*_ySin;
  24. var _newAy = y - _oldAx*_xSin + _oldAy*_yCos;
  25. var _newBx = x + _oldBx*_xCos + _oldBy*_ySin;
  26. var _newBy = y - _oldBx*_xSin + _oldBy*_yCos;
  27. var _newDx = _oldDx*_xCos + _oldDy*_ySin;
  28. var _newDy = - _oldDx*_xSin + _oldDy*_yCos;
  29. //Add to the vertex buffer
  30. vertex_position_3d(_vbuff, _newAx, _newAy, 0); vertex_normal(_vbuff, _newDx, _newDy, 0);
  31. vertex_position_3d(_vbuff, _newBx, _newBy, __BULB_ZFAR); vertex_normal(_vbuff, _newDx, _newDy, 0);
  32. vertex_position_3d(_vbuff, _newBx, _newBy, 0); vertex_normal(_vbuff, _newDx, _newDy, 0);
  33. vertex_position_3d(_vbuff, _newAx, _newAy, 0); vertex_normal(_vbuff, _newDx, _newDy, 0);
  34. vertex_position_3d(_vbuff, _newAx, _newAy, __BULB_ZFAR); vertex_normal(_vbuff, _newDx, _newDy, 0);
  35. vertex_position_3d(_vbuff, _newBx, _newBy, __BULB_ZFAR); vertex_normal(_vbuff, _newDx, _newDy, 0);
  36. if (BULB_COMPENSATE_FOR_NEAR_OCCLUDERS)
  37. {
  38. vertex_position_3d(_vbuff, _newAx, _newAy, __BULB_ZFAR); vertex_normal(_vbuff, _newDx, _newDy, 0);
  39. vertex_position_3d(_vbuff, 0.5*(_newAx + _newBx), 0.5*(_newAy + _newBy), 2*__BULB_ZFAR); vertex_normal(_vbuff, _newDx, _newDy, 0);
  40. vertex_position_3d(_vbuff, _newBx, _newBy, __BULB_ZFAR); vertex_normal(_vbuff, _newDx, _newDy, 0);
  41. }
  42. }
  43. }