work towards automated testing
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
This commit is contained in:
parent
6da4c001fa
commit
71fb248154
@ -1,3 +1,3 @@
|
||||
#maven.buildNumber.plugin properties file
|
||||
#Wed Jul 03 15:06:42 EDT 2024
|
||||
buildNumber=149
|
||||
#Sun Jul 07 21:24:47 EDT 2024
|
||||
buildNumber=180
|
||||
|
||||
@ -452,11 +452,10 @@ Refactor menu clases under electrosphere.client package
|
||||
|
||||
Allow texture map to bind multiple model paths to a single set of mesh->textures
|
||||
|
||||
Rework how chunks are written to disk to make them more cache friendly
|
||||
- IE, write consecutively higher LOD levels the further into the file, so that you can read just the first few bytes if its a far away chunk
|
||||
|
||||
|
||||
Redo hitboxes to have capsules and also chaining between frames (but not between swinging the camera around)
|
||||
- Introduce block hitbox (blockbox) type
|
||||
|
||||
Fix voxel type selection menu not showing textures
|
||||
- The quads are off screen because the calculation for ndcX/ndcY are putting it wayyy to the right -- will need to revisit calcs for all that
|
||||
|
||||
@ -604,8 +603,6 @@ Documentation
|
||||
|
||||
# Eventually
|
||||
|
||||
Generic collision engine to support different instances of engine (eg hitboxes vs terrain vs liquids, etc)
|
||||
- Major refactoring to happen here
|
||||
Procedural Cliff Texture
|
||||
- Uses noise or fractals or something to generate infinite textures in shader
|
||||
Loot Generator
|
||||
|
||||
@ -154,8 +154,9 @@ public class Main {
|
||||
new Thread(Globals.initialAssetLoadingThread).start();
|
||||
}
|
||||
|
||||
//Sets a hook that fires when the engine process stops
|
||||
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
|
||||
System.out.println("Shutdown hook!");
|
||||
LoggerInterface.loggerEngine.INFO("Shutdown hook!");
|
||||
}));
|
||||
|
||||
//uncomment to test loading a model into engine
|
||||
@ -223,6 +224,7 @@ public class Main {
|
||||
*/
|
||||
public static void mainLoop(){
|
||||
mainLoop(0);
|
||||
shutdown();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -231,9 +233,11 @@ public class Main {
|
||||
*/
|
||||
public static void mainLoop(long maxFrames){
|
||||
|
||||
//resets running flag to that we can repeatedly loop (ie in tests)
|
||||
running = true;
|
||||
|
||||
//main loop
|
||||
while (running) {
|
||||
|
||||
try {
|
||||
|
||||
Globals.profiler.beginRootCpuSample("frame");
|
||||
@ -411,6 +415,12 @@ public class Main {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Shuts down the engine
|
||||
*/
|
||||
public static void shutdown(){
|
||||
LoggerInterface.loggerEngine.WARNING("ENGINE SHUTDOWN");
|
||||
//
|
||||
// S H U T D O W N
|
||||
|
||||
@ -77,15 +77,17 @@ public class AssetManager {
|
||||
for(String currentPath : modelsInQueue){
|
||||
modelsInQueue.remove(currentPath);
|
||||
AIScene aiScene = ModelLoader.loadAIScene(currentPath);
|
||||
modelsLoadedIntoMemory.put(currentPath, ModelLoader.createModelFromAiScene(aiScene,currentPath));
|
||||
for(PhysicsMeshQueueItem physicsMeshQueueItem : physicsMeshesToLoad){
|
||||
if(physicsMeshQueueItem.modelPath.contains(currentPath)){
|
||||
//create physics
|
||||
physicsMeshesToLoad.remove(physicsMeshQueueItem);
|
||||
physicsMeshesLoadedIntoMemory.put(
|
||||
getCollisionMeshMapKey(physicsMeshQueueItem.collisionEngine,currentPath),
|
||||
CollisionBodyCreation.generateRigidBodyFromAIScene(physicsMeshQueueItem.collisionEngine,aiScene,Collidable.TYPE_STATIC_BIT)
|
||||
);
|
||||
if(aiScene != null){
|
||||
modelsLoadedIntoMemory.put(currentPath, ModelLoader.createModelFromAiScene(aiScene,currentPath));
|
||||
for(PhysicsMeshQueueItem physicsMeshQueueItem : physicsMeshesToLoad){
|
||||
if(physicsMeshQueueItem.modelPath.contains(currentPath)){
|
||||
//create physics
|
||||
physicsMeshesToLoad.remove(physicsMeshQueueItem);
|
||||
physicsMeshesLoadedIntoMemory.put(
|
||||
getCollisionMeshMapKey(physicsMeshQueueItem.collisionEngine,currentPath),
|
||||
CollisionBodyCreation.generateRigidBodyFromAIScene(physicsMeshQueueItem.collisionEngine,aiScene,Collidable.TYPE_STATIC_BIT)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,8 +3,7 @@ package electrosphere.logger;
|
||||
import electrosphere.logger.Logger.LogLevel;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author amaterasu
|
||||
* The list of logging channels available
|
||||
*/
|
||||
public class LoggerInterface {
|
||||
|
||||
|
||||
@ -1,23 +1,18 @@
|
||||
package electrosphere.renderer.framebuffer;
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
import electrosphere.engine.Globals;
|
||||
import electrosphere.logger.LoggerInterface;
|
||||
import electrosphere.renderer.OpenGLState;
|
||||
import electrosphere.renderer.RenderingEngine;
|
||||
import electrosphere.renderer.texture.Texture;
|
||||
import electrosphere.util.FileUtils;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
import org.lwjgl.opengl.GL40;
|
||||
import org.lwjgl.system.MemoryUtil;
|
||||
|
||||
|
||||
@ -26,7 +26,16 @@ import java.util.logging.Logger;
|
||||
import org.lwjgl.assimp.AIScene;
|
||||
import static org.lwjgl.assimp.Assimp.*;
|
||||
|
||||
/**
|
||||
* Main model loading class
|
||||
*/
|
||||
public class ModelLoader {
|
||||
|
||||
/**
|
||||
* Loads a model via assimp
|
||||
* @param path The path to the model
|
||||
* @return The model if it exists, null otherwise
|
||||
*/
|
||||
public static AIScene loadAIScene(String path){
|
||||
AIScene rVal;
|
||||
// File file = new File(Thread.currentThread().getContextClassLoader().getResource(fileName).getFile());
|
||||
@ -41,15 +50,17 @@ public class ModelLoader {
|
||||
aiProcess_GlobalScale
|
||||
);
|
||||
if(rVal == null){
|
||||
throw new IllegalStateException(aiGetErrorString());
|
||||
LoggerInterface.loggerRenderer.ERROR(new IllegalStateException(aiGetErrorString()));
|
||||
}
|
||||
return rVal;
|
||||
}
|
||||
|
||||
public static Model createModelFromAiScene(AIScene scene, String path){
|
||||
Model rVal;
|
||||
rVal = Model.createModelFromAiscene(path, scene);
|
||||
attemptAddTexturesFromPathname(path, rVal);
|
||||
Model rVal = null;
|
||||
if(scene != null){
|
||||
rVal = Model.createModelFromAiscene(path, scene);
|
||||
attemptAddTexturesFromPathname(path, rVal);
|
||||
}
|
||||
return rVal;
|
||||
}
|
||||
|
||||
|
||||
@ -8,22 +8,30 @@ import org.junit.runner.notification.Failure;
|
||||
|
||||
import entity.SpawningCreaturesTest;
|
||||
import startup.StartupTest;
|
||||
import testutils.TestEngineUtils;
|
||||
|
||||
public class TestRunner {
|
||||
|
||||
static final List<Class> classes = Arrays.asList(new Class[]{
|
||||
/**
|
||||
* The list of classes to run tests for
|
||||
*/
|
||||
static final List<Class<?>> classes = Arrays.asList(new Class[]{
|
||||
StartupTest.class,
|
||||
SpawningCreaturesTest.class,
|
||||
});
|
||||
|
||||
/**
|
||||
* Runs tests
|
||||
* @param args Args provided
|
||||
*/
|
||||
public static void main(String[] args){
|
||||
|
||||
boolean success = true;
|
||||
List<Failure> failures = new LinkedList<Failure>();
|
||||
|
||||
//run tests
|
||||
for(Class classObject : classes){
|
||||
System.out.println("CLASS " + classObject.getCanonicalName());
|
||||
for(Class<?> classObject : classes){
|
||||
TestEngineUtils.log("CLASS " + classObject.getCanonicalName());
|
||||
Result result = JUnitCore.runClasses(classObject);
|
||||
for(Failure failure : result.getFailures()){
|
||||
failures.add(failure);
|
||||
@ -33,10 +41,10 @@ public class TestRunner {
|
||||
|
||||
//print failures
|
||||
for(Failure failure : failures){
|
||||
System.out.println(failure);
|
||||
TestEngineUtils.log(failure + "");
|
||||
}
|
||||
|
||||
System.out.println("Testing was successful: " + success);
|
||||
TestEngineUtils.log("Testing was successful: " + success);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,52 @@
|
||||
package electrosphere.renderer.ui.elements;
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import electrosphere.engine.Globals;
|
||||
import electrosphere.engine.Main;
|
||||
import electrosphere.menu.WindowUtils;
|
||||
import electrosphere.menu.mainmenu.MenuGeneratorsUITesting;
|
||||
import electrosphere.renderer.RenderingEngine;
|
||||
import testutils.TestEngineUtils;
|
||||
|
||||
/**
|
||||
* Integration tests for the window class
|
||||
*/
|
||||
public class WindowIntegrationTest {
|
||||
|
||||
@Before
|
||||
/**
|
||||
* Initializes the engine
|
||||
*/
|
||||
public void initEngine(){
|
||||
TestEngineUtils.initGraphicalEngine();
|
||||
}
|
||||
|
||||
@Test
|
||||
/**
|
||||
* Tests creating a window
|
||||
*/
|
||||
public void testCreateWindow(){
|
||||
//create ui testing window
|
||||
TestEngineUtils.simulateFrames(1);
|
||||
WindowUtils.replaceMainMenuContents(MenuGeneratorsUITesting.createUITestMenu());
|
||||
TestEngineUtils.simulateFrames(1);
|
||||
BufferedImage screenshot = RenderingEngine.defaultFramebuffer.getPixels(Globals.renderingEngine.getOpenGLState());
|
||||
|
||||
}
|
||||
|
||||
@After
|
||||
/**
|
||||
* Shuts down the engine
|
||||
*/
|
||||
public void closeEngine(){
|
||||
Main.shutdown();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,10 @@
|
||||
package electrosphere.renderer.ui.elements;
|
||||
|
||||
/**
|
||||
* Unit testing the window class
|
||||
*/
|
||||
public class WindowUnitTest {
|
||||
|
||||
|
||||
|
||||
}
|
||||
@ -1,22 +1,19 @@
|
||||
package entity;
|
||||
|
||||
import org.joml.Vector3d;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import electrosphere.engine.Globals;
|
||||
import electrosphere.engine.Main;
|
||||
import electrosphere.engine.profiler.Profiler;
|
||||
import electrosphere.entity.types.creature.CreatureUtils;
|
||||
import electrosphere.logger.LoggerInterface;
|
||||
import electrosphere.net.NetUtils;
|
||||
import electrosphere.server.datacell.Realm;
|
||||
import testutils.TestEntityUtils;
|
||||
|
||||
public class SpawningCreaturesTest {
|
||||
|
||||
@Before
|
||||
public void initEngine(){
|
||||
System.out.println("[Test] Spawn many creatures");
|
||||
LoggerInterface.loggerEngine.INFO("[Test] Spawn many creatures");
|
||||
Globals.RUN_CLIENT = true;
|
||||
Globals.RUN_SERVER = true;
|
||||
Globals.HEADLESS = true;
|
||||
|
||||
@ -4,6 +4,7 @@ import org.junit.Test;
|
||||
import electrosphere.engine.Globals;
|
||||
import electrosphere.engine.Main;
|
||||
import electrosphere.engine.profiler.Profiler;
|
||||
import electrosphere.logger.LoggerInterface;
|
||||
import electrosphere.net.NetUtils;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
@ -11,7 +12,7 @@ public class StartupTest extends TestCase {
|
||||
|
||||
@Test
|
||||
public void testStartupHeadless(){
|
||||
System.out.println("[Test] Startup Headless");
|
||||
LoggerInterface.loggerEngine.INFO("[Test] Startup Headless");
|
||||
Globals.RUN_CLIENT = false;
|
||||
Globals.RUN_SERVER = true;
|
||||
Globals.HEADLESS = true;
|
||||
@ -23,7 +24,7 @@ public class StartupTest extends TestCase {
|
||||
|
||||
@Test
|
||||
public void testEmpty() {
|
||||
System.out.println("[Test] Empty test");
|
||||
LoggerInterface.loggerEngine.INFO("[Test] Empty test");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
10
src/test/java/testutils/InputAPI.java
Normal file
10
src/test/java/testutils/InputAPI.java
Normal file
@ -0,0 +1,10 @@
|
||||
package testutils;
|
||||
|
||||
/**
|
||||
* Used to programmatically send input signals as if a user had
|
||||
*/
|
||||
public class InputAPI {
|
||||
|
||||
|
||||
|
||||
}
|
||||
60
src/test/java/testutils/TestEngineUtils.java
Normal file
60
src/test/java/testutils/TestEngineUtils.java
Normal file
@ -0,0 +1,60 @@
|
||||
package testutils;
|
||||
|
||||
import electrosphere.engine.Globals;
|
||||
import electrosphere.engine.Main;
|
||||
import electrosphere.engine.profiler.Profiler;
|
||||
import electrosphere.net.NetUtils;
|
||||
|
||||
/**
|
||||
* Utils for testing the engine
|
||||
*/
|
||||
public class TestEngineUtils {
|
||||
|
||||
/**
|
||||
* Initializes the engine
|
||||
*/
|
||||
public static void initHeadlessEngine(){
|
||||
Globals.RUN_CLIENT = true;
|
||||
Globals.RUN_SERVER = true;
|
||||
Globals.RUN_AUDIO = false;
|
||||
Globals.HEADLESS = true;
|
||||
Profiler.PROFILE = false;
|
||||
NetUtils.setPort(0);
|
||||
Main.startUp();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the engine
|
||||
*/
|
||||
public static void initGraphicalEngine(){
|
||||
Globals.RUN_CLIENT = true;
|
||||
Globals.RUN_SERVER = true;
|
||||
Globals.RUN_AUDIO = true;
|
||||
Globals.HEADLESS = false;
|
||||
Profiler.PROFILE = false;
|
||||
NetUtils.setPort(0);
|
||||
Main.startUp();
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints a logging message
|
||||
* @param log the message to print
|
||||
*/
|
||||
public static void log(String log){
|
||||
System.out.println(log);
|
||||
}
|
||||
|
||||
/**
|
||||
* Simulates a certain number of frames
|
||||
* @param frameCount The number of frames to simulate
|
||||
*/
|
||||
public static void simulateFrames(int frameCount){
|
||||
int i = 0;
|
||||
while(i < frameCount){
|
||||
Main.setFramestep(1);
|
||||
Main.mainLoop(1);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -7,8 +7,10 @@ import electrosphere.entity.Entity;
|
||||
import electrosphere.entity.EntityUtils;
|
||||
import electrosphere.server.datacell.Realm;
|
||||
import electrosphere.server.datacell.ServerDataCell;
|
||||
import electrosphere.server.datacell.utils.DataCellSearchUtils;
|
||||
|
||||
/**
|
||||
* Utilities for testing
|
||||
*/
|
||||
public class TestEntityUtils {
|
||||
|
||||
/**
|
||||
|
||||
@ -1,5 +0,0 @@
|
||||
package ui;
|
||||
|
||||
public class UICreationTest {
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user