add Sphere graphic and update PointRender

This commit is contained in:
wyq 2023-02-04 16:55:45 +08:00
parent 47633c1f72
commit 02ddcc2d2d
12 changed files with 1239 additions and 242 deletions

View File

@ -41,16 +41,16 @@
<option name="name" value="boundlessgeo" />
<option name="url" value="http://repo.boundlessgeo.com/main/" />
</remote-repository>
<remote-repository>
<option name="id" value="sonatype-nexus-snapshots" />
<option name="name" value="Sonatype Nexus Snapshots" />
<option name="url" value="https://oss.sonatype.org/content/repositories/snapshots" />
</remote-repository>
<remote-repository>
<option name="id" value="freehep" />
<option name="name" value="freehep" />
<option name="url" value="https://java.freehep.org/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="sonatype-nexus-snapshots" />
<option name="name" value="Sonatype Nexus Snapshots" />
<option name="url" value="https://oss.sonatype.org/content/repositories/snapshots" />
</remote-repository>
<remote-repository>
<option name="id" value="boundless" />
<option name="name" value="boundlessgeo" />

View File

@ -188,7 +188,7 @@
<build>
<plugins>
<plugin>
<!--<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
@ -204,7 +204,7 @@
</configuration>
</execution>
</executions>
</plugin>
</plugin>-->
<plugin>
<inherited>true</inherited>
<groupId>org.apache.maven.plugins</groupId>

View File

@ -278,8 +278,7 @@ public class Cylinder {
* @param y Y coordinate
* @param z Z coordinate
*/
void addVertex(float x, float y, float z)
{
void addVertex(float x, float y, float z) {
vertices.add(new Vector3f(x, y, z));
}

View File

@ -0,0 +1,530 @@
package org.meteoinfo.chart.graphic.sphere;
import org.joml.Vector2f;
import org.joml.Vector3f;
import org.meteoinfo.chart.graphic.cylinder.Cylinder;
import java.util.ArrayList;
import java.util.List;
public class Sphere {
private float radius;
private int sectorCount; // longitude, # of slices
private int stackCount; // latitude, # of stacks
private boolean smooth;
private List<Vector3f> vertices;
private List<Vector3f> normals;
private List<Integer> indices;
private List<Integer> lineIndices;
private List<Vector2f> texCoords;
private List<Vector3f> interleavedVertices;
/**
* Constructor
* @param radius The sphere radius
* @param sectorCount The sector count
* @param stackCount The stack count
* @param smooth Whether smooth
*/
public Sphere(float radius, int sectorCount, int stackCount, boolean smooth) {
this.radius = radius;
this.sectorCount = sectorCount;
this.stackCount = stackCount;
this.smooth = smooth;
this.updateVertices();
}
/**
* Constructor
* @param radius The sphere radius
* @param sectorCount The sector count
* @param stackCount The stack count
*/
public Sphere(float radius, int sectorCount, int stackCount) {
this(radius, sectorCount, stackCount, true);
}
/**
* Update vertices
*/
public void updateVertices() {
if (smooth) {
buildVerticesSmooth();
} else {
buildVerticesFlat();
}
}
/**
* Get radius
* @return Radius
*/
public float getRadius() {
return this.radius;
}
/**
* Set radius
* @param value Radius
*/
public void setRadius(float value) {
if (this.radius != value) {
this.radius = value;
updateVertices();
}
}
/**
* Get sector count
* @return Sector count
*/
public int getSectorCount() {
return sectorCount;
}
/**
* Set sector count
* @param value Sector count
*/
public void setSectorCount(int value) {
if (this.sectorCount != value) {
this.sectorCount = value;
updateVertices();
}
}
/**
* Get stack count
* @return Stack count
*/
public int getStackCount() {
return stackCount;
}
/**
* Set stack count
* @param value stack count
*/
public void setStackCount(int value) {
if (this.stackCount != value) {
this.stackCount = value;
updateVertices();
}
}
/**
* Get smooth
* @return Smooth
*/
public boolean isSmooth() {
return smooth;
}
/**
* Set smooth
* @param value Smooth
*/
public void setSmooth(boolean value) {
if (this.smooth != value) {
this.smooth = value;
updateVertices();
}
}
/**
* Get vertices
* @return Vertices
*/
public List<Vector3f> getVertices() {
return vertices;
}
/**
* Get normals
* @return Normals
*/
public List<Vector3f> getNormals() {
return normals;
}
/**
* Get texture coordinates
* @return Texture coordinates
*/
public List<Vector2f> getTexCoords() {
return texCoords;
}
/**
* Get indices
* @return Indices
*/
public List<Integer> getIndices() {
return indices;
}
/**
* Get interleaved vertices
* @return Interleaved vertices
*/
public List<Vector3f> getInterleavedVertices() {
return interleavedVertices;
}
void clearArrays() {
this.vertices = new ArrayList<>();
this.normals = new ArrayList<>();
this.indices = new ArrayList<>();
this.lineIndices = new ArrayList<>();
this.texCoords = new ArrayList<>();
}
class Vertex {
public float x, y, z, s, t;
}
/**
* Add single vertex to array
* @param x X coordinate
* @param y Y coordinate
* @param z Z coordinate
*/
void addVertex(float x, float y, float z) {
vertices.add(new Vector3f(x, y, z));
}
/**
* Add single normal to array
* @param nx Normal x
* @param ny Normal y
* @param nz Normal z
*/
void addNormal(float nx, float ny, float nz)
{
normals.add(new Vector3f(nx, ny, nz));
}
void addNormal(Vector3f n) {
normals.add(n);
}
/**
* Add single texture coord to array
* @param s
* @param t
*/
void addTexCoord(float s, float t)
{
texCoords.add(new Vector2f(s, t));
}
/**
* Add 3 indices to array
* @param i1 Index 1
* @param i2 Index 2
* @param i3 Index 3
*/
void addIndices(int i1, int i2, int i3) {
indices.add(i1);
indices.add(i2);
indices.add(i3);
}
/**
* generate interleaved vertices: V/N/T
* stride must be 32 bytes
*/
void buildInterleavedVertices()
{
interleavedVertices = new ArrayList<>();
int i, j;
int count = vertices.size();
for(i = 0; i < count; i++)
{
interleavedVertices.add(vertices.get(i));
interleavedVertices.add(normals.get(i));
//interleavedVertices.add(texCoords.get(j));
//interleavedVertices.add(texCoords.get(j+1));
}
}
void buildVerticesSmooth() {
// clear memory of prev arrays
clearArrays();
float x, y, z, xy; // vertex position
float nx, ny, nz, lengthInv = 1.0f / radius; // normal
float s, t; // texCoord
float sectorStep = 2 * (float) Math.PI / sectorCount;
float stackStep = (float) Math.PI / stackCount;
float sectorAngle, stackAngle;
for(int i = 0; i <= stackCount; ++i)
{
stackAngle = (float) Math.PI / 2 - i * stackStep; // starting from pi/2 to -pi/2
xy = radius * (float) Math.cos(stackAngle); // r * cos(u)
z = radius * (float) Math.sin(stackAngle); // r * sin(u)
// add (sectorCount+1) vertices per stack
// the first and last vertices have same position and normal, but different tex coords
for(int j = 0; j <= sectorCount; ++j)
{
sectorAngle = j * sectorStep; // starting from 0 to 2pi
// vertex position
x = xy * (float) Math.cos(sectorAngle); // r * cos(u) * cos(v)
y = xy * (float) Math.sin(sectorAngle); // r * cos(u) * sin(v)
addVertex(x, y, z);
// normalized vertex normal
nx = x * lengthInv;
ny = y * lengthInv;
nz = z * lengthInv;
addNormal(nx, ny, nz);
// vertex tex coord between [0, 1]
s = (float)j / sectorCount;
t = (float)i / stackCount;
addTexCoord(s, t);
}
}
// indices
// k1--k1+1
// | / |
// | / |
// k2--k2+1
int k1, k2;
for(int i = 0; i < stackCount; ++i)
{
k1 = i * (sectorCount + 1); // beginning of current stack
k2 = k1 + sectorCount + 1; // beginning of next stack
for(int j = 0; j < sectorCount; ++j, ++k1, ++k2)
{
// 2 triangles per sector excluding 1st and last stacks
if(i != 0)
{
addIndices(k1, k2, k1+1); // k1---k2---k1+1
}
if(i != (stackCount-1))
{
addIndices(k1+1, k2, k2+1); // k1+1---k2---k2+1
}
// vertical lines for all stacks
lineIndices.add(k1);
lineIndices.add(k2);
if(i != 0) // horizontal lines except 1st stack
{
lineIndices.add(k1);
lineIndices.add(k1 + 1);
}
}
}
// generate interleaved vertex array as well
buildInterleavedVertices();
}
void buildVerticesFlat() {
// tmp vertex definition (x,y,z,s,t)
List<Sphere.Vertex> tmpVertices = new ArrayList<>();
float sectorStep = 2 * (float) Math.PI / sectorCount;
float stackStep = (float) Math.PI / stackCount;
float sectorAngle, stackAngle;
// compute all vertices first, each vertex contains (x,y,z,s,t) except normal
for(int i = 0; i <= stackCount; ++i)
{
stackAngle = (float) Math.PI / 2 - i * stackStep; // starting from pi/2 to -pi/2
float xy = radius * (float) Math.cos(stackAngle); // r * cos(u)
float z = radius * (float) Math.sin(stackAngle); // r * sin(u)
// add (sectorCount+1) vertices per stack
// the first and last vertices have same position and normal, but different tex coords
for(int j = 0; j <= sectorCount; ++j)
{
sectorAngle = j * sectorStep; // starting from 0 to 2pi
Vertex vertex = new Vertex();
vertex.x = xy * (float) Math.cos(sectorAngle); // x = r * cos(u) * cos(v)
vertex.y = xy * (float) Math.sin(sectorAngle); // y = r * cos(u) * sin(v)
vertex.z = z; // z = r * sin(u)
vertex.s = (float)j/sectorCount; // s
vertex.t = (float)i/stackCount; // t
tmpVertices.add(vertex);
}
}
// clear memory of prev arrays
clearArrays();
Vertex v1, v2, v3, v4; // 4 vertex positions and tex coords
float[] n; // 1 face normal
int i, j, k, vi1, vi2;
int index = 0; // index for vertex
for(i = 0; i < stackCount; ++i)
{
vi1 = i * (sectorCount + 1); // index of tmpVertices
vi2 = (i + 1) * (sectorCount + 1);
for(j = 0; j < sectorCount; ++j, ++vi1, ++vi2)
{
// get 4 vertices per sector
// v1--v3
// | |
// v2--v4
v1 = tmpVertices.get(vi1);
v2 = tmpVertices.get(vi2);
v3 = tmpVertices.get(vi1 + 1);
v4 = tmpVertices.get(vi2 + 1);
// if 1st stack and last stack, store only 1 triangle per sector
// otherwise, store 2 triangles (quad) per sector
if(i == 0) // a triangle for first stack ==========================
{
// put a triangle
addVertex(v1.x, v1.y, v1.z);
addVertex(v2.x, v2.y, v2.z);
addVertex(v4.x, v4.y, v4.z);
// put tex coords of triangle
addTexCoord(v1.s, v1.t);
addTexCoord(v2.s, v2.t);
addTexCoord(v4.s, v4.t);
// put normal
n = computeFaceNormal(v1.x,v1.y,v1.z, v2.x,v2.y,v2.z, v4.x,v4.y,v4.z);
for(k = 0; k < 3; ++k) // same normals for 3 vertices
{
addNormal(n[0], n[1], n[2]);
}
// put indices of 1 triangle
addIndices(index, index+1, index+2);
// indices for line (first stack requires only vertical line)
lineIndices.add(index);
lineIndices.add(index+1);
index += 3; // for next
}
else if(i == (stackCount-1)) // a triangle for last stack =========
{
// put a triangle
addVertex(v1.x, v1.y, v1.z);
addVertex(v2.x, v2.y, v2.z);
addVertex(v3.x, v3.y, v3.z);
// put tex coords of triangle
addTexCoord(v1.s, v1.t);
addTexCoord(v2.s, v2.t);
addTexCoord(v3.s, v3.t);
// put normal
n = computeFaceNormal(v1.x,v1.y,v1.z, v2.x,v2.y,v2.z, v3.x,v3.y,v3.z);
for(k = 0; k < 3; ++k) // same normals for 3 vertices
{
addNormal(n[0], n[1], n[2]);
}
// put indices of 1 triangle
addIndices(index, index+1, index+2);
// indices for lines (last stack requires both vert/hori lines)
lineIndices.add(index);
lineIndices.add(index+1);
lineIndices.add(index);
lineIndices.add(index+2);
index += 3; // for next
}
else // 2 triangles for others ====================================
{
// put quad vertices: v1-v2-v3-v4
addVertex(v1.x, v1.y, v1.z);
addVertex(v2.x, v2.y, v2.z);
addVertex(v3.x, v3.y, v3.z);
addVertex(v4.x, v4.y, v4.z);
// put tex coords of quad
addTexCoord(v1.s, v1.t);
addTexCoord(v2.s, v2.t);
addTexCoord(v3.s, v3.t);
addTexCoord(v4.s, v4.t);
// put normal
n = computeFaceNormal(v1.x,v1.y,v1.z, v2.x,v2.y,v2.z, v3.x,v3.y,v3.z);
for(k = 0; k < 4; ++k) // same normals for 4 vertices
{
addNormal(n[0], n[1], n[2]);
}
// put indices of quad (2 triangles)
addIndices(index, index+1, index+2);
addIndices(index+2, index+1, index+3);
// indices for lines
lineIndices.add(index);
lineIndices.add(index+1);
lineIndices.add(index);
lineIndices.add(index+2);
index += 4; // for next
}
}
}
// generate interleaved vertex array as well
buildInterleavedVertices();
}
///////////////////////////////////////////////////////////////////////////////
// return face normal of a triangle v1-v2-v3
// if a triangle has no surface (normal length = 0), then return a zero vector
///////////////////////////////////////////////////////////////////////////////
float[] computeFaceNormal(float x1, float y1, float z1, // v1
float x2, float y2, float z2, // v2
float x3, float y3, float z3) // v3
{
float EPSILON = 0.000001f;
float[] normal = new float[]{0.f, 0.f, 0.f}; // default return value (0,0,0)
float nx, ny, nz;
// find 2 edge vectors: v1-v2, v1-v3
float ex1 = x2 - x1;
float ey1 = y2 - y1;
float ez1 = z2 - z1;
float ex2 = x3 - x1;
float ey2 = y3 - y1;
float ez2 = z3 - z1;
// cross product: e1 x e2
nx = ey1 * ez2 - ez1 * ey2;
ny = ez1 * ex2 - ex1 * ez2;
nz = ex1 * ey2 - ey1 * ex2;
// normalize only if the length is > 0
float length = (float) Math.sqrt(nx * nx + ny * ny + nz * nz);
if(length > EPSILON) {
// normalize
float lengthInv = 1.0f / length;
normal[0] = nx * lengthInv;
normal[1] = ny * lengthInv;
normal[2] = nz * lengthInv;
}
return normal;
}
}

View File

@ -2501,9 +2501,9 @@ public class GLPlot extends Plot {
if (isDraw) {
switch (graphic.getGraphicN(0).getShape().getShapeType()) {
case POINT_Z:
if (((GraphicCollection3D) graphic).isSphere()) {
this.drawSpheres(gl, graphic);
} else {
//if (((GraphicCollection3D) graphic).isSphere()) {
// this.drawSpheres(gl, graphic);
//} else {
//this.drawPoints(gl, graphic);
if (!this.renderMap.containsKey(graphic)) {
renderMap.put(graphic, new PointRender(gl, (GraphicCollection3D) graphic));
@ -2514,7 +2514,7 @@ public class GLPlot extends Plot {
pointRender.setLighting(this.lighting);
pointRender.updateMatrix();
pointRender.draw();
}
//}
break;
case POLYLINE_Z:
if (graphic.getGraphicN(0).getShape() instanceof PipeShape) {

View File

@ -185,9 +185,7 @@ public class LineRender extends JOGLGraphicRender {
vertexPositionList.add(matrix.mul(v));
}
List<Vector3f> normals = cylinder.getNormals();
for (Vector3f v : normals) {
vertexNormalList.add(matrix.mul(v));
}
vertexNormalList.addAll(normals);
float[] color = slb.getColor().getRGBComponents(null);
for (int j = 0; j < n; j++) {
vertexColorList.add(new Vector4f(color));

View File

@ -3,7 +3,10 @@ package org.meteoinfo.chart.render.jogl;
import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.util.GLBuffers;
import org.joml.Vector3f;
import org.joml.Vector4f;
import org.meteoinfo.chart.graphic.GraphicCollection3D;
import org.meteoinfo.chart.graphic.sphere.Sphere;
import org.meteoinfo.chart.jogl.Program;
import org.meteoinfo.chart.jogl.Transform;
import org.meteoinfo.chart.jogl.Utils;
@ -13,6 +16,7 @@ import org.meteoinfo.geometry.shape.PointZ;
import org.meteoinfo.geometry.shape.PointZShape;
import org.meteoinfo.geometry.shape.Polyline;
import org.meteoinfo.geometry.shape.PolylineZShape;
import org.meteoinfo.math.Matrix4f;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
@ -24,12 +28,17 @@ public class PointRender extends JOGLGraphicRender {
private GraphicCollection3D graphics;
private IntBuffer vbo;
private Program program;
private int vertexNum;
private int pointNum;
private int sizePosition;
private int sizeColor;
private int sizeNormal;
private float[] vertexColor;
private float pointSize;
private boolean sphere;
private float sphereScale = 0.005f;
private float[] vertexPosition;
private float[] vertexNormal;
private float[] vertexColor;
private int[] vertexIndices;
/**
* Constructor
@ -59,10 +68,20 @@ public class PointRender extends JOGLGraphicRender {
this(gl);
this.graphics = pointGraphics;
this.vertexNum = pointGraphics.getNumGraphics();
this.sphere = this.graphics.isSphere();
this.pointNum = pointGraphics.getNumGraphics();
PointBreak pb = (PointBreak) this.graphics.getGraphicN(0).getLegend();
this.pointSize = pb.getSize();
this.updateVertexColor();
//this.updateVertex();
}
void updateVertex() {
if (this.sphere) {
this.updateSphereVertex();
} else {
this.updateVertexPosition();
this.updateVertexColor();
}
}
void compileShaders() throws Exception {
@ -76,7 +95,7 @@ public class PointRender extends JOGLGraphicRender {
}
private void updateVertexColor() {
this.vertexColor = new float[this.vertexNum * 4];
this.vertexColor = new float[this.pointNum * 4];
int i = 0;
float[] color;
for (Graphic graphic : this.graphics.getGraphics()) {
@ -87,19 +106,110 @@ public class PointRender extends JOGLGraphicRender {
}
}
private float[] getVertexPosition() {
float[] vertexData = new float[this.vertexNum * 3];
int i = 0;
private void updateVertexPosition() {
if (this.sphere) {
this.updateSphereVertexPosition();
} else {
this.vertexPosition = new float[this.pointNum * 3];
int i = 0;
for (Graphic graphic : this.graphics.getGraphics()) {
PointZShape shape = (PointZShape) graphic.getShape();
PointZ p = (PointZ) shape.getPoint();
vertexPosition[i] = transform.transform_x((float) p.X);
vertexPosition[i + 1] = transform.transform_y((float) p.Y);
vertexPosition[i + 2] = transform.transform_z((float) p.Z);
i += 3;
}
}
}
private void updateSphereVertex() {
List<Vector3f> vertexPositionList = new ArrayList<>();
List<Vector3f> vertexNormalList = new ArrayList<>();
List<Vector4f> vertexColorList = new ArrayList<>();
List<Integer> vertexIndexList = new ArrayList<>();
Vector3f vp;
for (Graphic graphic : this.graphics.getGraphics()) {
PointZShape shape = (PointZShape) graphic.getShape();
PointZ p = (PointZ) shape.getPoint();
vertexData[i] = transform.transform_x((float) p.X);
vertexData[i + 1] = transform.transform_y((float) p.Y);
vertexData[i + 2] = transform.transform_z((float) p.Z);
i += 3;
PointBreak pb = (PointBreak) graphic.getLegend();
Sphere sphere = new Sphere(pb.getSize() * sphereScale * dpiScale, 36, 18);
vp = transform.transform((float) p.X, (float) p.Y, (float) p.Z);
Matrix4f matrix = new Matrix4f();
matrix.translate(vp);
List<Vector3f> vertices = sphere.getVertices();
int n = vertices.size();
int nAdded = vertexPositionList.size();
for (Vector3f v : vertices) {
vertexPositionList.add(matrix.mul(v));
}
List<Vector3f> normals = sphere.getNormals();
vertexNormalList.addAll(normals);
float[] color = pb.getColor().getRGBComponents(null);
for (int j = 0; j < n; j++) {
vertexColorList.add(new Vector4f(color));
}
if (nAdded == 0) {
vertexIndexList.addAll(sphere.getIndices());
} else {
for (int idx : sphere.getIndices()) {
vertexIndexList.add(idx + nAdded);
}
}
}
return vertexData;
int n = vertexPositionList.size();
this.vertexPosition = new float[n * 3];
this.vertexNormal = new float[n * 3];
this.vertexColor = new float[n * 4];
Vector3f v;
Vector4f v4;
for (int i = 0, j = 0, k = 0; i < n; i++, j+=3, k+=4) {
v = vertexPositionList.get(i);
vertexPosition[j] = v.x;
vertexPosition[j + 1] = v.y;
vertexPosition[j + 2] = v.z;
v = vertexNormalList.get(i);
vertexNormal[j] = v.x;
vertexNormal[j + 1] = v.y;
vertexNormal[j + 2] = v.z;
v4 = vertexColorList.get(i);
vertexColor[k] = v4.x;
vertexColor[k + 1] = v4.y;
vertexColor[k + 2] = v4.z;
vertexColor[k + 3] = v4.w;
}
vertexIndices = vertexIndexList.stream().mapToInt(Integer::intValue).toArray();
}
private void updateSphereVertexPosition() {
List<Vector3f> vertexPositionList = new ArrayList<>();
Vector3f vp;
for (Graphic graphic : this.graphics.getGraphics()) {
PointZShape shape = (PointZShape) graphic.getShape();
PointZ p = (PointZ) shape.getPoint();
PointBreak pb = (PointBreak) graphic.getLegend();
Sphere sphere = new Sphere(pb.getSize() * sphereScale * dpiScale, 36, 18);
vp = transform.transform((float) p.X, (float) p.Y, (float) p.Z);
Matrix4f matrix = new Matrix4f();
matrix.translate(vp);
List<Vector3f> vertices = sphere.getVertices();
int n = vertices.size();
int nAdded = vertexPositionList.size();
for (Vector3f v : vertices) {
vertexPositionList.add(matrix.mul(v));
}
}
int n = vertexPositionList.size();
this.vertexPosition = new float[n * 3];
Vector3f v;
for (int i = 0, j = 0, k = 0; i < n; i++, j+=3, k+=4) {
v = vertexPositionList.get(i);
vertexPosition[j] = v.x;
vertexPosition[j + 1] = v.y;
vertexPosition[j + 2] = v.z;
}
}
@Override
@ -111,20 +221,47 @@ public class PointRender extends JOGLGraphicRender {
super.setTransform((Transform) transform.clone());
if (updateBuffer) {
float[] vertexData = this.getVertexPosition();
FloatBuffer vertexBuffer = GLBuffers.newDirectFloatBuffer(vertexData);
if (this.vertexPosition == null) {
this.updateVertex();
} else {
//this.updateVertex();
this.updateVertexPosition();
}
FloatBuffer vertexBuffer = GLBuffers.newDirectFloatBuffer(this.vertexPosition);
sizePosition = vertexBuffer.capacity() * Float.BYTES;
FloatBuffer colorBuffer = GLBuffers.newDirectFloatBuffer(vertexColor);
sizeColor = colorBuffer.capacity() * Float.BYTES;
int totalSize = sizePosition + sizeColor;
gl.glGenBuffers(1, vbo);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo.get(0));
gl.glBufferData(GL.GL_ARRAY_BUFFER, totalSize, null, GL.GL_STATIC_DRAW);
gl.glBufferSubData(GL.GL_ARRAY_BUFFER, 0, sizePosition, vertexBuffer);
gl.glBufferSubData(GL.GL_ARRAY_BUFFER, sizePosition, sizeColor, colorBuffer);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
if (this.sphere) {
FloatBuffer normalBuffer = GLBuffers.newDirectFloatBuffer(vertexNormal);
sizeNormal = normalBuffer.capacity() * Float.BYTES;
int totalSize = sizePosition + sizeColor + sizeNormal;
vbo = GLBuffers.newDirectIntBuffer(2);
gl.glGenBuffers(2, vbo);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo.get(0));
gl.glBufferData(GL.GL_ARRAY_BUFFER, totalSize, null, GL.GL_STATIC_DRAW);
gl.glBufferSubData(GL.GL_ARRAY_BUFFER, 0, sizePosition, vertexBuffer);
gl.glBufferSubData(GL.GL_ARRAY_BUFFER, sizePosition, sizeColor, colorBuffer);
gl.glBufferSubData(GL.GL_ARRAY_BUFFER, sizePosition + sizeColor, sizeNormal, normalBuffer);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
IntBuffer indexBuffer = GLBuffers.newDirectIntBuffer(this.vertexIndices);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, vbo.get(1));
gl.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, indexBuffer.capacity() * Integer.BYTES, indexBuffer, GL.GL_STATIC_DRAW);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0);
} else {
int totalSize = sizePosition + sizeColor;
gl.glGenBuffers(1, vbo);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo.get(0));
gl.glBufferData(GL.GL_ARRAY_BUFFER, totalSize, null, GL.GL_STATIC_DRAW);
gl.glBufferSubData(GL.GL_ARRAY_BUFFER, 0, sizePosition, vertexBuffer);
gl.glBufferSubData(GL.GL_ARRAY_BUFFER, sizePosition, sizeColor, colorBuffer);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
}
}
}
@ -147,22 +284,38 @@ public class PointRender extends JOGLGraphicRender {
gl.glVertexPointer(3, GL.GL_FLOAT, 0, 0);
gl.glEnableClientState(GL2.GL_COLOR_ARRAY);
gl.glColorPointer(4, GL.GL_FLOAT, 0, sizePosition);
if (this.sphere) {
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, vbo.get(1));
boolean lightEnabled = this.lighting.isEnable();
if (lightEnabled) {
this.lighting.stop(gl);
gl.glEnableClientState(GL2.GL_NORMAL_ARRAY);
gl.glNormalPointer(GL.GL_FLOAT, 0, sizePosition + sizeColor);
//gl.glEnable(GL.GL_CULL_FACE);
gl.glDrawElements(GL2.GL_TRIANGLES, this.vertexIndices.length, GL.GL_UNSIGNED_INT, 0);
gl.glDisableClientState(GL2.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL2.GL_COLOR_ARRAY);
gl.glDisableClientState(GL2.GL_NORMAL_ARRAY);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0);
} else {
boolean lightEnabled = this.lighting.isEnable();
if (lightEnabled) {
this.lighting.stop(gl);
}
gl.glPointSize(this.pointSize * this.dpiScale);
gl.glDrawArrays(GL.GL_POINTS, 0, this.pointNum);
if (lightEnabled) {
this.lighting.start(gl);
}
gl.glDisableClientState(GL2.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL2.GL_COLOR_ARRAY);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
}
gl.glPointSize(this.pointSize * this.dpiScale);
gl.glDrawArrays(GL.GL_POINTS, 0, this.vertexNum);
if (lightEnabled) {
this.lighting.start(gl);
}
gl.glDisableClientState(GL2.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL2.GL_COLOR_ARRAY);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
}
}
}

View File

@ -0,0 +1,238 @@
import com.jogamp.opengl.*;
import com.jogamp.opengl.awt.GLCanvas;
import com.jogamp.opengl.awt.GLJPanel;
import com.jogamp.opengl.util.FPSAnimator;
import com.jogamp.opengl.util.GLBuffers;
import org.joml.Vector3f;
import org.joml.Vector4f;
import org.meteoinfo.chart.graphic.GraphicCollection3D;
import org.meteoinfo.chart.graphic.GraphicFactory;
import org.meteoinfo.chart.graphic.sphere.Sphere;
import org.meteoinfo.geometry.graphic.Graphic;
import org.meteoinfo.geometry.legend.PointBreak;
import org.meteoinfo.geometry.shape.PointZ;
import org.meteoinfo.geometry.shape.PointZShape;
import org.meteoinfo.math.Matrix4f;
import org.meteoinfo.ndarray.Array;
import org.meteoinfo.ndarray.math.ArrayMath;
import org.meteoinfo.ndarray.math.ArrayUtil;
import javax.swing.*;
import java.awt.*;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.util.ArrayList;
import java.util.List;
public class SphereTest implements GLEventListener {
private List<Sphere> spheres;
private IntBuffer vbo;
private int sizePosition;
private int sizeColor;
private int sizeNormal;
private float[] vertexPosition;
private float[] vertexNormal;
private float[] vertexColor;
private int[] vertexIndices;
private float rquad = 0.0f;
public SphereTest() {
vbo = GLBuffers.newDirectIntBuffer(2);
createSpheres(3);
updateSphereVertex();
}
void createSpheres(int n) {
this.spheres = new ArrayList<>();
for (int i = 0; i < n; i++) {
this.spheres.add(new Sphere(0.1f, 36, 18));
}
}
private void updateSphereVertex() {
List<Vector3f> vertexPositionList = new ArrayList<>();
List<Vector3f> vertexNormalList = new ArrayList<>();
List<Vector4f> vertexColorList = new ArrayList<>();
List<Integer> vertexIndexList = new ArrayList<>();
Vector3f vp;
int idx = 0, sn = this.spheres.size();
float max = 0.5f;
float x, y, z;
for (Sphere sphere : this.spheres) {
z = max / sn * idx;
x = z * (float) Math.sin(z * 20);
y = z * (float) Math.sin(z * 20);
vp = new Vector3f(x, y, z);
Matrix4f matrix = new Matrix4f();
matrix.translate(vp);
List<Vector3f> vertices = sphere.getVertices();
int n = vertices.size();
int nAdded = vertexPositionList.size();
for (Vector3f v : vertices) {
vertexPositionList.add(matrix.mul(v));
}
List<Vector3f> normals = sphere.getNormals();
vertexNormalList.addAll(normals);
float[] color = Color.RED.getRGBComponents(null);
for (int j = 0; j < n; j++) {
vertexColorList.add(new Vector4f(color));
}
if (nAdded == 0) {
vertexIndexList.addAll(sphere.getIndices());
} else {
for (int ii : sphere.getIndices()) {
vertexIndexList.add(ii + nAdded);
}
}
idx += 1;
}
int n = vertexPositionList.size();
this.vertexPosition = new float[n * 3];
this.vertexNormal = new float[n * 3];
this.vertexColor = new float[n * 4];
Vector3f v;
Vector4f v4;
for (int i = 0, j = 0, k = 0; i < n; i++, j+=3, k+=4) {
v = vertexPositionList.get(i);
vertexPosition[j] = v.x;
vertexPosition[j + 1] = v.y;
vertexPosition[j + 2] = v.z;
v = vertexNormalList.get(i);
vertexNormal[j] = v.x;
vertexNormal[j + 1] = v.y;
vertexNormal[j + 2] = v.z;
v4 = vertexColorList.get(i);
vertexColor[k] = v4.x;
vertexColor[k + 1] = v4.y;
vertexColor[k + 2] = v4.z;
vertexColor[k + 3] = v4.w;
}
vertexIndices = vertexIndexList.stream().mapToInt(Integer::intValue).toArray();
}
private void updateBuffer(GL2 gl) {
FloatBuffer vertexBuffer = GLBuffers.newDirectFloatBuffer(this.vertexPosition);
sizePosition = vertexBuffer.capacity() * Float.BYTES;
FloatBuffer colorBuffer = GLBuffers.newDirectFloatBuffer(vertexColor);
sizeColor = colorBuffer.capacity() * Float.BYTES;
FloatBuffer normalBuffer = GLBuffers.newDirectFloatBuffer(vertexNormal);
sizeNormal = normalBuffer.capacity() * Float.BYTES;
int totalSize = sizePosition + sizeColor + sizeNormal;
gl.glGenBuffers(2, vbo);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo.get(0));
gl.glBufferData(GL.GL_ARRAY_BUFFER, totalSize, null, GL.GL_STATIC_DRAW);
gl.glBufferSubData(GL.GL_ARRAY_BUFFER, 0, sizePosition, vertexBuffer);
gl.glBufferSubData(GL.GL_ARRAY_BUFFER, sizePosition, sizeColor, colorBuffer);
gl.glBufferSubData(GL.GL_ARRAY_BUFFER, sizePosition + sizeColor, sizeNormal, normalBuffer);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
IntBuffer indexBuffer = GLBuffers.newDirectIntBuffer(this.vertexIndices);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, vbo.get(1));
gl.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, indexBuffer.capacity() * Integer.BYTES, indexBuffer, GL.GL_STATIC_DRAW);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0);
}
@Override
public void init(GLAutoDrawable glAutoDrawable) {
GL2 gl = glAutoDrawable.getGL().getGL2();
updateBuffer(gl);
gl.glShadeModel( GL2.GL_SMOOTH );
gl.glClearColor( 0f, 0f, 0f, 0f );
gl.glClearDepth( 1.0f );
gl.glEnable( GL2.GL_DEPTH_TEST );
gl.glDepthFunc( GL2.GL_LEQUAL );
gl.glHint( GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST );
gl.glEnable(GL2.GL_COLOR_MATERIAL);
gl.glEnable(GL2.GL_LIGHTING);
gl.glEnable(GL2.GL_LIGHT1);
//gl.glEnable(GL2.GL_AUTO_NORMAL);
//gl.glEnable(GLLightingFunc.GL_NORMALIZE);
gl.glLightModelfv(GL2.GL_LIGHT_MODEL_AMBIENT, new float[]{0.2f, 0.2f, 0.2f, 1.f}, 0);
//gl.glLightfv(this.light, GL2.GL_AMBIENT, ambient, 0);
gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_SPECULAR, new float[]{1.f, 1.f, 1.f, 1.f}, 0);
gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_DIFFUSE, new float[]{1.f, 1.f, 1.f, 1.f}, 0);
gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_POSITION, new float[]{0.f, 0.f, 1.f, 0.f}, 0);
//Material
gl.glMaterialfv(GL2.GL_FRONT_AND_BACK, GL2.GL_AMBIENT, new float[]{0.2f, 0.2f, 0.2f, 1.f}, 0);
gl.glMaterialfv(GL2.GL_FRONT_AND_BACK, GL2.GL_DIFFUSE, new float[]{0.8f, 0.8f, 0.8f, 1.f}, 0);
gl.glMaterialfv(GL2.GL_FRONT_AND_BACK, GL2.GL_SPECULAR, new float[]{1.f, 1.f, 1.f, 1.f}, 0);
gl.glMaterialf(GL2.GL_FRONT_AND_BACK, GL2.GL_SHININESS, 50);
}
@Override
public void dispose(GLAutoDrawable glAutoDrawable) {
}
@Override
public void display(GLAutoDrawable glAutoDrawable) {
GL2 gl = glAutoDrawable.getGL().getGL2();
gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT );
gl.glLoadIdentity();
// Rotate The Cube On X, Y & Z
gl.glRotatef(rquad, 1.0f, 1.0f, 1.0f);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo.get(0));
// enable vertex arrays
gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL.GL_FLOAT, 0, 0);
gl.glEnableClientState(GL2.GL_COLOR_ARRAY);
gl.glColorPointer(4, GL.GL_FLOAT, 0, sizePosition);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, vbo.get(1));
gl.glEnableClientState(GL2.GL_NORMAL_ARRAY);
gl.glNormalPointer(GL.GL_FLOAT, 0, sizePosition + sizeColor);
gl.glEnable(GL.GL_CULL_FACE);
gl.glDrawElements(GL2.GL_TRIANGLES, this.vertexIndices.length, GL.GL_UNSIGNED_INT, 0);
gl.glDisableClientState(GL2.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL2.GL_COLOR_ARRAY);
gl.glDisableClientState(GL2.GL_NORMAL_ARRAY);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0);
rquad -= 0.15f;
}
@Override
public void reshape(GLAutoDrawable glAutoDrawable, int i, int i1, int i2, int i3) {
}
public static void main(String[] args) {
//getting the capabilities object of GL2 profile
final GLProfile profile = GLProfile.get(GLProfile.GL2);
GLCapabilities capabilities = new GLCapabilities(profile);
// The canvas
final GLJPanel glcanvas = new GLJPanel(capabilities);
SphereTest sphereTest = new SphereTest();
glcanvas.addGLEventListener(sphereTest);
//creating frame
final JFrame frame = new JFrame ("Sphere test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
//adding canvas to frame
frame.getContentPane().add(glcanvas);
frame.setVisible(true);
final FPSAnimator animator = new FPSAnimator(glcanvas, 300, true);
animator.start();
}
}

View File

@ -0,0 +1,81 @@
import com.jogamp.opengl.*;
import com.jogamp.opengl.awt.GLJPanel;
import com.jogamp.opengl.util.GLBuffers;
import org.joml.Vector3f;
import org.joml.Vector4f;
import org.meteoinfo.chart.GLChart;
import org.meteoinfo.chart.GLChartPanel;
import org.meteoinfo.chart.MouseMode;
import org.meteoinfo.chart.graphic.GraphicCollection3D;
import org.meteoinfo.chart.graphic.GraphicFactory;
import org.meteoinfo.chart.graphic.sphere.Sphere;
import org.meteoinfo.chart.jogl.GLPlot;
import org.meteoinfo.chart.jogl.Lighting;
import org.meteoinfo.common.Extent3D;
import org.meteoinfo.geometry.legend.ColorBreak;
import org.meteoinfo.geometry.legend.PointBreak;
import org.meteoinfo.ndarray.Array;
import org.meteoinfo.ndarray.DataType;
import org.meteoinfo.ndarray.math.ArrayMath;
import org.meteoinfo.ndarray.math.ArrayUtil;
import javax.swing.*;
import java.awt.*;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
public class SphereTest1 {
GraphicCollection3D createSpheres() {
int[] shape = new int[]{1};
Array z = ArrayUtil.lineSpace(0., 1., 10, true);
Array x = ArrayMath.mul(z, ArrayMath.sin(ArrayMath.mul(z, 20)));
Array y = ArrayMath.mul(z, ArrayMath.sin(ArrayMath.mul(z, 20)));
PointBreak cb = new PointBreak();
cb.setSize(50);
cb.setColor(Color.RED);
GraphicCollection3D graphics = (GraphicCollection3D) GraphicFactory.createPoints3D(x, y, z, cb);
graphics.setSphere(true);
return graphics;
}
public static void main(String[] args) {
JFrame frame = new JFrame("Volume Test");
GLPlot plot = new GLPlot();
plot.setOrthographic(true);
plot.setClipPlane(false);
//plot.setBackground(Color.black);
//plot.setForeground(Color.blue);
plot.setDrawBoundingBox(true);
plot.setDrawBase(true);
plot.setBoxed(true);
plot.setDisplayXY(true);
//plot.getXAxis().setDrawTickLabel(false);
//plot.getYAxis().setDrawTickLabel(false);
plot.setDisplayZ(true);
plot.getZAxis().setLabel("Z axis");
//plot.getGridLine().setDrawXLine(false);
//plot.getGridLine().setDrawYLine(false);
//plot.getGridLine().setDrawZLine(false);
SphereTest1 test = new SphereTest1();
GraphicCollection3D graphics = test.createSpheres();
plot.addGraphic(graphics);
plot.setDrawExtent(new Extent3D(-2, 2, -2, 2, -2, 2));
plot.setAntialias(true);
Lighting lighting = plot.getLighting();
lighting.setEnable(true);
lighting.setMaterialSpecular(1.0f);
GLChartPanel canvas = new GLChartPanel(new GLChart());
canvas.getChart().addPlot(plot);
canvas.setMouseMode(MouseMode.ROTATE);
frame.getContentPane().add(canvas);
frame.pack();
frame.setSize(600, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

View File

@ -22,22 +22,103 @@
</library>
</orderEntry>
<orderEntry type="module" module-name="meteoinfo-chart" />
<orderEntry type="module" module-name="meteoinfo-console" />
<orderEntry type="library" name="Maven: de.sciss:docking-frames-common:2.0.0" level="project" />
<orderEntry type="library" name="Maven: de.sciss:docking-frames-core:2.0.0" level="project" />
<orderEntry type="module" module-name="meteoinfo-geo" />
<orderEntry type="module" module-name="meteoinfo-ui" />
<orderEntry type="library" name="Maven: org.meteothink:wContour:1.7.1" level="project" />
<orderEntry type="library" name="Maven: org.scilab.forge:jlatexmath:1.0.7" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.12.0" level="project" />
<orderEntry type="library" name="Maven: com.l2fprod:l2fprod-common-all:0.1" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt-main:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all-main:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.joml:joml:1.10.4" level="project" />
<orderEntry type="library" name="Maven: org.python:jython-standalone:2.7.3" level="project" />
<orderEntry type="library" name="Maven: com.fifesoft:rsyntaxtextarea:3.3.2" level="project" />
<orderEntry type="library" name="Maven: com.fifesoft:autocomplete:3.3.0" level="project" />
<orderEntry type="module" module-name="meteoinfo-ndarray" />
<orderEntry type="module" module-name="meteoinfo-math" />
<orderEntry type="module" module-name="meteoinfo-geometry" />
<orderEntry type="module" module-name="meteoinfo-table" />
<orderEntry type="module" module-name="meteoinfo-image" />
<orderEntry type="module" module-name="meteoinfo-data" />
<orderEntry type="library" name="Maven: com.formdev:flatlaf:3.0" level="project" />
<orderEntry type="library" name="Maven: com.formdev:flatlaf-extras:3.0" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-util:2.0.2" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-emf:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-pdf:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphics2d:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-ps:2.4" level="project" />
<orderEntry type="library" name="Maven: com.itextpdf:itextpdf:5.5.13.3" level="project" />
<orderEntry type="module" module-name="meteoinfo-common" />
<orderEntry type="library" name="Maven: com.toedter:jcalendar:1.4" level="project" />
<orderEntry type="library" name="Maven: org.scilab.forge:jlatexmath-font-greek:1.0.7" level="project" />
<orderEntry type="library" name="Maven: org.scilab.forge:jlatexmath-font-cyrillic:1.0.7" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-android-aarch64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-linux-amd64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-linux-armv6hf:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-linux-aarch64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-macosx-universal:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-windows-amd64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: antlr:antlr:2.7.7" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-android-aarch64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-linux-amd64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-linux-armv6hf:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-linux-aarch64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-macosx-universal:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-windows-amd64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math4-legacy:4.0-beta1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-core:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-gamma:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-combinatorics:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-arrays:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-field:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-rng-core:1.5" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-rng-simple:1.5" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-rng-client-api:1.5" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-statistics-distribution:1.0" level="project" />
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:2.1.0" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-experimental:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-simple:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ojalgo:ojalgo:52.0.1" level="project" />
<orderEntry type="library" name="Maven: com.github.haifengl:smile-interpolation:2.6.0" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp-platform:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas-platform:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.locationtech.jts:jts-core:1.19.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-imaging:1.0-alpha3" level="project" />
<orderEntry type="library" name="Maven: com.twelvemonkeys.imageio:imageio-jpeg:3.9.4" level="project" />
<orderEntry type="module" module-name="meteoinfo-projection" />
<orderEntry type="module" module-name="meteoinfo-dataframe" />
<orderEntry type="library" name="Maven: edu.ucar:netcdfAll:5.5.3" level="project" />
<orderEntry type="library" name="Maven: com.github.albfernandez:juniversalchardet:2.4.0" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.11.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-compress:1.21" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: com.formdev:svgSalamander:1.1.3" level="project" />
<orderEntry type="library" name="Maven: org.netbeans:openide-lookup:1.9-patched-1.0" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-tests:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsbase:2.4" level="project" />
<orderEntry type="library" name="Maven: junit:junit:4.10" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava:31.1-jre" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-complex:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-angle:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-rootfinder:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-quaternion:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-rng-sampling:1.5" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math4-legacy-exception:4.0-beta1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math4-legacy-core:4.0-beta1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-fraction:1.1" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-core:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-ddense:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-dsparse:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-zdense:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-simple:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-fdense:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-cdense:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-fsparse:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ojalgo:ojalgo:52.0.1" level="project" />
<orderEntry type="library" name="Maven: com.github.haifengl:smile-interpolation:2.6.0" level="project" />
<orderEntry type="library" name="Maven: com.github.haifengl:smile-math:2.6.0" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp-platform:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:android-arm:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:android-arm64:1.5.4" level="project" />
@ -53,7 +134,6 @@
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:macosx-x86_64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:windows-x86:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:windows-x86_64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas-platform:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:android-arm:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:android-arm64:0.3.10-1.5.4" level="project" />
@ -69,102 +149,22 @@
<orderEntry type="library" name="Maven: org.bytedeco:openblas:macosx-x86_64:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:windows-x86:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:windows-x86_64:0.3.10-1.5.4" level="project" />
<orderEntry type="module" module-name="meteoinfo-geometry" />
<orderEntry type="library" name="Maven: org.locationtech.jts:jts-core:1.19.0" level="project" />
<orderEntry type="module" module-name="meteoinfo-table" />
<orderEntry type="module" module-name="meteoinfo-image" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-imaging:1.0-alpha3" level="project" />
<orderEntry type="library" name="Maven: com.twelvemonkeys.imageio:imageio-jpeg:3.9.4" level="project" />
<orderEntry type="library" name="Maven: com.twelvemonkeys.imageio:imageio-core:3.9.4" level="project" />
<orderEntry type="library" name="Maven: com.twelvemonkeys.imageio:imageio-metadata:3.9.4" level="project" />
<orderEntry type="library" name="Maven: com.twelvemonkeys.common:common-lang:3.9.4" level="project" />
<orderEntry type="library" name="Maven: com.twelvemonkeys.common:common-io:3.9.4" level="project" />
<orderEntry type="library" name="Maven: com.twelvemonkeys.common:common-image:3.9.4" level="project" />
<orderEntry type="module" module-name="meteoinfo-data" />
<orderEntry type="module" module-name="meteoinfo-projection" />
<orderEntry type="library" name="Maven: org.locationtech.proj4j:proj4j:1.2.2" level="project" />
<orderEntry type="library" name="Maven: net.sf.geographiclib:GeographicLib-Java:2.0" level="project" />
<orderEntry type="module" module-name="meteoinfo-dataframe" />
<orderEntry type="library" name="Maven: edu.ucar:netcdfAll:5.5.3" level="project" />
<orderEntry type="library" name="Maven: com.github.albfernandez:juniversalchardet:2.4.0" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.11.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-compress:1.21" level="project" />
<orderEntry type="library" name="Maven: com.formdev:flatlaf:3.0" level="project" />
<orderEntry type="library" name="Maven: com.formdev:flatlaf-extras:3.0" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: com.formdev:svgSalamander:1.1.3" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-util:2.0.2" level="project" />
<orderEntry type="library" name="Maven: org.netbeans:openide-lookup:1.9-patched-1.0" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-emf:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-io:2.2.2" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-tests:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsbase:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-pdf:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphics2d:2.4" level="project" />
<orderEntry type="library" name="Maven: junit:junit:4.10" level="project" />
<orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.1" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-ps:2.4" level="project" />
<orderEntry type="library" name="Maven: com.itextpdf:itextpdf:5.5.13.3" level="project" />
<orderEntry type="module" module-name="meteoinfo-ui" />
<orderEntry type="module" module-name="meteoinfo-common" />
<orderEntry type="library" name="Maven: com.google.guava:guava:31.1-jre" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:failureaccess:1.0.1" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava" level="project" />
<orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:3.0.2" level="project" />
<orderEntry type="library" name="Maven: org.checkerframework:checker-qual:3.12.0" level="project" />
<orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.11.0" level="project" />
<orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.3" level="project" />
<orderEntry type="library" name="Maven: com.toedter:jcalendar:1.4" level="project" />
<orderEntry type="library" name="Maven: org.meteothink:wContour:1.7.1" level="project" />
<orderEntry type="library" name="Maven: org.scilab.forge:jlatexmath:1.0.7" level="project" />
<orderEntry type="library" name="Maven: org.scilab.forge:jlatexmath-font-greek:1.0.7" level="project" />
<orderEntry type="library" name="Maven: org.scilab.forge:jlatexmath-font-cyrillic:1.0.7" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.12.0" level="project" />
<orderEntry type="library" name="Maven: com.l2fprod:l2fprod-common-all:0.1" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt-main:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-android-aarch64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-linux-amd64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-linux-armv6hf:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-linux-aarch64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-macosx-universal:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-windows-amd64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: antlr:antlr:2.7.7" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all-main:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-android-aarch64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-linux-amd64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-linux-armv6hf:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-linux-aarch64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-macosx-universal:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-windows-amd64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.joml:joml:1.10.4" level="project" />
<orderEntry type="module" module-name="meteoinfo-console" />
<orderEntry type="library" name="Maven: org.python:jython-standalone:2.7.3" level="project" />
<orderEntry type="library" name="Maven: com.fifesoft:rsyntaxtextarea:3.3.2" level="project" />
<orderEntry type="library" name="Maven: com.fifesoft:autocomplete:3.3.0" level="project" />
<orderEntry type="module" module-name="meteoinfo-ndarray" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math4-legacy:4.0-beta1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-complex:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-angle:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-rootfinder:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-quaternion:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-rng-sampling:1.5" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math4-legacy-exception:4.0-beta1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math4-legacy-core:4.0-beta1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math4-core:4.0-beta1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-core:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-gamma:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-fraction:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-combinatorics:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-arrays:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-field:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-rng-core:1.5" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-rng-simple:1.5" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-rng-client-api:1.5" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-statistics-distribution:1.0" level="project" />
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:2.1.0" level="project" />
<orderEntry type="library" name="Maven: de.sciss:docking-frames-common:2.0.0" level="project" />
<orderEntry type="library" name="Maven: de.sciss:docking-frames-core:2.0.0" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
</component>
</module>

View File

@ -1,34 +1,32 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<MeteoInfo File="milconfig.xml" Type="configurefile">
<Path OpenPath="D:\Working\MIScript\Jython\mis\test">
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\map"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\map\geoshow"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\pie"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\dataframe"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\surf"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\3d_earth"/>
<Path OpenPath="D:\Working\MIScript\Jython\mis\plot_types\3d\3d_earth">
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\array"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\math"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\new"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\others"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\test"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io\radar"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\scatter"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\quiver"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math\interpolate"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\surf"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\3d_earth"/>
</Path>
<File>
<OpenedFiles>
<OpenedFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\surf\surf_pumpkin_1.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\test\array_test_numjy.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\test\array_test_loop.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\test\array_test_dot.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\3d_earth\scatter_sphere.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\3d_earth\scatter.py"/>
</OpenedFiles>
<RecentFiles>
<RecentFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\surf\surf_pumpkin_1.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\test\array_test_numjy.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\test\array_test_loop.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\test\array_test_dot.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\3d_earth\scatter_sphere.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\3d_earth\scatter.py"/>
</RecentFiles>
</File>
<Font>
@ -36,5 +34,5 @@
</Font>
<LookFeel DockWindowDecorated="true" LafDecorated="true" Name="FlatDarkLaf"/>
<Figure DoubleBuffering="true"/>
<Startup MainFormLocation="-7,0" MainFormSize="1346,800"/>
<Startup MainFormLocation="-7,-7" MainFormSize="1293,685"/>
</MeteoInfo>

View File

@ -12,22 +12,101 @@
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="meteoinfo-chart" />
<orderEntry type="module" module-name="meteoinfo-console" />
<orderEntry type="module" module-name="meteoinfo-geo" />
<orderEntry type="module" module-name="meteoinfo-ui" />
<orderEntry type="library" name="Maven: org.meteothink:wContour:1.7.1" level="project" />
<orderEntry type="library" name="Maven: org.scilab.forge:jlatexmath:1.0.7" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.12.0" level="project" />
<orderEntry type="library" name="Maven: com.l2fprod:l2fprod-common-all:0.1" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt-main:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all-main:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.joml:joml:1.10.4" level="project" />
<orderEntry type="library" name="Maven: org.python:jython-standalone:2.7.3" level="project" />
<orderEntry type="library" name="Maven: com.fifesoft:rsyntaxtextarea:3.3.2" level="project" />
<orderEntry type="library" name="Maven: com.fifesoft:autocomplete:3.3.0" level="project" />
<orderEntry type="module" module-name="meteoinfo-ndarray" />
<orderEntry type="module" module-name="meteoinfo-math" />
<orderEntry type="module" module-name="meteoinfo-geometry" />
<orderEntry type="module" module-name="meteoinfo-table" />
<orderEntry type="module" module-name="meteoinfo-image" />
<orderEntry type="module" module-name="meteoinfo-data" />
<orderEntry type="library" name="Maven: com.formdev:flatlaf:3.0" level="project" />
<orderEntry type="library" name="Maven: com.formdev:flatlaf-extras:3.0" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-util:2.0.2" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-emf:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-pdf:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphics2d:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-ps:2.4" level="project" />
<orderEntry type="library" name="Maven: com.itextpdf:itextpdf:5.5.13.3" level="project" />
<orderEntry type="module" module-name="meteoinfo-common" />
<orderEntry type="library" name="Maven: com.toedter:jcalendar:1.4" level="project" />
<orderEntry type="library" name="Maven: org.scilab.forge:jlatexmath-font-greek:1.0.7" level="project" />
<orderEntry type="library" name="Maven: org.scilab.forge:jlatexmath-font-cyrillic:1.0.7" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-android-aarch64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-linux-amd64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-linux-armv6hf:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-linux-aarch64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-macosx-universal:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-windows-amd64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: antlr:antlr:2.7.7" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-android-aarch64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-linux-amd64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-linux-armv6hf:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-linux-aarch64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-macosx-universal:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-windows-amd64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math4-legacy:4.0-beta1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-core:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-gamma:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-combinatorics:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-arrays:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-field:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-rng-core:1.5" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-rng-simple:1.5" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-rng-client-api:1.5" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-statistics-distribution:1.0" level="project" />
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:2.1.0" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-experimental:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-simple:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ojalgo:ojalgo:52.0.1" level="project" />
<orderEntry type="library" name="Maven: com.github.haifengl:smile-interpolation:2.6.0" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp-platform:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas-platform:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.locationtech.jts:jts-core:1.19.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-imaging:1.0-alpha3" level="project" />
<orderEntry type="library" name="Maven: com.twelvemonkeys.imageio:imageio-jpeg:3.9.4" level="project" />
<orderEntry type="module" module-name="meteoinfo-projection" />
<orderEntry type="module" module-name="meteoinfo-dataframe" />
<orderEntry type="library" name="Maven: edu.ucar:netcdfAll:5.5.3" level="project" />
<orderEntry type="library" name="Maven: com.github.albfernandez:juniversalchardet:2.4.0" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.11.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-compress:1.21" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: com.formdev:svgSalamander:1.1.3" level="project" />
<orderEntry type="library" name="Maven: org.netbeans:openide-lookup:1.9-patched-1.0" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-tests:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsbase:2.4" level="project" />
<orderEntry type="library" name="Maven: junit:junit:4.10" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava:31.1-jre" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-complex:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-angle:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-rootfinder:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-quaternion:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-rng-sampling:1.5" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math4-legacy-exception:4.0-beta1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math4-legacy-core:4.0-beta1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-fraction:1.1" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-core:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-ddense:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-dsparse:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-zdense:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-simple:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-fdense:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-cdense:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-fsparse:0.41.1" level="project" />
<orderEntry type="library" name="Maven: org.ojalgo:ojalgo:52.0.1" level="project" />
<orderEntry type="library" name="Maven: com.github.haifengl:smile-interpolation:2.6.0" level="project" />
<orderEntry type="library" name="Maven: com.github.haifengl:smile-math:2.6.0" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp-platform:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:android-arm:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:android-arm64:1.5.4" level="project" />
@ -43,7 +122,6 @@
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:macosx-x86_64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:windows-x86:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:windows-x86_64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas-platform:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:android-arm:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:android-arm64:0.3.10-1.5.4" level="project" />
@ -59,100 +137,22 @@
<orderEntry type="library" name="Maven: org.bytedeco:openblas:macosx-x86_64:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:windows-x86:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:windows-x86_64:0.3.10-1.5.4" level="project" />
<orderEntry type="module" module-name="meteoinfo-geometry" />
<orderEntry type="library" name="Maven: org.locationtech.jts:jts-core:1.19.0" level="project" />
<orderEntry type="module" module-name="meteoinfo-table" />
<orderEntry type="module" module-name="meteoinfo-image" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-imaging:1.0-alpha3" level="project" />
<orderEntry type="library" name="Maven: com.twelvemonkeys.imageio:imageio-jpeg:3.9.4" level="project" />
<orderEntry type="library" name="Maven: com.twelvemonkeys.imageio:imageio-core:3.9.4" level="project" />
<orderEntry type="library" name="Maven: com.twelvemonkeys.imageio:imageio-metadata:3.9.4" level="project" />
<orderEntry type="library" name="Maven: com.twelvemonkeys.common:common-lang:3.9.4" level="project" />
<orderEntry type="library" name="Maven: com.twelvemonkeys.common:common-io:3.9.4" level="project" />
<orderEntry type="library" name="Maven: com.twelvemonkeys.common:common-image:3.9.4" level="project" />
<orderEntry type="module" module-name="meteoinfo-data" />
<orderEntry type="module" module-name="meteoinfo-projection" />
<orderEntry type="library" name="Maven: org.locationtech.proj4j:proj4j:1.2.2" level="project" />
<orderEntry type="library" name="Maven: net.sf.geographiclib:GeographicLib-Java:2.0" level="project" />
<orderEntry type="module" module-name="meteoinfo-dataframe" />
<orderEntry type="library" name="Maven: edu.ucar:netcdfAll:5.5.3" level="project" />
<orderEntry type="library" name="Maven: com.github.albfernandez:juniversalchardet:2.4.0" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.11.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-compress:1.21" level="project" />
<orderEntry type="library" name="Maven: com.formdev:flatlaf:3.0" level="project" />
<orderEntry type="library" name="Maven: com.formdev:flatlaf-extras:3.0" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: com.formdev:svgSalamander:1.1.3" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-util:2.0.2" level="project" />
<orderEntry type="library" name="Maven: org.netbeans:openide-lookup:1.9-patched-1.0" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-emf:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-io:2.2.2" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-tests:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsbase:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-pdf:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphics2d:2.4" level="project" />
<orderEntry type="library" name="Maven: junit:junit:4.10" level="project" />
<orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.1" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-ps:2.4" level="project" />
<orderEntry type="library" name="Maven: com.itextpdf:itextpdf:5.5.13.3" level="project" />
<orderEntry type="module" module-name="meteoinfo-ui" />
<orderEntry type="module" module-name="meteoinfo-common" />
<orderEntry type="library" name="Maven: com.google.guava:guava:31.1-jre" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:failureaccess:1.0.1" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava" level="project" />
<orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:3.0.2" level="project" />
<orderEntry type="library" name="Maven: org.checkerframework:checker-qual:3.12.0" level="project" />
<orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.11.0" level="project" />
<orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.3" level="project" />
<orderEntry type="library" name="Maven: com.toedter:jcalendar:1.4" level="project" />
<orderEntry type="library" name="Maven: org.meteothink:wContour:1.7.1" level="project" />
<orderEntry type="library" name="Maven: org.scilab.forge:jlatexmath:1.0.7" level="project" />
<orderEntry type="library" name="Maven: org.scilab.forge:jlatexmath-font-greek:1.0.7" level="project" />
<orderEntry type="library" name="Maven: org.scilab.forge:jlatexmath-font-cyrillic:1.0.7" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.12.0" level="project" />
<orderEntry type="library" name="Maven: com.l2fprod:l2fprod-common-all:0.1" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt-main:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-android-aarch64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-linux-amd64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-linux-armv6hf:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-linux-aarch64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-macosx-universal:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt:natives-windows-amd64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: antlr:antlr:2.7.7" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all-main:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-android-aarch64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-linux-amd64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-linux-armv6hf:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-linux-aarch64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-macosx-universal:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:natives-windows-amd64:2.4.0" level="project" />
<orderEntry type="library" name="Maven: org.joml:joml:1.10.4" level="project" />
<orderEntry type="module" module-name="meteoinfo-console" />
<orderEntry type="library" name="Maven: org.python:jython-standalone:2.7.3" level="project" />
<orderEntry type="library" name="Maven: com.fifesoft:rsyntaxtextarea:3.3.2" level="project" />
<orderEntry type="library" name="Maven: com.fifesoft:autocomplete:3.3.0" level="project" />
<orderEntry type="module" module-name="meteoinfo-ndarray" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math4-legacy:4.0-beta1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-complex:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-angle:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-rootfinder:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-quaternion:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-rng-sampling:1.5" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math4-legacy-exception:4.0-beta1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math4-legacy-core:4.0-beta1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math4-core:4.0-beta1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-core:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-gamma:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-fraction:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-combinatorics:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-arrays:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-numbers-field:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-rng-core:1.5" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-rng-simple:1.5" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-rng-client-api:1.5" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-statistics-distribution:1.0" level="project" />
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:2.1.0" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
</component>
</module>