Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2009-2012 jMonkeyEngine
* Copyright (c) 2009-2025 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
Expand Down Expand Up @@ -40,13 +40,35 @@
import com.jme3.util.clone.Cloner;
import java.io.IOException;

/**
* An {@link EmitterShape} that emits particles randomly within the bounds of an axis-aligned box.
* The box is defined by a minimum corner and a length vector.
*/
public class EmitterBoxShape implements EmitterShape {

private Vector3f min, len;
/**
* The minimum corner of the box.
*/
private Vector3f min;
/**
* The length of the box along each axis. The x, y, and z components of this
* vector represent the width, height, and depth of the box, respectively.
*/
private Vector3f len;

/**
* For serialization only. Do not use.
*/
public EmitterBoxShape() {
}

/**
* Constructs an {@code EmitterBoxShape} defined by a minimum and maximum corner.
*
* @param min The minimum corner of the box.
* @param max The maximum corner of the box.
* @throws IllegalArgumentException If either {@code min} or {@code max} is null.
*/
public EmitterBoxShape(Vector3f min, Vector3f max) {
if (min == null || max == null) {
throw new IllegalArgumentException("min or max cannot be null");
Expand All @@ -57,6 +79,11 @@ public EmitterBoxShape(Vector3f min, Vector3f max) {
this.len.set(max).subtractLocal(min);
}

/**
* Generates a random point within the bounds of the box.
*
* @param store The {@link Vector3f} to store the generated point in.
*/
@Override
public void getRandomPoint(Vector3f store) {
store.x = min.x + len.x * FastMath.nextRandomFloat();
Expand All @@ -65,10 +92,11 @@ public void getRandomPoint(Vector3f store) {
}

/**
* This method fills the point with data.
* It does not fill the normal.
* @param store the variable to store the point data
* @param normal not used in this class
* For a box shape, the normal is not well-defined for points within the volume.
* This implementation simply calls {@link #getRandomPoint(Vector3f)} and does not modify the provided normal.
*
* @param store The {@link Vector3f} to store the generated point in.
* @param normal The {@link Vector3f} to store the generated normal in (unused).
*/
@Override
public void getRandomPointAndNormal(Vector3f store, Vector3f normal) {
Expand Down Expand Up @@ -108,18 +136,40 @@ public void cloneFields(Cloner cloner, Object original) {
this.len = cloner.clone(len);
}

/**
* Returns the minimum corner of the emitting box.
*
* @return The minimum corner.
*/
public Vector3f getMin() {
return min;
}

/**
* Sets the minimum corner of the emitting box.
*
* @param min The new minimum corner.
*/
public void setMin(Vector3f min) {
this.min = min;
}

/**
* Returns the length vector of the emitting box. This vector represents the
* extent of the box along each axis (length = max - min).
*
* @return The length vector.
*/
public Vector3f getLen() {
return len;
}

/**
* Sets the length vector of the emitting box. This vector should represent
* the extent of the box along each axis (length = max - min).
*
* @param len The new length vector.
*/
public void setLen(Vector3f len) {
this.len = len;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2009-2012 jMonkeyEngine
* Copyright (c) 2009-2025 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
Expand Down Expand Up @@ -31,20 +31,35 @@
*/
package com.jme3.effect.shapes;

import com.jme3.export.InputCapsule;
import com.jme3.export.JmeExporter;
import com.jme3.export.JmeImporter;
import com.jme3.export.OutputCapsule;
import com.jme3.math.Vector3f;
import com.jme3.util.clone.Cloner;
import java.io.IOException;

/**
* An {@link EmitterShape} that emits particles from a single point in space.
*/
public class EmitterPointShape implements EmitterShape {

/**
* The point in space from which particles are emitted.
*/
private Vector3f point;

/**
* For serialization only. Do not use.
*/
public EmitterPointShape() {
}

/**
* Constructs an {@code EmitterPointShape} with the given point.
*
* @param point The point from which particles are emitted.
*/
public EmitterPointShape(Vector3f point) {
this.point = point;
}
Expand Down Expand Up @@ -80,26 +95,43 @@ public void cloneFields(Cloner cloner, Object original) {
this.point = cloner.clone(point);
}

/**
* For a point shape, the generated point is
* always the shape's defined point.
*
* @param store The {@link Vector3f} to store the generated point in.
*/
@Override
public void getRandomPoint(Vector3f store) {
store.set(point);
}

/**
* This method fills the point with data.
* It does not fill the normal.
* @param store the variable to store the point data
* @param normal not used in this class
* For a point shape, the generated point is always the shape's defined point.
* The normal is not defined for a point shape, so this method does not modify the normal parameter.
*
* @param store The {@link Vector3f} to store the generated point in.
* @param normal The {@link Vector3f} to store the generated normal in (unused).
*/
@Override
public void getRandomPointAndNormal(Vector3f store, Vector3f normal) {
store.set(point);
}

/**
* Returns the point from which particles are emitted.
*
* @return The point.
*/
public Vector3f getPoint() {
return point;
}

/**
* Sets the point from which particles are emitted.
*
* @param point The new point.
*/
public void setPoint(Vector3f point) {
this.point = point;
}
Expand All @@ -112,6 +144,7 @@ public void write(JmeExporter ex) throws IOException {

@Override
public void read(JmeImporter im) throws IOException {
this.point = (Vector3f) im.getCapsule(this).readSavable("point", null);
InputCapsule ic = im.getCapsule(this);
this.point = (Vector3f) ic.readSavable("point", null);
}
}
10 changes: 5 additions & 5 deletions jme3-core/src/main/java/com/jme3/effect/shapes/EmitterShape.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2009-2012 jMonkeyEngine
* Copyright (c) 2009-2025 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
Expand Down Expand Up @@ -39,14 +39,14 @@
* This interface declares methods used by all shapes that represent particle emitters.
* @author Kirill
*/
public interface EmitterShape extends Savable, Cloneable, JmeCloneable {
public interface EmitterShape extends Savable, JmeCloneable {

/**
* This method fills in the initial position of the particle.
* @param store
* store variable for initial position
*/
public void getRandomPoint(Vector3f store);
void getRandomPoint(Vector3f store);

/**
* This method fills in the initial position of the particle and its normal vector.
Expand All @@ -55,11 +55,11 @@ public interface EmitterShape extends Savable, Cloneable, JmeCloneable {
* @param normal
* store variable for initial normal
*/
public void getRandomPointAndNormal(Vector3f store, Vector3f normal);
void getRandomPointAndNormal(Vector3f store, Vector3f normal);

/**
* This method creates a deep clone of the current instance of the emitter shape.
* @return deep clone of the current instance of the emitter shape
*/
public EmitterShape deepClone();
EmitterShape deepClone();
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2009-2012 jMonkeyEngine
* Copyright (c) 2009-2025 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
Expand Down Expand Up @@ -40,19 +40,38 @@
import com.jme3.util.clone.Cloner;
import java.io.IOException;

/**
* An {@link EmitterShape} that emits particles randomly from within the volume of a sphere.
* The sphere is defined by a center point and a radius.
*/
public class EmitterSphereShape implements EmitterShape {

/**
* The center point of the sphere.
*/
private Vector3f center;
/**
* The radius of the sphere.
*/
private float radius;

/**
* For serialization only. Do not use.
*/
public EmitterSphereShape() {
}

/**
* Constructs an {@code EmitterSphereShape} with the given center and radius.
*
* @param center The center point of the sphere.
* @param radius The radius of the sphere.
* @throws IllegalArgumentException If {@code center} is null, or if {@code radius} is not greater than 0.
*/
public EmitterSphereShape(Vector3f center, float radius) {
if (center == null) {
throw new IllegalArgumentException("center cannot be null");
}

if (radius <= 0) {
throw new IllegalArgumentException("Radius must be greater than 0");
}
Expand Down Expand Up @@ -92,6 +111,11 @@ public void cloneFields(Cloner cloner, Object original) {
this.center = cloner.clone(center);
}

/**
* Generates a random point within the volume of the sphere.
*
* @param store The {@link Vector3f} to store the generated point in.
*/
@Override
public void getRandomPoint(Vector3f store) {
do {
Expand All @@ -103,23 +127,50 @@ public void getRandomPoint(Vector3f store) {
store.addLocal(center);
}

/**
* For a sphere shape, the normal is not well-defined for points within the volume.
* This implementation simply calls {@link #getRandomPoint(Vector3f)} and does not modify the provided normal.
*
* @param store The {@link Vector3f} to store the generated point in.
* @param normal The {@link Vector3f} to store the generated normal in (unused).
*/
@Override
public void getRandomPointAndNormal(Vector3f store, Vector3f normal) {
this.getRandomPoint(store);
}

/**
* Returns the center point of the sphere.
*
* @return The center point.
*/
public Vector3f getCenter() {
return center;
}

/**
* Sets the center point of the sphere.
*
* @param center The new center point.
*/
public void setCenter(Vector3f center) {
this.center = center;
}

/**
* Returns the radius of the sphere.
*
* @return The radius.
*/
public float getRadius() {
return radius;
}

/**
* Sets the radius of the sphere.
*
* @param radius The new radius.
*/
public void setRadius(float radius) {
this.radius = radius;
}
Expand Down