Draws a blast ring vis effect
| 989 | |
| 990 | // Draws a blast ring vis effect |
| 991 | void DrawVisBlastRing(vis_effect *vis) { |
| 992 | vector inner_vecs[30], outer_vecs[30]; |
| 993 | g3Point inner_points[30], outer_points[30]; |
| 994 | float lifenorm = (vis->lifetime - vis->lifeleft) / vis->lifetime; |
| 995 | float cur_size = lifenorm * vis->size; |
| 996 | int i; |
| 997 | g3Point *pntlist[4]; |
| 998 | matrix orient; |
| 999 | vector fvec; |
| 1000 | |
| 1001 | if (vis->flags & VF_REVERSE) { |
| 1002 | lifenorm = 1 - lifenorm; |
| 1003 | cur_size = lifenorm * vis->size; |
| 1004 | } |
| 1005 | |
| 1006 | if (vis->flags & VF_PLANAR) |
| 1007 | fvec = vis->end_pos; |
| 1008 | else { |
| 1009 | fvec = Viewer_object->pos - vis->pos; |
| 1010 | vm_NormalizeVectorFast(&fvec); |
| 1011 | } |
| 1012 | |
| 1013 | if (vm_GetMagnitudeFast(&fvec) < .5) |
| 1014 | return; |
| 1015 | vm_VectorToMatrix(&orient, &fvec, NULL, NULL); |
| 1016 | |
| 1017 | int num_segments = 20; |
| 1018 | |
| 1019 | int ring_increment = 65536 / num_segments; |
| 1020 | int ring_angle = 0; |
| 1021 | |
| 1022 | if (lifenorm > 1.0) |
| 1023 | lifenorm = 1.0; |
| 1024 | |
| 1025 | rend_SetAlphaType(AT_SATURATE_TEXTURE_VERTEX); |
| 1026 | rend_SetOverlayType(OT_NONE); |
| 1027 | rend_SetTextureType(TT_LINEAR); |
| 1028 | rend_SetLighting(LS_NONE); |
| 1029 | rend_SetZBias(-1.0); |
| 1030 | rend_SetZBufferWriteMask(0); |
| 1031 | |
| 1032 | ring_angle = 0; |
| 1033 | |
| 1034 | for (i = 0; i < num_segments; i++, ring_angle += ring_increment) { |
| 1035 | float ring_sin = FixSin(ring_angle); |
| 1036 | float ring_cos = FixCos(ring_angle); |
| 1037 | |
| 1038 | inner_vecs[i] = orient.rvec * (ring_cos * (cur_size / 2)); |
| 1039 | inner_vecs[i] += orient.uvec * (ring_sin * (cur_size / 2)); |
| 1040 | inner_vecs[i] += vis->pos; |
| 1041 | |
| 1042 | outer_vecs[i] = orient.rvec * (ring_cos * cur_size); |
| 1043 | outer_vecs[i] += orient.uvec * (ring_sin * cur_size); |
| 1044 | outer_vecs[i] += vis->pos; |
| 1045 | |
| 1046 | g3_RotatePoint(&inner_points[i], &inner_vecs[i]); |
| 1047 | g3_RotatePoint(&outer_points[i], &outer_vecs[i]); |
| 1048 | outer_points[i].p3_flags |= PF_UV | PF_RGBA; |
no test coverage detected