Skip to content
Open
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package org.jmonkeyengine.screenshottests.testframework;

import com.jme3.app.Application;
import com.jme3.app.state.AbstractAppState;
import com.jme3.app.state.AppStateManager;
import com.jme3.renderer.Renderer;
import com.jme3.system.JmeSystem;
import com.jme3.texture.FrameBuffer;
import com.jme3.texture.Texture2D;
import com.jme3.util.BufferUtils;

import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.file.Path;
import java.util.Optional;

public class OffScreenshotAppState extends AbstractAppState{

private final Texture2D renderTexture;
private Renderer renderer;
private final FrameBuffer frameBuffer;
private Optional<Path> capture = Optional.empty();

private ByteBuffer outBuf;

public void takeScreenshot(Path pathToSaveTo) {
capture = Optional.of(pathToSaveTo);
}

public OffScreenshotAppState(Texture2D renderTexture, FrameBuffer frameBuffer) {
this.renderTexture = renderTexture;
this.frameBuffer = frameBuffer;
}

@Override
public void initialize(AppStateManager stateManager, Application app) {
super.initialize(stateManager, app);
renderer = app.getRenderManager().getRenderer();
outBuf = BufferUtils.createByteBuffer(renderTexture.getImage().getWidth() * renderTexture.getImage().getHeight() * 4);
}

@Override
public void postRender() {
super.postRender();
if (capture.isPresent()) {

renderer.readFrameBuffer(frameBuffer, outBuf);
try (FileOutputStream fileOutBuf = new FileOutputStream(capture.get().toFile())){

JmeSystem.writeImageFile(fileOutBuf, "png",outBuf, renderTexture.getImage().getWidth(), renderTexture.getImage().getHeight());
}catch (IOException e) {
throw new RuntimeException(e);
}
capture = Optional.empty();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
*/
public enum PixelSamenessDegree{
SAME(1, null),
NEGLIGIBLY_DIFFERENT(1, ColorRGBA.Green),
NEGLIGIBLY_DIFFERENT(3, ColorRGBA.Green),
SUBTLY_DIFFERENT(10, ColorRGBA.Blue),

MEDIUMLY_DIFFERENT(20, ColorRGBA.Yellow),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.jmonkeyengine.screenshottests.testframework;

import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

public class ScenarioScreenshotRecorder {

/**
* scenario name -> frame number -> screenshot path
*/
Map<String, Map<Integer, Path>> screenshotsAtFrames = new HashMap<>();

public void recordScreenshot(String scenarioName, int frameNumber, Path screenshotPath){
screenshotsAtFrames.computeIfAbsent(scenarioName, k -> new HashMap<>()).put(frameNumber, screenshotPath);
}

public Optional<Path> getScreenshotsAtFrame(String scenarioName, int frameNumber){
if(!screenshotsAtFrames.containsKey(scenarioName) || !screenshotsAtFrames.get(scenarioName).containsKey(frameNumber)){
return Optional.empty();
}else{
return Optional.of(screenshotsAtFrames.get(scenarioName).get(frameNumber));
}
}

public void addAll(ScenarioScreenshotRecorder other) {
for (Map.Entry<String, Map<Integer, Path>> scenarioEntry : other.screenshotsAtFrames.entrySet()) {
String scenarioName = scenarioEntry.getKey();
for (Map.Entry<Integer, Path> frameEntry : scenarioEntry.getValue().entrySet()) {
recordScreenshot(scenarioName, frameEntry.getKey(), frameEntry.getValue());
}
}
}
}
Loading
Loading