157 public void render(CampaignEngineLayers layer, ViewportAPI viewport) {
160 float alphaMult = viewport.getAlphaMult();
161 alphaMult *=
fader.getBrightness();
162 if (alphaMult <= 0)
return;
167 if (layer == CampaignEngineLayers.TERRAIN_10) {
173 xOff = velDir.x * -offset;
174 yOff = velDir.y * -offset;
181 float bandWidthInTexture = 256f;
186 float radStart = min;
189 if (radEnd < radStart + 10f) radEnd = radStart + 10f;
193 float angle1 = Misc.getAngleInDegrees(
arcOrigin,
p1);
194 float angle2 = Misc.getAngleInDegrees(
arcOrigin,
p2);
195 float turnDir = Misc.getClosestTurnDirection(Misc.getUnitVectorAtDegreeAngle(angle1),
196 Misc.getUnitVectorAtDegreeAngle(angle2));
198 float startRad = (float) Math.toRadians(angle1);
199 float endRad = (float) Math.toRadians(angle2);
200 if (startRad > endRad) {
201 endRad += Math.PI * 2f;
203 float spanRad = Math.abs(endRad - startRad);
204 float anglePerSegment = spanRad / segments;
212 GL11.glTranslatef(x, y, 0);
214 GL11.glEnable(GL11.GL_TEXTURE_2D);
219 GL11.glEnable(GL11.GL_BLEND);
226 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
228 float thickness = (radEnd - radStart) * 1f;
229 float radius = radStart;
231 float texProgress = 0f;
235 float texHeight =
texture.getTextureHeight();
236 float imageHeight =
texture.getHeight();
241 texPerSegment *= 200f/256f;
242 texPerSegment *= 200f/256f;
250 float totalTex = Math.max(1f, Math.round(texPerSegment * segments));
251 texPerSegment = totalTex / segments;
253 float texWidth =
texture.getTextureWidth();
254 float imageWidth =
texture.getWidth();
264 float periodMult = 3.1415f * 2f / spanRad * 0.25f *
currentWidth / 800f;
269 texProgress = (float) (
phaseAngle / 360f) * 5f * 0.25f;
270 if (layer == CampaignEngineLayers.TERRAIN_10) {
272 texProgress = (float) (
phaseAngle / 360f) * -1f * 0.25f;
280 for (
int iter = 0; iter < 4; iter++) {
284 if (iter == 2) bandIndex = 2;
285 else if (iter == 3) bandIndex = 3;
289 float leftTX = (float) bandIndex * texWidth * bandWidthInTexture / imageWidth;
290 float rightTX = (float) (bandIndex + 1f) * texWidth * bandWidthInTexture / imageWidth - 0.001f;
296 GL11.glBegin(GL11.GL_QUAD_STRIP);
297 for (
float i = 0; i < segments; i++) {
301 float angleIncrementBase = anglePerSegment;
304 phaseAngleRad = (float) Math.toRadians(
phaseAngle) + (i * angleIncrementBase * 10f);
307 phaseAngleRad = (float) Math.toRadians(-
phaseAngle) + (i * angleIncrementBase * 15f);
308 }
else if (iter == 3) {
309 phaseAngleRad = (float) Math.toRadians(
phaseAngle) + (i * angleIncrementBase * 5f);
311 phaseAngleRad = (float) Math.toRadians(-
phaseAngle) + (i * angleIncrementBase * 5f);
320 float pulseSin = (float) Math.sin(phaseAngleRad * periodMult * 1f);
321 float pulseAmount = pulseSin * thickness * 0.25f;
322 float pulseInner = pulseAmount * 0.5f;
332 float thicknessMult = 1.25f;
333 float thicknessFlat = 0f;
335 float theta = startRad + turnDir * anglePerSegment * i;
337 float cos = (float) Math.cos(theta);
338 float sin = (float) Math.sin(theta);
339 float x1 = cos * (r - pulseInner);
340 float y1 = sin * (r - pulseInner);
341 float x2 = cos * (r + thickness * thicknessMult - pulseAmount + thicknessFlat);
342 float y2 = sin * (r + thickness * thicknessMult - pulseAmount + thicknessFlat);
345 x1 = cos * (r - pulseInner - thickness * 1f);
346 y1 = sin * (r - pulseInner - thickness * 1f);
347 x2 = cos * (r + thickness * thicknessMult - pulseAmount + thicknessFlat - thickness * 0.0f);
348 y2 = sin * (r + thickness * thicknessMult - pulseAmount + thicknessFlat - thickness * 0.0f);
361 Color color = Color.white;
362 float alpha = alphaMult;
365 if (i < segments / 2f) {
368 distFromEdge = (segments - i - 1f) *
currentWidth / segments;
370 alpha *= Math.min(1f, distFromEdge / fadeDist);
372 GL11.glColor4ub((
byte)color.getRed(),
373 (byte)color.getGreen(),
374 (byte)color.getBlue(),
375 (byte)((
float) color.getAlpha() * alpha));
377 GL11.glTexCoord2f(leftTX, texProgress);
378 GL11.glVertex2f(x1, y1);
379 GL11.glTexCoord2f(rightTX, texProgress);
380 GL11.glVertex2f(x2, y2);
382 texProgress += texPerSegment;
437 if (
entity instanceof CampaignFleetAPI) {
438 CampaignFleetAPI fleet = (CampaignFleetAPI)
entity;
441 if (intensity <= 0)
return;
445 fleet.getStats().removeTemporaryMod(
getModId());
447 float maxFleetBurn = fleet.getFleetData().getBurnLevel();
448 float currFleetBurn = fleet.getCurrBurnLevel();
450 float maxWindBurn =
params.burnLevel;
452 float currWindBurn = intensity * maxWindBurn;
453 float burnDiff = maxFleetBurn - currWindBurn;
454 float maxFleetBurnIntoWind = 0;
455 if (burnDiff >= 5.9f) {
456 maxFleetBurnIntoWind = -params.burnLevel + 4f;
457 }
else if (burnDiff >= 3.9f) {
458 maxFleetBurnIntoWind = -params.burnLevel + 3f;
459 }
else if (burnDiff >= 2.9f) {
460 maxFleetBurnIntoWind = -params.burnLevel + 2f;
461 }
else if (burnDiff >= 0.9f) {
462 maxFleetBurnIntoWind = -params.burnLevel + 1f;
464 maxFleetBurnIntoWind = -params.burnLevel + 1f;
469 Vector2f windDir = Misc.getUnitVectorAtDegreeAngle(angle);
470 Vector2f
velDir = Misc.normalise(
new Vector2f(fleet.getVelocity()));
471 float dot = Vector2f.dot(windDir,
velDir);
473 velDir.scale(currFleetBurn);
474 float fleetBurnAgainstWind = -1f * Vector2f.dot(windDir,
velDir);
476 float burnBonus = (currWindBurn - maxFleetBurn) * dot;
478 burnBonus = Math.round(burnBonus);
479 if (burnBonus < 1) burnBonus = 1;
480 fleet.getStats().addTemporaryModFlat(0.1f,
getModId(),
"In wavefront", burnBonus, fleet.getStats().getFleetwideMaxBurnMod());
483 float accelMult = 0.5f;
484 if (fleetBurnAgainstWind < maxFleetBurnIntoWind) {
489 float diff = Math.abs(fleetBurnAgainstWind - maxFleetBurnIntoWind);
490 accelMult = 2f + diff * 0.25f;
493 float maxSpeed = fleet.getTravelSpeed();
494 float baseAccel = Math.max(10f, maxSpeed * fleet.getStats().getAccelerationMult().getBaseValue());
496 float seconds = days *
Global.
getSector().getClock().getSecondsPerDay();
498 Vector2f vel = fleet.getVelocity();
499 windDir.scale(seconds * baseAccel * accelMult);
500 fleet.setVelocity(vel.x + windDir.x, vel.y + windDir.y);
502 Color glowColor =
new Color(100,200,255,75);
503 int alpha = glowColor.getAlpha();
505 glowColor = Misc.setAlpha(glowColor, 75);
511 Misc.normalise(windDir);
512 float sizeNormal = 5f + 10f * intensity;
513 for (FleetMemberViewAPI view : fleet.getViews()) {
514 view.getWindEffectDirX().shift(
getModId(), windDir.x * sizeNormal, durIn, durOut, 1f);
515 view.getWindEffectDirY().shift(
getModId(), windDir.y * sizeNormal, durIn, durOut, 1f);
517 view.getWindEffectColor().shift(
getModId(), glowColor, durIn, durOut, intensity);
526 float angle1 = Misc.getAngleInDegrees(
arcOrigin,
p1);
527 float angle2 = Misc.getAngleInDegrees(
arcOrigin,
p2);
529 float angle3 = Misc.getAngleInDegrees(
arcOrigin, point);
531 float widthPerDegree =
currentWidth / Misc.getAngleDiff(angle1, angle2);
533 float dist1 = Misc.getAngleDiff(angle1, angle3) * widthPerDegree;
534 float dist2 = Misc.getAngleDiff(angle2, angle3) * widthPerDegree;
539 float brightness = 0f;
540 if (dist1 < fadeDist && dist1 <= dist2) {
541 brightness = dist1 / fadeDist;
542 turnDir = Misc.getClosestTurnDirection(angle3,
arcOrigin,
p1);
545 if (dist2 < fadeDist && dist2 <= dist1) {
546 brightness = dist2 / fadeDist;
547 turnDir = Misc.getClosestTurnDirection(angle3,
arcOrigin,
p2);
550 return angle3 + (1f - brightness) * 45f * turnDir;
554 float angle1 = Misc.getAngleInDegrees(
arcOrigin,
p1);
555 float angle2 = Misc.getAngleInDegrees(
arcOrigin,
p2);
557 float angle3 = Misc.getAngleInDegrees(
arcOrigin, point);
559 if (!Misc.isBetween(angle1, angle2, angle3))
return 0f;
561 float widthPerDegree =
currentWidth / Misc.getAngleDiff(angle1, angle2);
563 float dist1 = Misc.getAngleDiff(angle1, angle3) * widthPerDegree;
564 float dist2 = Misc.getAngleDiff(angle2, angle3) * widthPerDegree;
569 if (dist1 < fadeDist && dist1 <= dist2) {
570 sideMult = dist1 / fadeDist;
572 if (dist2 < fadeDist && dist2 <= dist1) {
573 sideMult = dist2 / fadeDist;
576 float distToPoint = Misc.getDistance(
arcOrigin, point);
583 float f = distToPoint / max;
587 }
else if (f < 0.25f) {
593 return sideMult * f *
fader.getBrightness();