Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
0345c2e
updated MSLookup to support APP6D(10), 2525Dch1(11), 2525Ech1(15), AP…
michael-spinelli Feb 18, 2026
7f7ff59
updated SVGLookup to intercept symbolset 27 on version 10 and forward…
michael-spinelli Feb 18, 2026
4f6d549
Merge branch 'development' into APP6D
michael-spinelli Feb 18, 2026
d4b55e4
sector modifier updates
michael-spinelli Feb 20, 2026
4164cc1
updated sector mod list files
michael-spinelli Feb 20, 2026
b6ff7b5
-updated SectorModUtils to handle the new sector data
michael-spinelli Feb 20, 2026
525e715
fixes for getName and getSectorModList
michael-spinelli Feb 23, 2026
69e1cbf
removed unsued dismounted symbols from APP6D
michael-spinelli Feb 23, 2026
24db744
Finished APP6Ev2 updates
michael-spinelli Feb 25, 2026
321f0df
fix for supporting attack
michael-spinelli Feb 26, 2026
58175c7
-svg fixes and updates for APP6
michael-spinelli Feb 26, 2026
d3c04e1
loading of SVGs for APP6D/E
michael-spinelli Feb 26, 2026
d1431c9
-Updated isCBRNEvent() for APP6
michael-spinelli Feb 27, 2026
527bf18
-updated modifier renderer for new single point symbols in APP6D/E
michael-spinelli Feb 27, 2026
44de4fc
-fix for Protection of Cultural Property - Enhanced
michael-spinelli Feb 27, 2026
df8fb56
APP6 updates for BIOT, CHEMT, RADT areas and BCL, ICL, NFL and RFL la…
michael-spinelli Mar 2, 2026
0be41fe
getBasicSymbolID2525C no longer deprecated
michael-spinelli Mar 10, 2026
4ea5224
-Added setCountryCode() to SymbolID class
michael-spinelli Mar 10, 2026
b6386c9
implemented app6d deception 25230100 & 230200
michael-spinelli Mar 10, 2026
3065a5c
-implemented Capture
michael-spinelli Mar 10, 2026
95a64b7
fix for demonstrate/demonstration
michael-spinelli Mar 10, 2026
d1dcbee
implemented Control and Locate for APP6D
michael-spinelli Mar 10, 2026
b56382a
Added decoy mine support for APP6. All this does is remap to the ori…
michael-spinelli Mar 11, 2026
ec08b3b
fixed c2dlookup for dummy mines/minefields
michael-spinelli Mar 11, 2026
6be1e34
Added APP6D Deny
michael-spinelli Mar 11, 2026
4268c7a
Added Infiltraion and Exfiltration for APP6D
michael-spinelli Mar 12, 2026
efcc96a
Implemented Decision Line for APP6
michael-spinelli Mar 17, 2026
6c1b412
-fixes for infiltration and exfiltration label
michael-spinelli Mar 19, 2026
c6044c8
fixed space debris outline and adjust space debris linewidth again
michael-spinelli Mar 19, 2026
ba3fe8c
added missing main gun system for APP6D
michael-spinelli Mar 20, 2026
f01553c
fixes for main icon scaling when sector modifiers aren't present
michael-spinelli Mar 20, 2026
4a0d2ee
version bump to 2.6.0
michael-spinelli Mar 20, 2026
8bb5ca1
additional tweak to main icon scaling
michael-spinelli Mar 20, 2026
621ec65
tweaks to fixed wing with airplane image
michael-spinelli Mar 20, 2026
9bb3456
fix for Enhanced 25360300
michael-spinelli Mar 20, 2026
20b0f6a
additional fix for Enhanced 25360300
michael-spinelli Mar 20, 2026
e7e5dac
impoved handling of bad symbol codes
michael-spinelli Mar 23, 2026
3d859ee
MSLookup fix
michael-spinelli Mar 23, 2026
be9232a
Fixes for 2525Dch1 and APP6D modifier placement
michael-spinelli Mar 24, 2026
167f60f
version bump to 2.6.1
michael-spinelli Mar 24, 2026
8eb5ddb
fix for 2525Ech1 air/space modifiers
michael-spinelli Mar 24, 2026
5607849
Implemented ModifierAnchor and ModifierAnchorOffset.
michael-spinelli Apr 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,4 @@ Build:



![Pixel](https://static.scarf.sh/a.png?x-pxid=bca0420d-b288-43d6-833a-f68de61ca46a)
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ java {


group = 'armyc2.c5isr.renderer'
version = '2.5.7'
version = '2.6.2'

repositories {
mavenCentral()
Expand Down
227 changes: 226 additions & 1 deletion src/main/java/armyc2/c5isr/JavaLineArray/DISMSupport.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import java.awt.*;

import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.Arrays;

/**
Expand Down Expand Up @@ -379,6 +380,131 @@ private static boolean IsEnvelopmentArcReversed(POINT2[] pPoints) {
return false;
}

public static POINT2[] GetInfiltrationDouble(POINT2[] points) {
int counter = 0;

POINT2 p1 = points[0];//start
POINT2 p3 = points[1];//mid
POINT2 p5 = points[2];//end
POINT2 start = points[0];//start
POINT2 mid = points[1];//mid
POINT2 end = points[2];//end
POINT2 p2= new POINT2(0,0,1);
POINT2 p4 = new POINT2(0,0,1);
p1.style=0;



double dpi = RendererSettings.getInstance().getDeviceDPI();
double scale = 4;

if(p5.x==0 && p5.y==0)//handle points drop when all 3 on top of each other.
{
p5.x=p3.x;
p5.y=p3.y;
}

int d1 = (int)lineutility.CalcDistanceDouble(p1,p3);
int d2 = (int)lineutility.CalcDistanceDouble(p3,p5);

//force some distance so render doesn't fail when points too close
if(d1==0) {
p1.x = p1.x - 1;
p1.y = p1.y - 1;
}
if(d2==0) {
p5.x = p5.x + 1;
p5.y = p5.y + 1;
}

double arcDistance = dpi/scale;

POINT2 anchor1 = new POINT2();
POINT2 anchor2 = new POINT2();
if(p5.y >= p3.y)//end point lower than mid point
{
p2.y = p3.y - arcDistance;
p4.y = p3.y + arcDistance;
}
else//end point higher than mid point
{
p2.y = p3.y + arcDistance;
p4.y = p3.y - arcDistance;
}

arcDistance = dpi/scale;
if(d2 < arcDistance)
arcDistance = Math.max(d2*0.5,3);
if(p5.x >= p3.x)
{
p2.x = p3.x - arcDistance;
p4.x = p3.x + arcDistance;
}
else
{
p2.x = p3.x + arcDistance;
p4.x = p3.x - arcDistance;
}
anchor1.x=p2.x;
anchor1.y=p3.y;

anchor2.x=p4.x;
anchor2.y=p3.y;


ArrayList<POINT2> path = new ArrayList<>();

try {

// Draw the first straight line segment (p1 to p2)
//g2d.drawLine(p1.x, p1.y, p2.x, p2.y);
path.add(p1);
//path.add(p2);//first curve is going to add this point again

// Draw the first 45-degree arc (concave) from p2 to p3
//drawArc(g2d, p2, p3, true, 5);
//path.addAll(getArc(p2, p3, false, 5));
if(arcDistance < d1) {
path.addAll(lineutility.GetArcPointsDouble(p2, p3, anchor1, 5));
path.remove(path.size() - 1);//next curve is going to add this point again.
}


// Draw the second 45-degree arc (convex) from p3 to p4
//drawArc(g2d, p3, p4, false, 5);
//path.addAll(getArc(p3, p4, true, 5));
if(arcDistance < d2)
path.addAll(lineutility.GetArcPointsDouble(p3, p4, anchor2, 5));
else
path.add(p3);

// Draw the second straight line segment (p4 to p5)
//g2d.drawLine(p4.x, p4.y, p5.x, p5.y);
path.add(p5);

}
catch(Exception exc)
{
ErrorLogger.LogException("","",exc);
}

int lcv = 0;
points = new POINT2[path.size() + 3];

for(POINT2 pt : path)
{
if(lcv == 0)
pt.style = 0;
else
pt.style=1;
points[lcv] = pt;
lcv++;
}

return points;
}


/**
* Calculates the points for ENVELOPMENT
*
Expand Down Expand Up @@ -935,6 +1061,76 @@ else if(pt1.x < pt2.x && quadrant == 4)
}
return counter;
}

/**
* Calculates the points for Escort.
*
* @param points OUT - the client points, also used for the returned points.
* @param lineType the line type.
*/
static int GetDISMEscortDouble(TGLight tg, POINT2[] points, int lineType) {
int counter = 6;
try {
POINT2 pt0 = new POINT2(points[1]);
POINT2 pt1 = new POINT2();
POINT2 pt2 = new POINT2();
POINT2 pt3 = new POINT2();
POINT2 pt4 = new POINT2();
POINT2 pt5 = new POINT2(points[2]);



POINT2 offset = points[0];
POINT2 intersect = lineutility.FindClosestPointOnLine(pt0,pt5,offset);

double xOffset = offset.x - intersect.x;
double yOffset = offset.y - intersect.y;
pt1 = new POINT2(pt0.x+xOffset, pt0.y + yOffset);
pt4 = new POINT2(pt5.x+xOffset, pt5.y + yOffset);


int pixelSize = tg.getIconSize();
double distance = lineutility.CalcDistanceDouble(pt1,pt4);
POINT2 center = lineutility.MidPointDouble(pt1,pt4,0);
Font font = tg.get_Font();
if (font == null) {
font = RendererSettings.getInstance().getMPLabelFont();;
}

POINT2 ptCenter = lineutility.MidPointDouble(pt1, pt4, 0);
if ((font.getSize()*2 + pixelSize) < distance)//draw the gap for the icon
{
pt2 = lineutility.ExtendAlongLineDouble(center, pt1, pixelSize/2f + font.getSize());
pt3 = lineutility.ExtendAlongLineDouble(center, pt4, pixelSize/2f + font.getSize());
}
else
{
pt2 = ptCenter;
pt3 = ptCenter;
}

pt0.style = 0;
pt1.style = 1;
pt2.style = 5;
pt3.style = 0;
pt4.style = 1;
pt5.style = 1;

points[0] = pt0;
points[1] = pt1;
points[2] = pt2;
points[3] = pt3;
points[4] = pt4;
points[5] = pt5;

} catch (Exception exc) {
ErrorLogger.LogException(_className, "GetDISMEscortDouble",
new RendererException("Failed inside GetDISMEscortDouble", exc));
}
return counter;
}


/**
* Calculates the points for BYPASS
*
Expand Down Expand Up @@ -1242,6 +1438,35 @@ public static Shape2 getFDIShape(TGLight tg, POINT2 ptA, POINT2 ptB, POINT2 ptC)
return null;
}

/**
* Calculates the points for DECEIVE.
*
* @param points - OUT - the client points, also used for the returned points.
*/
protected static void GetDISMDeceiveDouble(POINT2[] points) {
try {
POINT2[] savepoints = new POINT2[3];// POINT2[3];
int j = 0;

for (j = 0; j < 3; j++) {
savepoints[j] = new POINT2(points[j]);
}

points[0] = new POINT2(savepoints[0]);
points[0].style = 1;
points[1] = new POINT2(savepoints[1]);
points[1].style = 5;
points[2] = new POINT2(savepoints[2]);
points[2].style = 1;
points[3] = new POINT2(savepoints[0]);
points[3].style = 5;

} catch (Exception exc) {
ErrorLogger.LogException(_className ,"GetDISMDeceiveDouble",
new RendererException("Failed inside GetDISMDeceiveDouble", exc));
}
}

/**
* Calculates the points for DISRUPT
*
Expand Down Expand Up @@ -2289,7 +2514,7 @@ else if(side01==COLINEAR && side12==RIGHT_SIDE)
points[counter - 3].style = 5;
points[counter - 1].style = 5;

if (linetype != TacticalLines.MOBILE_DEFENSE) {
if (linetype == TacticalLines.RIP) {
// draw the arrowhead on line between savepoints 2 and 3
pts[0] = new POINT2(savepoints[2]);
pts[1] = new POINT2(savepoints[3]);
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/armyc2/c5isr/JavaLineArray/TacticalLines.java
Original file line number Diff line number Diff line change
Expand Up @@ -79,13 +79,17 @@ public final class TacticalLines {
public static final int PENETRATE = 211700000;
public static final int RETAIN = 211900000;
public static final int SECURE = 212100000;
public static final int CONTROL = 25343200;
public static final int LOCATE = 25343900;
public static final int SEIZE = 212300000;
public static final int CAPTURE = 25343000;
public static final int ASLTXING = 23221000;
public static final int GAP = 23163000;
public static final int COVER = 212230000;
public static final int SCREEN = 212210000;
public static final int GUARD = 212220000;
public static final int SARA = 22139000;
public static final int DECEIVE = 22310000;
public static final int FIX = 211100000;
public static final int PDF = 22422000;
public static final int ATKBYFIRE = 22533000;
Expand Down Expand Up @@ -128,6 +132,7 @@ public final class TacticalLines {
public static final int WITHDRAW = 212400000;
public static final int CORDONSEARCH = 212500000;
public static final int CORDONKNOCK = 212600000;
public static final int DENY = 25343400;
public static final int WDRAWUP = 212410000;
public static final int CFL = 24220000;
public static final int LOD = 22526000;
Expand Down Expand Up @@ -293,8 +298,11 @@ public final class TacticalLines {
public static final int NFA_RECTANGULAR = 24324200;
public static final int NFA_CIRCULAR = 24324300;
public static final int CHEM = 23460000;
public static final int CHEMT = 25271801;
public static final int BIO = 23450000;
public static final int BIOT = 25271701;
public static final int RAD = 23440000;
public static final int RADT = 25272001;
public static final int NUC = 271900;
public static final int NFL = 24230000;
public static final int MFP = 24225000;
Expand Down Expand Up @@ -516,9 +524,12 @@ public final class TacticalLines {
public static final int EXPLOIT = 25343100;
public static final int DEMONSTRATE = 25343300;
public static final int ENVELOPMENT = 25343500;
public static final int EXFILTRATION = 25343700;
public static final int INFILTRATION = 25343800;
public static final int PURSUIT = 25344000;
public static final int DISENGAGE = 25344400;
public static final int EVACUATE = 25344500;
public static final int ESCORT = 25343600;
public static final int DECISION_LINE = 25130701;
}

Loading