diff --git a/README.md b/README.md index 024dd16d..1ec30b8a 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,10 @@ for everything. - LOD management ## Sample images +### Terrain +![c-1](artifacts/FOLIAGE-MATERIAL-INTEGRATION-1.png) +![c-1](artifacts/MATERIAL-LAYERS.png) + ### Voxelization ![c-1](artifacts/POST_VOXELIZATION.png) ![c0](artifacts/LORENZ-ATTRACTOR.png) diff --git a/artifacts/FOLIAGE-MATERIAL-INTEGRATION-1.png b/artifacts/FOLIAGE-MATERIAL-INTEGRATION-1.png new file mode 100644 index 00000000..cdaaf70c Binary files /dev/null and b/artifacts/FOLIAGE-MATERIAL-INTEGRATION-1.png differ diff --git a/artifacts/FOLIAGE-MATERIAL-INTEGRATION.png b/artifacts/FOLIAGE-MATERIAL-INTEGRATION.png new file mode 100644 index 00000000..e38d300f Binary files /dev/null and b/artifacts/FOLIAGE-MATERIAL-INTEGRATION.png differ diff --git a/artifacts/MATERIAL-LAYERS.png b/artifacts/MATERIAL-LAYERS.png new file mode 100644 index 00000000..bbf904c3 Binary files /dev/null and b/artifacts/MATERIAL-LAYERS.png differ diff --git a/artifacts/MATERIAL_PAINTING-2.png b/artifacts/MATERIAL_PAINTING-2.png new file mode 100644 index 00000000..3890c741 Binary files /dev/null and b/artifacts/MATERIAL_PAINTING-2.png differ diff --git a/artifacts/MATERIAL_PAINTING.png b/artifacts/MATERIAL_PAINTING.png new file mode 100644 index 00000000..9e7dddb0 Binary files /dev/null and b/artifacts/MATERIAL_PAINTING.png differ diff --git a/common/pom.xml b/common/pom.xml deleted file mode 100644 index ca91eba1..00000000 --- a/common/pom.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - 4.0.0 - - com.pine - pineengine - 0.0.1-SNAPSHOT - - - common - - - 22 - 22 - UTF-8 - - - \ No newline at end of file diff --git a/editor/pom.xml b/editor/pom.xml deleted file mode 100644 index abff348e..00000000 --- a/editor/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - 4.0.0 - - com.pine - pineengine - 0.0.1-SNAPSHOT - - - editor - - - 22 - 22 - UTF-8 - - - - com.pine - engine - 0.0.1-SNAPSHOT - - - \ No newline at end of file diff --git a/editor/src/main/java/com/pine/panels/component/AbstractFormField.java b/editor/src/main/java/com/pine/panels/component/AbstractFormField.java deleted file mode 100644 index cdefe5e7..00000000 --- a/editor/src/main/java/com/pine/panels/component/AbstractFormField.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.pine.panels.component; - -import com.pine.core.AbstractView; -import com.pine.inspection.FieldDTO; - -import java.util.function.BiConsumer; - -public abstract class AbstractFormField extends AbstractView { - protected final FieldDTO dto; - protected final BiConsumer changerHandler; - - public AbstractFormField(FieldDTO dto, BiConsumer changerHandler) { - this.dto = dto; - this.changerHandler = changerHandler; - } -} diff --git a/editor/src/main/java/com/pine/panels/component/AccordionPanel.java b/editor/src/main/java/com/pine/panels/component/AccordionPanel.java deleted file mode 100644 index 78f874bf..00000000 --- a/editor/src/main/java/com/pine/panels/component/AccordionPanel.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.pine.panels.component; - -import com.pine.core.AbstractView; -import imgui.ImGui; - -public class AccordionPanel extends AbstractView { - public String title; - - @Override - public void render() { - if (title.isEmpty()) { - super.render(); - return; - } - - if (ImGui.collapsingHeader(title + imguiId)) { - super.render(); - } - } -} diff --git a/editor/src/main/java/com/pine/panels/component/FormPanel.java b/editor/src/main/java/com/pine/panels/component/FormPanel.java deleted file mode 100644 index 0595f433..00000000 --- a/editor/src/main/java/com/pine/panels/component/FormPanel.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.pine.panels.component; - -import com.pine.core.AbstractView; -import com.pine.inspection.*; -import com.pine.panels.component.impl.*; -import imgui.ImGui; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.BiConsumer; - -public class FormPanel extends AbstractView { - private final BiConsumer changeHandler; - private Inspectable inspectable; - - public FormPanel(BiConsumer changeHandler) { - this.changeHandler = changeHandler; - } - - public void setInspection(Inspectable data) { - if (this.inspectable == data) { - return; - } - this.inspectable = data; - children.clear(); - - if (data == null) { - return; - } - Map groups = new HashMap<>(); - processMethods(data, groups); - processFields(data, groups); - } - - private void processMethods(Inspectable data, Map groups) { - for (MethodDTO methodDTO : data.getMethodsAnnotated()) { - if (!groups.containsKey(methodDTO.getGroup())) { - groups.put(methodDTO.getGroup(), appendChild(new AccordionPanel())); - } - - AccordionPanel group = groups.get(methodDTO.getGroup()); - group.title = methodDTO.getGroup(); - group.appendChild(new ExecutableFunctionField(methodDTO)); - } - } - - private void processFields(Inspectable data, Map groups) { - for (FieldDTO field : data.getFieldsAnnotated()) { - if (!groups.containsKey(field.getGroup())) { - groups.put(field.getGroup(), appendChild(new AccordionPanel())); - } - - AccordionPanel group = groups.get(field.getGroup()); - group.title = field.getGroup(); - switch (field.getType()) { - case STRING: - if (field.getField().isAnnotationPresent(ResourceTypeField.class)) { - group.appendChild(new ResourceField(field, changeHandler)); - } else if (field.getField().isAnnotationPresent(TypePreviewField.class)) { - group.appendChild(new PreviewField(field, changeHandler)); - } else { - group.appendChild(new StringField(field, changeHandler)); - } - break; - case INT: - group.appendChild(new IntField(field, changeHandler)); - break; - case FLOAT: - group.appendChild(new FloatField(field, changeHandler)); - break; - case BOOLEAN: - group.appendChild(new BooleanField(field, changeHandler)); - break; - case VECTOR2: - group.appendChild(new Vector2Field(field, changeHandler)); - break; - case VECTOR3: - group.appendChild(new Vector3Field(field, changeHandler)); - break; - case VECTOR4: - group.appendChild(new Vector4Field(field, changeHandler)); - break; - case QUATERNION: - group.appendChild(new QuaternionField(field, changeHandler)); - break; - case COLOR: - group.appendChild(new ColorField(field, changeHandler)); - break; - case OPTIONS: - group.appendChild(new OptionsField(field, changeHandler)); - break; - } - } - } - - public Inspectable getInspectable() { - return inspectable; - } - - @Override - public void render() { - if (inspectable != null) { - ImGui.text(inspectable.getIcon() + inspectable.getTitle()); - ImGui.separator(); - super.render(); - } - } -} diff --git a/editor/src/main/java/com/pine/panels/component/impl/ColorField.java b/editor/src/main/java/com/pine/panels/component/impl/ColorField.java deleted file mode 100644 index 600d365b..00000000 --- a/editor/src/main/java/com/pine/panels/component/impl/ColorField.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.pine.panels.component.impl; - -import com.pine.inspection.Color; -import com.pine.inspection.FieldDTO; -import com.pine.panels.component.AbstractFormField; -import imgui.ImGui; -import imgui.flag.ImGuiColorEditFlags; - -import java.util.function.BiConsumer; - -public class ColorField extends AbstractFormField { - private final float[] values = new float[4]; - - public ColorField(FieldDTO dto, BiConsumer changerHandler) { - super(dto, changerHandler); - var cast = (Color) dto.getValue(); - values[0] = cast.x; - values[1] = cast.y; - values[2] = cast.z; - } - - @Override - public void render() { - ImGui.text(dto.getLabel()); - if (ImGui.colorPicker3(dto.getId(), values, ImGuiColorEditFlags.NoSidePreview | ImGuiColorEditFlags.DisplayRGB | ImGuiColorEditFlags.NoAlpha)) { - changerHandler.accept(dto, values); - } - } -} diff --git a/editor/src/main/java/com/pine/panels/files/DirectoryPanel.java b/editor/src/main/java/com/pine/panels/files/DirectoryPanel.java deleted file mode 100644 index 93792274..00000000 --- a/editor/src/main/java/com/pine/panels/files/DirectoryPanel.java +++ /dev/null @@ -1,246 +0,0 @@ -package com.pine.panels.files; - -import com.pine.component.ComponentType; -import com.pine.component.MeshComponent; -import com.pine.core.AbstractView; -import com.pine.injection.PInject; -import com.pine.repository.EditorRepository; -import com.pine.repository.FSEntry; -import com.pine.repository.FilesRepository; -import com.pine.repository.WorldRepository; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.FilesService; -import com.pine.service.grid.WorldService; -import com.pine.service.importer.ImporterService; -import com.pine.service.importer.data.SceneImportData; -import com.pine.service.rendering.RequestProcessingService; -import com.pine.service.request.AddEntityRequest; -import com.pine.service.request.LoadSceneRequest; -import com.pine.service.streaming.impl.SceneService; -import com.pine.theme.Icons; -import imgui.ImGui; -import imgui.ImVec4; -import imgui.flag.*; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - -public class DirectoryPanel extends AbstractView { - private static final ImVec4 DIRECTORY_COLOR = new ImVec4( - 1, - 0.8352941f, - 0.38039216f, - 1 - ); - private static final int FLAGS = ImGuiTableFlags.ScrollY | ImGuiTableFlags.RowBg; - - @PInject - public FilesService filesService; - @PInject - public FilesRepository filesRepository; - @PInject - public WorldService worldService; - @PInject - public EditorRepository editorRepository; - @PInject - public RequestProcessingService requestProcessingService; - @PInject - public SceneService sceneService; - @PInject - public ImporterService importerService; - @PInject - public WorldRepository worldRepository; - - public boolean isWindowFocused; - public String currentDirectory; - public Map selected; - public Map toCut; - public FSEntry inspection; - - @Override - public void render() { - hotkeys(); - - if (ImGui.beginTable(imguiId, 5, FLAGS)) { - ImGui.tableSetupColumn("", ImGuiTableColumnFlags.WidthFixed, 30f); - ImGui.tableSetupColumn("Name", ImGuiTableColumnFlags.WidthStretch); - ImGui.tableSetupColumn("Import date", ImGuiTableColumnFlags.WidthFixed, 100f); - ImGui.tableSetupColumn("Type", ImGuiTableColumnFlags.WidthFixed, 100f); - ImGui.tableSetupColumn("Size", ImGuiTableColumnFlags.WidthFixed, 100f); - ImGui.tableHeadersRow(); - - List children = filesRepository.parentChildren.get(currentDirectory); - if (children != null) { - for (var child : children) { - FSEntry fEntry = filesRepository.entry.get(child); - if (fEntry.isDirectory()) { - renderDirectory(fEntry); - } else { - renderFile(fEntry); - } - } - } - ImGui.endTable(); - } - } - - private void renderDirectory(FSEntry root) { - ImGui.tableNextRow(); - if (selected.containsKey(root.getId())) { - ImGui.tableSetBgColor(ImGuiTableBgTarget.RowBg0, editorRepository.accentU32); - ImGui.tableSetBgColor(ImGuiTableBgTarget.RowBg1, editorRepository.accentU32); - } - - ImGui.tableNextColumn(); - ImGui.textColored(DIRECTORY_COLOR, Icons.folder); - onClick(root); - if (toCut.containsKey(root.id)) { - textDisabledColumn(root.name, root); - textDisabledColumn("--", root); - textDisabledColumn("Directory", root); - textDisabledColumn("--", root); - } else { - textColumn(root.name, root); - textColumn("--", root); - textColumn("Directory", root); - textColumn("--", root); - } - } - - private void renderFile(FSEntry root) { - StreamableResourceType resourceType = root.getType(); - ImGui.tableNextRow(); - if (selected.containsKey(root.getId())) { - ImGui.tableSetBgColor(ImGuiTableBgTarget.RowBg0, editorRepository.accentU32); - ImGui.tableSetBgColor(ImGuiTableBgTarget.RowBg1, editorRepository.accentU32); - } - if (toCut.containsKey(root.getId())) { - textDisabledColumn(resourceType.getIcon(), root); - textDisabledColumn(root.name, root); - textDisabledColumn(root.creationDateString, root); - textDisabledColumn(resourceType.getTitle(), root); - textDisabledColumn(root.sizeText, root); - } else { - textColumn(resourceType.getIcon(), root); - textColumn(root.name, root); - textColumn(root.creationDateString, root); - textColumn(resourceType.getTitle(), root); - textColumn(root.sizeText, root); - } - } - - private void textColumn(String Directory, FSEntry root) { - ImGui.tableNextColumn(); - ImGui.text(Directory); - onClick(root); - } - - private void textDisabledColumn(String label, FSEntry entry) { - ImGui.tableNextColumn(); - ImGui.textDisabled(label); - onClick(entry); - } - - protected void hotkeys() { - if (!isWindowFocused) { - return; - } - if (ImGui.isKeyPressed(ImGuiKey.Enter) && !selected.isEmpty()) { - openSelected(); - } - - if (ImGui.isKeyPressed(ImGuiKey.Delete) && !selected.isEmpty()) { - deleteSelected(); - } - - if (ImGui.isKeyDown(ImGuiKey.LeftCtrl) && ImGui.isKeyPressed(ImGuiKey.A)) { - selectAll(); - } - - if (ImGui.isKeyDown(ImGuiKey.LeftCtrl) && ImGui.isKeyPressed(ImGuiKey.X)) { - cutSelected(); - } - - if (ImGui.isKeyDown(ImGuiKey.LeftCtrl) && ImGui.isKeyPressed(ImGuiKey.V)) { - pasteSelected(); - } - } - - private void pasteSelected() { - for (var key : toCut.keySet()) { - var children = filesRepository.parentChildren.get(currentDirectory); - if (!children.contains(key)) { - var previousParentId = filesRepository.childParent.get(key); - filesRepository.parentChildren.get(previousParentId).remove(key); - - children.add(key); - filesRepository.childParent.put(key, currentDirectory); - } - } - toCut.clear(); - } - - private void openSelected() { - for (String id : selected.keySet()) { - openResource(filesRepository.entry.get(id)); - } - } - - private void cutSelected() { - toCut.clear(); - toCut.putAll(selected); - } - - private void selectAll() { - var children = filesRepository.parentChildren.get(currentDirectory); - for (var child : children) { - selected.put(child, true); - } - } - - private void deleteSelected() { - filesService.deleteSelected(selected.keySet()); - } - - protected void onClick(FSEntry root) { - if (ImGui.isItemHovered() && ImGui.isItemClicked()) { - if (!ImGui.isKeyDown(ImGuiKey.LeftCtrl)) { - selected.clear(); - } - selected.put(root.getId(), true); - if (root.isDirectory()) { - inspection = null; - } else { - inspection = root; - } - } - if (ImGui.isItemHovered() && ImGui.isMouseDoubleClicked(ImGuiMouseButton.Left)) { - openResource(root); - } - } - - protected void openResource(FSEntry root) { - if (root == null) { - return; - } - if (root.isDirectory()) { - currentDirectory = root.id; - selected.clear(); - } else { - switch (root.getType()) { - case SCENE -> { - var scene = (SceneImportData) sceneService.stream(importerService.getPathToFile(root.getId(), StreamableResourceType.SCENE), Collections.emptyMap(), Collections.emptyMap()); - requestProcessingService.addRequest(new LoadSceneRequest(worldRepository.entityMap.get(WorldRepository.ROOT_ID), scene)); - } - case MESH -> { - var request = new AddEntityRequest(List.of(ComponentType.MESH)); - requestProcessingService.addRequest(request); - - MeshComponent meshComponent = worldRepository.bagMeshComponent.get(request.getResponse().id()); - meshComponent.lod0 = root.getId(); - } - } - } - } -} diff --git a/editor/src/main/java/com/pine/panels/header/GlobalSettingsPanel.java b/editor/src/main/java/com/pine/panels/header/GlobalSettingsPanel.java deleted file mode 100644 index b53ed38f..00000000 --- a/editor/src/main/java/com/pine/panels/header/GlobalSettingsPanel.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.pine.panels.header; - -import com.pine.core.AbstractView; -import com.pine.core.UIUtil; -import com.pine.injection.PInject; -import com.pine.repository.*; -import com.pine.theme.Icons; -import imgui.ImGui; -import imgui.type.ImInt; - -import static com.pine.theme.Icons.ONLY_ICON_BUTTON_SIZE; - -public class GlobalSettingsPanel extends AbstractView { - private static final String[] SHADING_MODE_OPTIONS = DebugShadingModel.getLabels(); - - private final float[] cameraSensitivity = new float[1]; - private final ImInt editorMode = new ImInt(0); - - @PInject - public EngineRepository engineRepository; - - @PInject - public EditorRepository editorRepository; - - @PInject - public CameraRepository cameraRepository; - - @Override - public void render() { - editorMode.set(editorRepository.editorMode.index); - ImGui.setNextItemWidth(150); - if (ImGui.combo(imguiId, editorMode, EditorMode.getOptions())) { - editorRepository.editorMode = EditorMode.valueOfIndex(editorMode.get()); - } - cameraMode(); - shadingMode(); - } - - - private void cameraMode() { - UIUtil.dynamicSpacing(575); - ImGui.text("Camera"); - ImGui.sameLine(); - if (ImGui.button(Icons.center_focus_strong + "##centerCamera", ONLY_ICON_BUTTON_SIZE, ONLY_ICON_BUTTON_SIZE)) { - cameraRepository.currentCamera.position.zero(); - cameraRepository.currentCamera.registerChange(); - } - - ImGui.sameLine(); - cameraSensitivity[0] = cameraRepository.movementSensitivity; - ImGui.setNextItemWidth(75); - if (ImGui.dragFloat( "##speedCamera", cameraSensitivity, .1f, .1f)) { - cameraRepository.movementSensitivity = Math.max(0, cameraSensitivity[0]); - } - } - - private void shadingMode() { - UIUtil.dynamicSpacing(405); - - ImGui.text("Shading"); - - ImGui.sameLine(); - if (UIUtil.renderOption(Icons.grid_on + "##grid", editorRepository.gridOverlayObjects, true, editorRepository.accent)) { - editorRepository.gridOverlayObjects = !editorRepository.gridOverlayObjects; - } - - ImGui.sameLine(); - if (UIUtil.renderOption(Icons.details + "Wireframe##wireframeShading", engineRepository.debugShadingModel == DebugShadingModel.WIREFRAME, false, editorRepository.accent)) { - engineRepository.debugShadingModel = DebugShadingModel.WIREFRAME; - editorRepository.shadingModelOption.set(DebugShadingModel.WIREFRAME.getIndex()); - } - - ImGui.sameLine(); - if (UIUtil.renderOption(Icons.palette + "Random##randomShading", engineRepository.debugShadingModel == DebugShadingModel.RANDOM, false, editorRepository.accent)) { - engineRepository.debugShadingModel = DebugShadingModel.RANDOM; - editorRepository.shadingModelOption.set(DebugShadingModel.RANDOM.getIndex()); - } - - ImGui.sameLine(); - ImGui.setNextItemWidth(150); - if (ImGui.combo("##shadingMode", editorRepository.shadingModelOption, SHADING_MODE_OPTIONS)) { - engineRepository.debugShadingModel = DebugShadingModel.values()[editorRepository.shadingModelOption.get()]; - } - } - -} diff --git a/editor/src/main/java/com/pine/panels/inspector/AbstractResourceField.java b/editor/src/main/java/com/pine/panels/inspector/AbstractResourceField.java deleted file mode 100644 index 3c8209d0..00000000 --- a/editor/src/main/java/com/pine/panels/inspector/AbstractResourceField.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.pine.panels.inspector; - -import com.pine.core.AbstractView; -import com.pine.injection.PInject; -import com.pine.repository.FSEntry; -import com.pine.repository.FilesRepository; -import com.pine.repository.FoliageInstance; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.repository.streaming.StreamingRepository; -import com.pine.theme.Icons; -import imgui.ImGui; -import imgui.type.ImInt; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -public abstract class AbstractResourceField extends AbstractView { - @PInject - public StreamingRepository repository; - - @PInject - public FilesRepository filesRepository; - - private final ImInt selected = new ImInt(0); - private String[] itemsArr = new String[0]; - private int previousSize = -1; - private final List allByType = new ArrayList<>(); - protected FoliageInstance foliage; - - public void setFoliage(FoliageInstance foliage) { - this.foliage = foliage; - } - - public abstract String getSelected(); - - public abstract void setSelected(String selected); - - public abstract StreamableResourceType getType(); - - private void refresh() { - List byType = filesRepository.byType.get(getType()); - if (byType.size() != allByType.size()) { - allByType.clear(); - for (var f : byType) { - allByType.add(filesRepository.entry.get(f)); - } - if (previousSize != allByType.size()) { - previousSize = allByType.size(); - itemsArr = new String[allByType.size() + 1]; - itemsArr[0] = "None"; - for (int i = 0, allByTypeSize = allByType.size(); i < allByTypeSize; i++) { - var file = allByType.get(i); - itemsArr[i + 1] = file.name; - } - - if (getSelected() != null) { - for (int i = 0; i < allByType.size(); i++) { - if (Objects.equals(allByType.get(i).getId(), getSelected())) { - selected.set(i); - } - } - } - } - } - } - - @Override - public void render() { - refresh(); - if (ImGui.combo(imguiId + foliage.id, selected, itemsArr)) { - if(selected.get() == 0){ - setSelected(null); - }else { - setSelected(allByType.get(selected.get() - 1).getId()); - } - } - } -} diff --git a/editor/src/main/java/com/pine/panels/inspector/FoliagePanel.java b/editor/src/main/java/com/pine/panels/inspector/FoliagePanel.java deleted file mode 100644 index 65f3161e..00000000 --- a/editor/src/main/java/com/pine/panels/inspector/FoliagePanel.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.pine.panels.inspector; - -import com.pine.core.AbstractView; -import com.pine.injection.PInject; -import com.pine.repository.*; -import com.pine.repository.terrain.TerrainRepository; -import com.pine.theme.Icons; -import imgui.ImGui; -import imgui.flag.ImGuiTableColumnFlags; -import imgui.flag.ImGuiTableFlags; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -import static com.pine.theme.Icons.ONLY_ICON_BUTTON_SIZE; - -public class FoliagePanel extends AbstractView { - public static final int TABLE_FLAGS = ImGuiTableFlags.Resizable | ImGuiTableFlags.RowBg | ImGuiTableFlags.NoBordersInBody; - - @PInject - public EditorRepository editorRepository; - - @PInject - public FilesRepository filesRepository; - - @PInject - public TerrainRepository terrainRepository; - - private final Map toRemove = new HashMap<>(); - private AbstractResourceField materialField; - private AbstractResourceField meshField; - - @Override - public void onInitialize() { - materialField = appendChild(new MaterialResourceField()); - meshField = appendChild(new MeshResourceField()); - } - - @Override - public void render() { - if (ImGui.button(Icons.add + "Add foliage" + imguiId)) { - var instance = new FoliageInstance(terrainRepository.foliage.size() + 1); - terrainRepository.foliage.put(instance.id, instance); - } - ImGui.dummy(0, 8); - renderSelected(); - } - - private void renderSelected() { - if (ImGui.beginTable("##foliage" + imguiId, 3, TABLE_FLAGS)) { - ImGui.tableSetupColumn("Name", ImGuiTableColumnFlags.WidthStretch); - ImGui.tableSetupColumn("Material", ImGuiTableColumnFlags.WidthStretch); - ImGui.tableSetupColumn("Mesh", ImGuiTableColumnFlags.WidthStretch); - ImGui.tableHeadersRow(); - - for (FoliageInstance m : terrainRepository.foliage.values()) { - FSEntry entry = filesRepository.entry.get(m.id); - - if (entry == null) { - toRemove.put(m.id, true); - continue; - } - - ImGui.tableNextRow(); - ImGui.tableNextColumn(); - ImGui.text(entry.name); - ImGui.sameLine(); - boolean isSelected = Objects.equals(editorRepository.foliageForPainting, m.id); - if (ImGui.button((!isSelected ? Icons.check_box_outline_blank : Icons.check_box) + "##" + m.id, ONLY_ICON_BUTTON_SIZE, ONLY_ICON_BUTTON_SIZE)) { - editorRepository.foliageForPainting = isSelected ? null : m.id; - } - ImGui.sameLine(); - if (ImGui.button(Icons.remove + "##" + m.id, ONLY_ICON_BUTTON_SIZE, ONLY_ICON_BUTTON_SIZE)) { - toRemove.put(m.id, true); - if (Objects.equals(editorRepository.foliageForPainting, m.id)) { - editorRepository.foliageForPainting = null; - } - } - - ImGui.tableNextColumn(); - materialField.setFoliage(m); - materialField.render(); - - ImGui.tableNextColumn(); - meshField.setFoliage(m); - meshField.render(); - } - remove(); - ImGui.endTable(); - } - } - - private void remove() { - if (!toRemove.isEmpty()) { - for (String e : toRemove.keySet()) { - if (Objects.equals(e, editorRepository.foliageForPainting)) { - editorRepository.foliageForPainting = null; - } - terrainRepository.foliage.remove(e); - } - toRemove.clear(); - } - } -} diff --git a/editor/src/main/java/com/pine/panels/inspector/InspectorPanel.java b/editor/src/main/java/com/pine/panels/inspector/InspectorPanel.java deleted file mode 100644 index 9a47d193..00000000 --- a/editor/src/main/java/com/pine/panels/inspector/InspectorPanel.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.pine.panels.inspector; - -import com.pine.component.AbstractComponent; -import com.pine.component.ComponentType; -import com.pine.component.Entity; -import com.pine.core.AbstractView; -import com.pine.core.UIUtil; -import com.pine.core.dock.AbstractDockPanel; -import com.pine.injection.PInject; -import com.pine.inspection.Inspectable; -import com.pine.panels.component.FormPanel; -import com.pine.repository.EditorRepository; -import com.pine.repository.terrain.TerrainRepository; -import com.pine.repository.WorldRepository; -import com.pine.service.grid.WorldService; -import com.pine.service.rendering.RequestProcessingService; -import com.pine.service.request.AddComponentRequest; -import com.pine.service.request.UpdateFieldRequest; -import com.pine.theme.Icons; -import imgui.ImGui; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.stream.Stream; - -public class InspectorPanel extends AbstractDockPanel { - @PInject - public RequestProcessingService requestProcessingService; - @PInject - public EditorRepository editorRepository; - @PInject - public WorldService worldService; - @PInject - public WorldRepository world; - @PInject - public TerrainRepository terrainRepository; - @PInject - public List repositories; - - private final List additionalInspection = new ArrayList<>(); - - private Inspectable currentInspection; - private Entity selected; - private String selectedId; - private final List types = new ArrayList<>(); - private FormPanel formPanel; - private AbstractView foliagePanel; - - @Override - public void onInitialize() { - types.add(Icons.add + " Add component"); - types.addAll(Stream.of(ComponentType.values()).map(a -> a.getIcon() + a.getTitle()).toList()); - formPanel = appendChild(new FormPanel((dto, newValue) -> requestProcessingService.addRequest(new UpdateFieldRequest(dto, newValue)))); - foliagePanel = appendChild(new FoliagePanel()); - currentInspection = repositories.getFirst(); - } - - @Override - public void render() { - tick(); - ImGui.columns(2, "##inspectorColumns" + imguiId, false); - ImGui.setColumnWidth(0, 30); - for (var repo : repositories) { - if (UIUtil.renderOption(repo.getIcon(), Objects.equals(currentInspection, repo), true, editorRepository.accent)) { - currentInspection = repo; - } - } - - ImGui.spacing(); - ImGui.spacing(); - for (var additional : additionalInspection) { - if (additional != null) { - if (UIUtil.renderOption(additional.getIcon(), Objects.equals(currentInspection, additional), true, editorRepository.accent)) { - currentInspection = additional; - } - } - } - - ImGui.spacing(); - ImGui.spacing(); - - ImGui.nextColumn(); - if (ImGui.beginChild(imguiId + "form")) { - if (selected != null && additionalInspection.contains(currentInspection)) { - if (ImGui.beginCombo(imguiId, types.getFirst())) { - for (int i = 1; i < types.size(); i++) { - String type = types.get(i); - if (ImGui.selectable(type)) { - ComponentType entityComponent = ComponentType.values()[i - 1]; - requestProcessingService.addRequest(new AddComponentRequest(entityComponent, selected)); - selected = null; - selectedId = null; - } - } - ImGui.endCombo(); - } - } - - - if (formPanel.getInspectable() != currentInspection) { - formPanel.setInspection(currentInspection); - } - - formPanel.render(); - - if (Objects.equals(currentInspection, terrainRepository)) { - foliagePanel.render(); - } - } - ImGui.endChild(); - ImGui.columns(1); - } - - private void tick() { - if (!Objects.equals(editorRepository.mainSelection, selectedId)) { - additionalInspection.clear(); - selectedId = editorRepository.mainSelection; - - if (selectedId != null) { - for (var tile : worldService.getLoadedTiles()) { - if (tile != null) { - selected = selectedId != null ? world.entityMap.get(selectedId) : null; - if (selected != null) { - additionalInspection.add(selected); - world.runByComponent(this::addComponent, selectedId); - currentInspection = additionalInspection.getFirst(); - break; - } - } - } - } else { - selected = null; - } - - if (selectedId != null && selected == null) { - currentInspection = repositories.getFirst(); - } - } - } - - private void addComponent(AbstractComponent abstractComponent) { - additionalInspection.add(abstractComponent); - } -} diff --git a/editor/src/main/java/com/pine/panels/inspector/MaterialResourceField.java b/editor/src/main/java/com/pine/panels/inspector/MaterialResourceField.java deleted file mode 100644 index 26c94721..00000000 --- a/editor/src/main/java/com/pine/panels/inspector/MaterialResourceField.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.pine.panels.inspector; - -import com.pine.repository.streaming.StreamableResourceType; - -public class MaterialResourceField extends AbstractResourceField { - @Override - public String getSelected() { - return foliage.material; - } - - @Override - public void setSelected(String selected) { - foliage.material = selected; - } - - @Override - public StreamableResourceType getType() { - return StreamableResourceType.MATERIAL; - } -} diff --git a/editor/src/main/java/com/pine/panels/inspector/MeshResourceField.java b/editor/src/main/java/com/pine/panels/inspector/MeshResourceField.java deleted file mode 100644 index d9199200..00000000 --- a/editor/src/main/java/com/pine/panels/inspector/MeshResourceField.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.pine.panels.inspector; - -import com.pine.repository.streaming.StreamableResourceType; - -public class MeshResourceField extends AbstractResourceField { - @Override - public String getSelected() { - return foliage.mesh; - } - - @Override - public void setSelected(String selected) { - foliage.mesh = selected; - } - - @Override - public StreamableResourceType getType() { - return StreamableResourceType.MESH; - } -} diff --git a/editor/src/main/java/com/pine/panels/viewport/header/AbstractViewportSettingsPanel.java b/editor/src/main/java/com/pine/panels/viewport/header/AbstractViewportSettingsPanel.java deleted file mode 100644 index 407b2c59..00000000 --- a/editor/src/main/java/com/pine/panels/viewport/header/AbstractViewportSettingsPanel.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.pine.panels.viewport.header; - -import com.pine.core.AbstractView; -import com.pine.injection.PInject; -import com.pine.repository.EditorRepository; -import com.pine.service.streaming.StreamingService; - -public class AbstractViewportSettingsPanel extends AbstractView { - - @PInject - public EditorRepository editorRepository; - - @PInject - public StreamingService streamingService; - - public void renderOutside() { - - } -} diff --git a/editor/src/main/java/com/pine/panels/viewport/header/ViewportHeaderPanel.java b/editor/src/main/java/com/pine/panels/viewport/header/ViewportHeaderPanel.java deleted file mode 100644 index 82867ad5..00000000 --- a/editor/src/main/java/com/pine/panels/viewport/header/ViewportHeaderPanel.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.pine.panels.viewport.header; - -import com.pine.core.AbstractView; -import com.pine.core.UIUtil; -import com.pine.injection.PInject; -import com.pine.repository.EditorMode; -import com.pine.repository.EditorRepository; -import imgui.ImGui; -import imgui.ImVec2; -import imgui.flag.ImGuiStyleVar; -import imgui.flag.ImGuiWindowFlags; - -import static com.pine.core.dock.DockSpacePanel.FRAME_SIZE; - -public class ViewportHeaderPanel extends AbstractView { - private static final int FLAGS = ImGuiWindowFlags.NoResize | ImGuiWindowFlags.NoTitleBar | ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoCollapse; - private static final ImVec2 PADDING = new ImVec2(4, 4); - private static final float HEIGHT = 35; - - @PInject - public EditorRepository editorRepository; - - private AbstractViewportSettingsPanel paintGizmo; - private AbstractViewportSettingsPanel gizmo; - - @Override - public void onInitialize() { - appendChild(gizmo = new GizmoSettingsPanel()); - appendChild(paintGizmo = new PaintingSettingsPanel()); - } - - @Override - public void render() { - AbstractViewportSettingsPanel currentPanel; - if (editorRepository.editorMode == EditorMode.TRANSFORM) { - currentPanel = gizmo; - } else { - currentPanel = paintGizmo; - } - ImGui.setNextWindowPos(ImGui.getWindowPosX(), ImGui.getWindowPosY() + FRAME_SIZE); - ImGui.setNextWindowSize(ImGui.getWindowSizeX(), HEIGHT); - ImGui.setNextWindowBgAlpha(.4f); - ImGui.pushStyleVar(ImGuiStyleVar.WindowPadding, PADDING); - ImGui.begin(imguiId, UIUtil.OPEN, FLAGS); - ImGui.popStyleVar(); - currentPanel.render(); - ImGui.end(); - - currentPanel.renderOutside(); - } - -} diff --git a/editor/src/main/java/com/pine/tools/ToolsModule.java b/editor/src/main/java/com/pine/tools/ToolsModule.java deleted file mode 100644 index e4b19fe9..00000000 --- a/editor/src/main/java/com/pine/tools/ToolsModule.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.pine.tools; - -import com.pine.injection.EngineExternalModule; -import com.pine.service.system.AbstractPass; -import com.pine.service.system.impl.*; -import com.pine.tools.repository.ToolsResourceRepository; -import com.pine.tools.system.*; -import com.pine.tools.system.outline.BoxOutlineGenPass; -import com.pine.tools.system.outline.OutlineGenPass; -import com.pine.tools.system.outline.OutlineRenderingPass; -import com.pine.tools.system.outline.TerrainOutlineGenPass; - -import java.util.List; - -public class ToolsModule implements EngineExternalModule { - - @Override - public AbstractPass[] getExternalSystems() { - return new AbstractPass[]{ - new NoiseGenPass(), - new BRDFGenPass(), - new IrradianceGenPass(), - new EnvironmentMapFilteringGenPass(), - new ShaderDataSyncPass(), - new FoliageCullingPass(), - new TerrainGBufferPass(), - new PaintGizmoPass(), - new PrimitiveGBufferPass(), - new FoliageGBufferPass(), - new CopyDepthPass(), - new DecalGBufferPass(), - new IconsPass(), - new GBufferShadingPass(), - new AtmospherePass(), - new CompositingPass(), - new PostProcessingPass(), - new GridPass(), - - new OutlineGenPass(), - new TerrainOutlineGenPass(), - new BoxOutlineGenPass(), - new OutlineRenderingPass(), - new PaintGizmoRenderingPass(), - new VoxelVisualizerPass(), - new FrameCompositionPass() - }; - } - - @Override - public List getInjectables() { - return List.of(new ToolsResourceRepository()); - } -} diff --git a/editor/src/main/java/com/pine/tools/repository/ToolsResourceRepository.java b/editor/src/main/java/com/pine/tools/repository/ToolsResourceRepository.java deleted file mode 100644 index 9955d5b5..00000000 --- a/editor/src/main/java/com/pine/tools/repository/ToolsResourceRepository.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.pine.tools.repository; - -import com.pine.injection.PInject; -import com.pine.repository.RuntimeRepository; -import com.pine.service.module.Initializable; -import com.pine.service.resource.ShaderService; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.Shader; -import com.pine.service.streaming.ref.TextureResourceRef; -import com.pine.service.voxelization.util.TextureUtil; -import org.lwjgl.opengl.GL46; - -public class ToolsResourceRepository implements Initializable { - - @PInject - public ShaderService shaderService; - - @PInject - public RuntimeRepository repository; - - public Shader outlineShader; - public Shader gridShader; - public Shader outlineBoxGenShader; - public Shader paintGizmoCompute; - public Shader paintGizmoRenderingShader; - public Shader outlineGenShader; - public Shader iconShader; - public Shader outlineTerrainGenShader; - public FrameBufferObject outlineBuffer; - public int outlineSampler; - public TextureResourceRef icons; - - @Override - public void onInitialize() { - outlineShader = shaderService.create("QUAD.vert", "tool/OUTLINE.frag"); - paintGizmoRenderingShader = shaderService.create("QUAD.vert", "tool/PAINT_GIZMO.frag"); - outlineTerrainGenShader = shaderService.create("tool/OUTLINE_GEN_TERRAIN.vert", "tool/OUTLINE_GEN.frag"); - outlineGenShader = shaderService.create("tool/OUTLINE_GEN.vert", "tool/OUTLINE_GEN.frag"); - outlineBoxGenShader = shaderService.create("tool/OUTLINE_GEN.vert", "tool/OUTLINE_GEN_BOX.frag"); - gridShader = shaderService.create("QUAD.vert", "tool/GRID.frag"); - iconShader = shaderService.create("tool/ICON.vert", "tool/ICON.frag"); - paintGizmoCompute = shaderService.create("compute/PAINT_GIZMO_COMPUTE.glsl"); - - outlineBuffer = new FrameBufferObject(repository.getDisplayW(), repository.getDisplayH()).addSampler(0, GL46.GL_R16F, GL46.GL_RED, GL46.GL_FLOAT, false, false); - outlineSampler = outlineBuffer.getSamplers().getFirst(); - icons = TextureUtil.loadTextureFromResource("/textures/icons.png"); - } -} diff --git a/editor/src/main/java/com/pine/tools/system/outline/TerrainOutlineGenPass.java b/editor/src/main/java/com/pine/tools/system/outline/TerrainOutlineGenPass.java deleted file mode 100644 index a9578c69..00000000 --- a/editor/src/main/java/com/pine/tools/system/outline/TerrainOutlineGenPass.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.pine.tools.system.outline; - -import com.pine.injection.PInject; -import com.pine.repository.EditorMode; -import com.pine.repository.EditorRepository; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.system.AbstractPass; -import com.pine.tools.repository.ToolsResourceRepository; -import com.pine.tools.types.ExecutionEnvironment; - - -public class TerrainOutlineGenPass extends AbstractPass { - @PInject - public EditorRepository editorRepository; - - @PInject - public ToolsResourceRepository toolsResourceRepository; - - private UniformDTO tilesScaleTranslation; - private UniformDTO textureSize; - private UniformDTO heightScale; - private UniformDTO terrainOffset; - - @Override - public void onInitialize() { - terrainOffset = addUniformDeclaration("terrainOffset"); - textureSize = addUniformDeclaration("textureSize"); - tilesScaleTranslation = addUniformDeclaration("tilesScaleTranslation"); - heightScale = addUniformDeclaration("heightScale"); - } - - @Override - protected boolean isRenderable() { - return terrainRepository.enabled && editorRepository.editorMode != EditorMode.TRANSFORM && editorRepository.showOutline && editorRepository.environment == ExecutionEnvironment.DEVELOPMENT; - } - - @Override - protected Shader getShader() { - return toolsResourceRepository.outlineTerrainGenShader; - } - - @Override - protected FrameBufferObject getTargetFBO() { - return toolsResourceRepository.outlineBuffer; - } - - @Override - protected boolean shouldClearFBO() { - return true; - } - - @Override - protected void renderInternal() { - meshService.renderTerrain(textureSize, terrainOffset, heightScale, tilesScaleTranslation); - } - - @Override - public String getTitle() { - return "Terrain Outline Generation"; - } -} diff --git a/engine/pom.xml b/engine/pom.xml deleted file mode 100644 index d1a49a3b..00000000 --- a/engine/pom.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - 4.0.0 - - com.pine - pineengine - 0.0.1-SNAPSHOT - - - engine - - - 22 - 22 - UTF-8 - - - - - com.pine - common - 0.0.1-SNAPSHOT - - - - \ No newline at end of file diff --git a/engine/src/main/java/com/pine/component/ComponentType.java b/engine/src/main/java/com/pine/component/ComponentType.java deleted file mode 100644 index 7eee2d06..00000000 --- a/engine/src/main/java/com/pine/component/ComponentType.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.pine.component; - -import com.pine.component.light.PointLightComponent; -import com.pine.component.light.SphereLightComponent; -import com.pine.component.light.SpotLightComponent; -import com.pine.theme.Icons; -import com.pine.type.LightType; - -import java.io.Serializable; - -public enum ComponentType implements Serializable { - POINT_LIGHT(LightType.POINT.getTitle(), Icons.lightbulb, PointLightComponent.class), - SPHERE_LIGHT(LightType.SPHERE.getTitle(), Icons.sunny, SphereLightComponent.class), - SPOT_LIGHT(LightType.SPOT.getTitle(), Icons.highlight, SpotLightComponent.class), - ENVIRONMENT_PROBE("Environment Probe", Icons.blur_on, EnvironmentProbeComponent.class), - MESH("Mesh", Icons.category, MeshComponent.class), - DECAL("Decal", Icons.layers, DecalComponent.class), - CULLING("Culling", Icons.visibility_off, CullingComponent.class), - TRANSFORMATION("Transformation", Icons.transform, TransformationComponent.class); - - private final String title; - private final String icon; - private transient final Class clazz; - - ComponentType(String title, String icon, Class clazz) { - this.title = title; - this.icon = icon; - this.clazz = clazz; - } - - public String getTitle() { - return title; - } - - public Class getClazz() { - return clazz; - } - - public String getIcon() { - return icon; - } -} diff --git a/engine/src/main/java/com/pine/injection/EngineExternalModule.java b/engine/src/main/java/com/pine/injection/EngineExternalModule.java deleted file mode 100644 index e9dc049d..00000000 --- a/engine/src/main/java/com/pine/injection/EngineExternalModule.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.pine.injection; - -import com.pine.service.system.AbstractPass; - -import java.util.Collections; -import java.util.List; - -public interface EngineExternalModule { - AbstractPass[] getExternalSystems(); - - default void onInitialize() { - } - - /** - * Only accessible through systems via @EngineDependency - * @return - */ - default List getInjectables() { - return Collections.emptyList(); - } -} diff --git a/engine/src/main/java/com/pine/repository/AtmosphereRepository.java b/engine/src/main/java/com/pine/repository/AtmosphereRepository.java deleted file mode 100644 index c9cf00c3..00000000 --- a/engine/src/main/java/com/pine/repository/AtmosphereRepository.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.pine.repository; - -import com.pine.SerializableRepository; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.inspection.Color; -import com.pine.inspection.ExecutableField; -import com.pine.inspection.Inspectable; -import com.pine.inspection.InspectableField; -import com.pine.service.environment.EnvironmentMapGenService; -import com.pine.theme.Icons; -import com.pine.type.AtmosphereType; -import org.joml.Vector3f; -import org.joml.Vector4f; - -@PBean -public class AtmosphereRepository extends Inspectable implements SerializableRepository { - - @PInject - public transient EnvironmentMapGenService environmentMapGenService; - - @ExecutableField(label = "Bake environment maps", icon = Icons.panorama_photosphere) - public void process() { - environmentMapGenService.bake(); - } - - - @InspectableField(label = "Render atmosphere") - public boolean enabled = false; - - @InspectableField(group = "Time", label = "Elapsed time") - public float elapsedTime = .5f; - - @InspectableField(group = "Time", label = "Increment time") - public boolean incrementTime = false; - - @InspectableField(group = "Time", label = "Time of day speed") - public float elapsedTimeSpeed = 1; - - @InspectableField(group = "Sun", label = "Sun distance") - public float sunDistance = 100_000; - - @InspectableField(group = "Sun", label = "Dawn color") - public Color dawnColor = new Color(1, .39f, .19f); - - @InspectableField(group = "Sun", label = "Night color") - public Color nightColor = new Color(.1f, .1f, .1f); - - @InspectableField(group = "Sun", label = "Midday color") - public Color middayColor = new Color(1, 1, 1); - - @InspectableField(label = "Screen space shadows") - public boolean screenSpaceShadows = false; - - @InspectableField(group = "Atmospheric scattering", label = "Max samples", max = 20, min = 1) - public int maxSamples = 5; - @InspectableField(group = "Atmospheric scattering", label = "Mie height") - public int mieHeight = 1000; - @InspectableField(group = "Atmospheric scattering", label = "Rayleigh Height") - public int rayleighHeight = 8000; - @InspectableField(group = "Atmospheric scattering", label = "Atmosphere Radius", min = 1) - public float atmosphereRadius = 1; - @InspectableField(group = "Atmospheric scattering", label = "Planet Radius", max = 1, min = 0) - public float planetRadius = 1; - @InspectableField(group = "Atmospheric scattering", label = "Intensity", max = 20, min = 1) - public float intensity = 10; - @InspectableField(group = "Atmospheric scattering", label = "Rendering Type") - public AtmosphereType renderingType = AtmosphereType.COMBINED; - @InspectableField(group = "Atmospheric scattering", label = "Beta Rayleigh") - public final Vector3f betaRayleigh = new Vector3f(1); - @InspectableField(group = "Atmospheric scattering", label = "Beta Mie") - public final Vector3f betaMie = new Vector3f(1); - @InspectableField(group = "Atmospheric scattering", label = "Threshold", max = 10, min = -1) - public float threshold = -.1f; - - - @InspectableField(group = "Clouds", label = "Layer height", min = 1) - public int cloudsHeight = 500; - @InspectableField(group = "Clouds", label = "Layer width and depth", min = 1) - public int cloudsSize = 100_000; - @InspectableField(group = "Clouds", label = "Layer altitude") - public int cloudsAltitude = 1000; - - @InspectableField(group = "Cloud detail", label = "Detail noise scale", min = 0) - public float detailNoiseScale = 1; - @InspectableField(group = "Cloud detail", label = "Detail noise weight", min = 1) - public float detailNoiseWeight = 1; - @InspectableField(group = "Cloud detail", label = "Detail noise weights", min = 0) - public Vector3f detailWeights = new Vector3f(0, 0, 1); - @InspectableField(group = "Cloud detail", label = "Detail offset") - public Vector3f detailOffset = new Vector3f(0); - @InspectableField(group = "Cloud detail", label = "Detail scroll speed", min = 0, max = 1) - public float detailScrollSpeed = 1; - - @InspectableField(group = "Cloud shape", label = "Shape noise weights") - public Vector4f shapeNoiseWeights = new Vector4f(0, 0, 1, -.75f); - @InspectableField(group = "Cloud shape", label = "Shape offset") - public Vector3f shapeOffset = new Vector3f(0); - @InspectableField(group = "Cloud shape", label = "Shape scroll speed", min = 0) - public float shapeScrollSpeed = 1; - - @InspectableField(group = "Clouds", label = "Density multiplier", min = 0) - public float densityMultiplier = 1; - @InspectableField(group = "Clouds", label = "Density offset", min = 0) - public float densityOffset = 0; - @InspectableField(group = "Clouds", label = "Scale", min = 0) - public float scale = .2f; - - @InspectableField(group = "Clouds", label = "Phase params") - public Vector4f phaseParams = new Vector4f(0, 0, .3f, 1); - @InspectableField(group = "Clouds", label = "Light step count", max = 10, min = 0) - public int numStepsLight = 5; - @InspectableField(group = "Clouds", label = "Ray offset strength", min = 0) - public float rayOffsetStrength = 1; - - @InspectableField(group = "Clouds", label = "Light absorption toward sun", min = 0, max = 1) - public float lightAbsorptionTowardSun = 1; - @InspectableField(group = "Clouds", label = "Light absorption through cloud", min = 0, max = 1) - public float lightAbsorptionThroughCloud = .5f; - @InspectableField(group = "Clouds", label = "Darkness threshold", min = 0, max = 1) - public float darknessThreshold = 0; - - @Override - public String getTitle() { - return "Atmosphere Settings"; - } - - @Override - public String getIcon() { - return Icons.cloud_sync; - } -} \ No newline at end of file diff --git a/engine/src/main/java/com/pine/repository/FoliageInstance.java b/engine/src/main/java/com/pine/repository/FoliageInstance.java deleted file mode 100644 index 84ea75b5..00000000 --- a/engine/src/main/java/com/pine/repository/FoliageInstance.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.pine.repository; - -import com.pine.inspection.Color; - -import java.util.UUID; - -public class FoliageInstance { - public final String id = UUID.randomUUID().toString(); - public String material; - public String mesh; - public final Color color = new Color(); - public int count = 0; - public int offset = 0; - - public FoliageInstance(int i) { - color.x = (i >> 16) & 0xFF; - color.y = (i >> 8) & 0xFF; - color.z = i & 0xFF; - } -} diff --git a/engine/src/main/java/com/pine/repository/core/CoreBufferRepository.java b/engine/src/main/java/com/pine/repository/core/CoreBufferRepository.java deleted file mode 100644 index 7a97a78f..00000000 --- a/engine/src/main/java/com/pine/repository/core/CoreBufferRepository.java +++ /dev/null @@ -1,234 +0,0 @@ -package com.pine.repository.core; - -import com.pine.Engine; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.repository.RuntimeRepository; -import com.pine.service.resource.ShaderService; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.GLSLType; -import com.pine.service.resource.ssbo.SSBOCreationData; -import com.pine.service.resource.ssbo.ShaderStorageBufferObject; -import com.pine.service.resource.ubo.UBOCreationData; -import com.pine.service.resource.ubo.UBOData; -import com.pine.service.resource.ubo.UniformBufferObject; -import com.pine.service.streaming.ref.TextureResourceRef; -import com.pine.service.voxelization.util.TextureUtil; -import org.lwjgl.opengl.GL46; -import org.lwjgl.system.MemoryUtil; - -import java.nio.FloatBuffer; -import java.util.ArrayList; -import java.util.List; - -import static com.pine.Engine.MAX_LIGHTS; - -@PBean -public class CoreBufferRepository implements CoreRepository { - public static final int[] ZERO = new int[]{0}; - public static final int MAX_INSTANCING = 500_000; - public static final int MAX_INFO_PER_LIGHT = 16; - private static final int LIGHT_BUFFER_SIZE = MAX_LIGHTS * MAX_INFO_PER_LIGHT; - - @PInject - public Engine engine; - @PInject - public ShaderService shaderService; - @PInject - public RuntimeRepository runtimeRepository; - - public final FloatBuffer lightSSBOState = MemoryUtil.memAllocFloat(LIGHT_BUFFER_SIZE); - public ShaderStorageBufferObject lightMetadataSSBO; - public ShaderStorageBufferObject foliageTransformationSSBO; - - public FrameBufferObject gBufferTarget; - public FrameBufferObject postProcessingBuffer; - public FrameBufferObject ssao; - public FrameBufferObject ssaoBlurred; - public FrameBufferObject gBuffer; - public FrameBufferObject auxBufferQuaterRes; - public FrameBufferObject sceneDepthCopy; - public final List upscaleBloom = new ArrayList<>(); - public final List downscaleBloom = new ArrayList<>(); - public final List all = new ArrayList<>(); - public FrameBufferObject brdfFBO; - public FrameBufferObject compositingBuffer; - public FrameBufferObject noiseBuffer; - - public TextureResourceRef cloudNoiseTexture; - public TextureResourceRef cloudShapeTexture; - - public int auxBufferQuaterResSampler; - public int noiseSampler; - public int sceneDepthCopySampler; - public int atomicCounterBuffer; - public int gBufferAlbedoSampler; - public int gBufferNormalSampler; - public int gBufferRMAOSampler; - public int gBufferMaterialSampler; - public int gBufferDepthIndexSampler; - public int gBufferIndirectSampler; - public int gBufferTargetSampler; - public int postProcessingSampler; - public int ssaoSampler; - public int ssaoBlurredSampler; - public int brdfSampler; - public int compositingSampler; - - - public UniformBufferObject globalDataUBO; - public final FloatBuffer globalDataBuffer = MemoryUtil.memAllocFloat(95); - - - - @Override - public void initialize() { - cloudShapeTexture = TextureUtil.create3DTexture(128, 128, 128, GL46.GL_RGBA16F, GL46.GL_RGBA, GL46.GL_HALF_FLOAT); - cloudNoiseTexture = TextureUtil.create3DTexture(32, 32, 32, GL46.GL_RGBA16F, GL46.GL_RGBA, GL46.GL_HALF_FLOAT); - - atomicCounterBuffer = GL46.glGenBuffers(); - GL46.glBindBuffer(GL46.GL_ATOMIC_COUNTER_BUFFER, atomicCounterBuffer); - GL46.glBufferData(GL46.GL_ATOMIC_COUNTER_BUFFER, Integer.BYTES, GL46.GL_DYNAMIC_DRAW); - GL46.glBindBufferBase(GL46.GL_ATOMIC_COUNTER_BUFFER, 0, atomicCounterBuffer); - - globalDataUBO = new UniformBufferObject(new UBOCreationData( - "GlobalData", - new UBOData("viewProjection", GLSLType.MAT_4), // Offset: 0 - new UBOData("viewMatrix", GLSLType.MAT_4), // Offset: 16 - new UBOData("invViewMatrix", GLSLType.MAT_4), // Offset: 32 - new UBOData("cameraWorldPosition", GLSLType.VEC_4), // Offset: 48 - new UBOData("projectionMatrix", GLSLType.MAT_4), // Offset: 52 - new UBOData("invProjectionMatrix", GLSLType.MAT_4), // Offset: 68 - new UBOData("bufferResolution", GLSLType.VEC_2), // Offset: 84, 85 - new UBOData("logDepthFC", GLSLType.FLOAT), // Offset: 86 - new UBOData("timeOfDay", GLSLType.FLOAT), // Offset: 88 - - new UBOData("sunLightDirection", GLSLType.VEC_3), // Offset: 89, 90, 91 - new UBOData("sunLightColor", GLSLType.VEC_3) // Offset: 92, 93, 94 - )); - - createFrameBuffers(); - } - - private void createFrameBuffers() { - final int displayW = runtimeRepository.getDisplayW(); - final int displayH = runtimeRepository.getDisplayH(); - - final int halfResW = runtimeRepository.getDisplayW() / 2; - final int halfResH = runtimeRepository.getDisplayH() / 2; - - noiseBuffer = new FrameBufferObject(256, 256) - .addSampler(0, GL46.GL_RG16F, GL46.GL_RG, GL46.GL_FLOAT, false, true); - noiseSampler = noiseBuffer.getSamplers().getFirst(); - - brdfFBO = new FrameBufferObject(512, 512).addSampler(0, GL46.GL_RG16F, GL46.GL_RG, GL46.GL_FLOAT, false, false); - brdfSampler = brdfFBO.getSamplers().getFirst(); - - createGBuffer(displayW, displayH); - createMainBuffers(displayW, displayH); - - ssao = new FrameBufferObject(halfResW, halfResH).addSampler(0, GL46.GL_R8, GL46.GL_RED, GL46.GL_UNSIGNED_BYTE, true, false); - ssaoBlurred = new FrameBufferObject(halfResW, halfResH).addSampler(0, GL46.GL_R8, GL46.GL_RED, GL46.GL_UNSIGNED_BYTE, true, false); - - int Q = 7; - int w = runtimeRepository.getDisplayW(); - int h = runtimeRepository.getDisplayH(); - for (int i = 0; i < Q; i++) { - w /= 2; - h /= 2; - downscaleBloom.add(new FrameBufferObject(w, h).addSampler(0, GL46.GL_RGBA, GL46.GL_RGBA, GL46.GL_UNSIGNED_BYTE, false, false)); - } - for (int i = 0; i < (Q / 2 - 1); i++) { - w *= 4; - h *= 4; - upscaleBloom.add(new FrameBufferObject(w, h).addSampler(0, GL46.GL_RGBA, GL46.GL_RGBA, GL46.GL_UNSIGNED_BYTE, false, false)); - } - - ssaoBlurredSampler = ssaoBlurred.getSamplers().getFirst(); - ssaoSampler = ssao.getSamplers().getFirst(); - - all.add(postProcessingBuffer); - all.add(gBuffer); - all.add(gBufferTarget); - all.add(ssao); - all.add(ssaoBlurred); - all.addAll(upscaleBloom); - all.addAll(downscaleBloom); - all.add(auxBufferQuaterRes); - all.add(compositingBuffer); - - createSSBOs(); - } - - private void createSSBOs() { - foliageTransformationSSBO = new ShaderStorageBufferObject(new SSBOCreationData( - 13, - (long) MAX_INSTANCING * GLSLType.FLOAT.getSize() * 3 - )); - - lightMetadataSSBO = new ShaderStorageBufferObject(new SSBOCreationData( - 11, - (long) LIGHT_BUFFER_SIZE * GLSLType.FLOAT.getSize() - )); - } - - private void createGBuffer(int displayW, int displayH) { - gBuffer = new FrameBufferObject(displayW, displayH) - .depthTest() - .addSampler(0, GL46.GL_RGBA8, GL46.GL_RGBA, GL46.GL_UNSIGNED_BYTE, false, false) // Albedo + Emissive flag - .addSampler(1, GL46.GL_RGB16F, GL46.GL_RGB, GL46.GL_FLOAT, false, false) // Normal - .addSampler(2, GL46.GL_RGB16F, GL46.GL_RGB, GL46.GL_FLOAT, false, false) // Roughness + Metallic + AO - - // X channel: 16 bits for anisotropicRotation + 16 bits for anisotropy - // Y channel: 16 bits for clearCoat + 16 bits for sheen - // Z channel: 16 bits for sheenTint + 15 bits for renderingMode + 1 bit for ssrEnabled - .addSampler(3, GL46.GL_RGB32F, GL46.GL_RGB, GL46.GL_FLOAT, false, false) - .addSampler(4, GL46.GL_RGBA32F, GL46.GL_RED, GL46.GL_FLOAT, false, false) // Log depth + render index + UV - .addSampler(5, GL46.GL_RGB16F, GL46.GL_RGB, GL46.GL_FLOAT, false, false); - gBufferAlbedoSampler = gBuffer.getSamplers().get(0); - gBufferNormalSampler = gBuffer.getSamplers().get(1); - gBufferRMAOSampler = gBuffer.getSamplers().get(2); - gBufferMaterialSampler = gBuffer.getSamplers().get(3); - gBufferDepthIndexSampler = gBuffer.getSamplers().get(4); - gBufferIndirectSampler = gBuffer.getSamplers().get(5); - } - - private void createMainBuffers(int displayW, int displayH) { - gBufferTarget = new FrameBufferObject(displayW, displayH) - .depthTest() - .addSampler(0, GL46.GL_RGBA16F, GL46.GL_RGBA, GL46.GL_FLOAT, false, false); - gBufferTargetSampler = gBufferTarget.getSamplers().getFirst(); - - compositingBuffer = new FrameBufferObject(displayW, displayH) - .addSampler(0, GL46.GL_RGB16F, GL46.GL_RGB, GL46.GL_FLOAT, false, false); - compositingSampler = compositingBuffer.getSamplers().getFirst(); - - auxBufferQuaterRes = new FrameBufferObject(displayW /4, displayH /4) - .addSampler(0, GL46.GL_RGB16F, GL46.GL_RGB, GL46.GL_FLOAT, true, false); - auxBufferQuaterResSampler = auxBufferQuaterRes.getMainSampler(); - - postProcessingBuffer = new FrameBufferObject(displayW, displayH) - .addSampler(0, GL46.GL_RGB, GL46.GL_RGB, GL46.GL_UNSIGNED_BYTE, false, false); - postProcessingSampler = postProcessingBuffer.getSamplers().getFirst(); - - sceneDepthCopy = new FrameBufferObject(displayW, displayH) - .addSampler(0, GL46.GL_RG32F, GL46.GL_RG, GL46.GL_FLOAT, false, false); - sceneDepthCopySampler = sceneDepthCopy.getSamplers().getFirst(); - } - - @Override - public void dispose() { - lightMetadataSSBO.dispose(); - foliageTransformationSSBO.dispose(); - globalDataUBO.dispose(); - auxBufferQuaterRes.dispose(); - gBufferTarget.dispose(); - postProcessingBuffer.dispose(); - ssao.dispose(); - ssaoBlurred.dispose(); - gBuffer.dispose(); - upscaleBloom.forEach(FrameBufferObject::dispose); - downscaleBloom.forEach(FrameBufferObject::dispose); - brdfFBO.dispose(); - } -} diff --git a/engine/src/main/java/com/pine/repository/core/CoreRepository.java b/engine/src/main/java/com/pine/repository/core/CoreRepository.java deleted file mode 100644 index 9b6db293..00000000 --- a/engine/src/main/java/com/pine/repository/core/CoreRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.pine.repository.core; - -import com.pine.injection.Disposable; - -public interface CoreRepository extends Disposable { - void initialize(); -} diff --git a/engine/src/main/java/com/pine/repository/core/CoreShaderRepository.java b/engine/src/main/java/com/pine/repository/core/CoreShaderRepository.java deleted file mode 100644 index 781ae589..00000000 --- a/engine/src/main/java/com/pine/repository/core/CoreShaderRepository.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.pine.repository.core; - -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.service.resource.ShaderService; -import com.pine.service.resource.shader.Shader; - -@PBean -public class CoreShaderRepository implements CoreRepository { - public Shader spriteShader; - public Shader gBufferShader; - public Shader gBufferTerrainShader; - public Shader gBufferDecalShader; - public Shader copyQuadShader; - public Shader gBufferFoliageShader; - public Shader foliageCullingCompute; - public Shader toScreenShader; - public Shader downscaleShader; - public Shader bilateralBlurShader; - public Shader bokehShader; - public Shader irradianceShader; - public Shader prefilteredShader; - public Shader ssgiShader; - public Shader mbShader; - public Shader ssaoShader; - public Shader boxBlurShader; - public Shader directShadowsShader; - public Shader omniDirectShadowsShader; - public Shader frameComposition; - public Shader bloomShader; - public Shader postProcessing; - public Shader gaussianShader; - public Shader upSamplingShader; - public Shader gBufferShading; - public Shader brdfShader; - public Shader voxelRaymarchingCompute; - public Shader cloudDetailCompute; - public Shader cloudShapeCompute; - public Shader cloudsRaymarcher; - public Shader compositingShader; - public Shader noiseShader; - - @PInject - public ShaderService shaderService; - - @Override - public void initialize() { - compositingShader = shaderService.create("QUAD.vert", "COMPOSITE.frag"); - noiseShader = shaderService.create("QUAD.vert", "NOISE.frag"); - gBufferShading = shaderService.create("QUAD.vert", "uber/G_BUFFER_SHADING.frag"); - brdfShader = shaderService.create("QUAD.vert", "BRDF_GEN.frag"); - spriteShader = shaderService.create("SPRITE.vert", "SPRITE.frag"); - gBufferShader = shaderService.create("uber/G_BUFFER.vert", "uber/G_BUFFER.frag"); - gBufferTerrainShader = shaderService.create("uber/G_BUFFER_TERRAIN.vert", "uber/G_BUFFER.frag"); - gBufferFoliageShader = shaderService.create("uber/G_BUFFER_FOLIAGE.vert", "uber/G_BUFFER.frag"); - foliageCullingCompute = shaderService.create("compute/FOLIAGE_CULLING_COMPUTE.glsl"); - toScreenShader = shaderService.create("QUAD.vert", "TO_SCREEN.frag"); - downscaleShader = shaderService.create("QUAD.vert", "BILINEAR_DOWNSCALE.glsl"); - bilateralBlurShader = shaderService.create("QUAD.vert", "BILATERAL_BLUR.glsl"); - bokehShader = shaderService.create("QUAD.vert", "BOKEH.frag"); - irradianceShader = shaderService.create("CUBEMAP.vert", "IRRADIANCE_MAP.frag"); - prefilteredShader = shaderService.create("CUBEMAP.vert", "PREFILTERED_MAP.frag"); - ssgiShader = shaderService.create("QUAD.vert", "SSGI.frag"); - mbShader = shaderService.create("QUAD.vert", "MOTION_BLUR.frag"); - ssaoShader = shaderService.create("QUAD.vert", "SSAO.frag"); - boxBlurShader = shaderService.create("QUAD.vert", "BOX-BLUR.frag"); - directShadowsShader = shaderService.create("SHADOWS.vert", "DIRECTIONAL_SHADOWS.frag"); - omniDirectShadowsShader = shaderService.create("SHADOWS.vert", "OMNIDIRECTIONAL_SHADOWS.frag"); - frameComposition = shaderService.create("QUAD.vert", "FRAME_COMPOSITION.frag"); - bloomShader = shaderService.create("QUAD.vert", "BRIGHTNESS_FILTER.frag"); - postProcessing = shaderService.create("QUAD.vert", "LENS_POST_PROCESSING.frag"); - gaussianShader = shaderService.create("QUAD.vert", "GAUSSIAN.frag"); - upSamplingShader = shaderService.create("QUAD.vert", "UPSAMPLE_TENT.glsl"); - voxelRaymarchingCompute = shaderService.create("compute/VOXEL_RAY_MARCHING_COMPUTE.glsl"); - cloudDetailCompute = shaderService.create("compute/CLOUD_DETAIL_COMPUTE.glsl"); - cloudShapeCompute = shaderService.create("compute/CLOUD_SHAPE_COMPUTE.glsl"); - cloudsRaymarcher = shaderService.create("QUAD.vert", "ATMOSPHERE.frag"); - gBufferDecalShader = shaderService.create("uber/G_BUFFER_DECAL.vert", "uber/G_BUFFER.frag"); - copyQuadShader = shaderService.create("QUAD.vert", "QUAD_COPY.frag"); - - } - - @Override - public void dispose() { - copyQuadShader.dispose(); - gBufferShading.dispose(); - spriteShader.dispose(); - gBufferShader.dispose(); - gBufferTerrainShader.dispose(); - brdfShader.dispose(); - gBufferFoliageShader.dispose(); - foliageCullingCompute.dispose(); - toScreenShader.dispose(); - downscaleShader.dispose(); - bilateralBlurShader.dispose(); - bokehShader.dispose(); - irradianceShader.dispose(); - prefilteredShader.dispose(); - ssgiShader.dispose(); - mbShader.dispose(); - ssaoShader.dispose(); - boxBlurShader.dispose(); - directShadowsShader.dispose(); - omniDirectShadowsShader.dispose(); - frameComposition.dispose(); - bloomShader.dispose(); - postProcessing.dispose(); - gaussianShader.dispose(); - upSamplingShader.dispose(); - voxelRaymarchingCompute.dispose(); - cloudDetailCompute.dispose(); - cloudShapeCompute.dispose(); - cloudsRaymarcher.dispose(); - gBufferDecalShader.dispose(); - - } -} diff --git a/engine/src/main/java/com/pine/repository/terrain/TerrainRepository.java b/engine/src/main/java/com/pine/repository/terrain/TerrainRepository.java deleted file mode 100644 index b96df30c..00000000 --- a/engine/src/main/java/com/pine/repository/terrain/TerrainRepository.java +++ /dev/null @@ -1,164 +0,0 @@ -package com.pine.repository.terrain; - -import com.pine.SerializableRepository; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.inspection.ExecutableField; -import com.pine.inspection.Inspectable; -import com.pine.inspection.InspectableField; -import com.pine.inspection.ResourceTypeField; -import com.pine.repository.FoliageInstance; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.ImageUtil; -import com.pine.service.importer.ImporterService; -import com.pine.service.streaming.StreamingService; -import com.pine.service.streaming.impl.TextureService; -import com.pine.service.streaming.ref.TextureResourceRef; -import com.pine.theme.Icons; -import org.joml.Vector2f; - -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -@PBean -public class TerrainRepository extends Inspectable implements SerializableRepository { - private static final int FOLIAGE_IMAGE_SCALE = 4; - public String foliageMask = UUID.randomUUID().toString(); - public String heightMapTexture = UUID.randomUUID().toString(); - public TerrainChunk[] chunks = null; - - @PInject - public transient ImporterService importer; - - @ExecutableField(label = Icons.calculate + "Import data") - public void reGenFoliage() { - new Thread(() -> { - tryDelete(foliageMask); - tryDelete(heightMapTexture); - - int width = cellsX * quads; - int height = cellsZ * quads; - - String foliageMaskLocal = UUID.randomUUID().toString(); - String heightMapTextureLocal = UUID.randomUUID().toString(); - - ImageUtil.generateTexture(width / FOLIAGE_IMAGE_SCALE, height / FOLIAGE_IMAGE_SCALE, importer.getPathToFile(foliageMaskLocal, StreamableResourceType.TEXTURE)); - ImageUtil.generateTexture(width, height, importer.getPathToFile(heightMapTextureLocal, StreamableResourceType.TEXTURE)); - if (heightMapTextureToImport != null) { - var targetPath = importer.getPathToFile(heightMapTextureLocal, StreamableResourceType.TEXTURE); - var originPath = importer.getPathToFile(heightMapTextureToImport, StreamableResourceType.TEXTURE); - ImageUtil.copyInto(originPath, targetPath, 1); - } - - chunks = new TerrainChunk[cellsX * cellsZ]; - int index = 0; - for (int x = 0; x < cellsX; x++) { - for (int z = 0; z < cellsZ; z++) { - float locationX = x * quads - offset.x; - float locationZ = z * quads - offset.y; - chunks[index] = new TerrainChunk(locationX, locationZ, (float) Math.floor(locationX / quads), (float) Math.floor(locationZ / quads), x, z); - index++; - } - } - foliageMask = foliageMaskLocal; - heightMapTexture = heightMapTextureLocal; - }).start(); - } - - private void tryDelete(String id) { - try { - Files.delete(Paths.get(importer.getPathToFile(id, StreamableResourceType.TEXTURE))); - } catch (Exception ignored) { - } - } - - @InspectableField(group = "Foliage", label = "Max distance from camera", min = 1) - public int maxDistanceFromCamera = 100; - - @InspectableField(group = "Foliage", label = "Max instances per cell (squared) ", min = 1, max = 15) - public int maxIterations = 5; - - @InspectableField(group = "Foliage", label = "Instance offset scale") - public Vector2f instanceOffset = new Vector2f(5); - - @InspectableField(group = "Wind", label = "Frequency", min = 1) - public float windFrequency = 20; - - @InspectableField(group = "Wind", label = "Strength", min = 0, max = 1) - public float windStrength = .5f; - - @InspectableField(group = "Wind", label = "Amplitude", min = 0) - public float windAmplitude = .15f; - - @InspectableField(label = "Render terrain") - public boolean enabled = false; - - @ResourceTypeField(type = StreamableResourceType.TEXTURE) - @InspectableField(label = "Height map to import") - public String heightMapTextureToImport; - - @ResourceTypeField(type = StreamableResourceType.MATERIAL) - @InspectableField(label = "Material") - public String material; - - @InspectableField(group = "Terrain", label = "Casts shadows") - public boolean castsShadows = true; - - @InspectableField(group = "Terrain", label = "Cells X axis", min = 1) - public int cellsX = 2; - - @InspectableField(group = "Terrain", label = "Cells Z axis", min = 1) - public int cellsZ = 2; - - @InspectableField(group = "Terrain", label = "Quads per cell (X by X)", min = 1) - public int quads = 150; - - @InspectableField(group = "Terrain", label = "Height scale") - public float heightScale = 1; - - @InspectableField(group = "Terrain", label = "Offset") - public Vector2f offset = new Vector2f(0); - - public final Map foliage = new HashMap<>(); - - @PInject - public transient StreamingService streamingService; - - @PInject - public transient ImporterService importerService; - - @PInject - public transient TextureService textureService; - - public transient boolean isHeightMapChanged = false; - public transient boolean isFoliageMaskChanged = false; - - @Override - public void onSave() { - if (isFoliageMaskChanged) { - var mask = (TextureResourceRef) streamingService.streamIn(foliageMask, StreamableResourceType.TEXTURE); - if (mask != null && mask.isLoaded()) { - textureService.writeTexture(importerService.getPathToFile(mask.id, StreamableResourceType.TEXTURE), mask.width, mask.height, mask.texture); - } - } - if (isHeightMapChanged) { - var heightMap = (TextureResourceRef) streamingService.streamIn(heightMapTexture, StreamableResourceType.TEXTURE); - if (heightMap != null && heightMap.isLoaded()) { - textureService.writeTexture(importerService.getPathToFile(heightMap.id, StreamableResourceType.TEXTURE), heightMap.width, heightMap.height, heightMap.texture); - } - } - } - - @Override - public String getTitle() { - return "Terrain & Foliage"; - } - - @Override - public String getIcon() { - return Icons.terrain; - } -} diff --git a/engine/src/main/java/com/pine/service/importer/impl/AudioImporter.java b/engine/src/main/java/com/pine/service/importer/impl/AudioImporter.java deleted file mode 100644 index d2d6dbd9..00000000 --- a/engine/src/main/java/com/pine/service/importer/impl/AudioImporter.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.pine.service.importer.impl; - -import com.pine.injection.PBean; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.importer.AbstractImporter; -import com.pine.service.importer.data.AbstractImportData; -import com.pine.service.importer.data.AudioImportData; -import com.pine.service.importer.metadata.AbstractResourceMetadata; -import com.pine.service.importer.metadata.AudioResourceMetadata; - -@PBean -public class AudioImporter extends AbstractImporter { - - @Override - public StreamableResourceType getResourceType() { - return StreamableResourceType.AUDIO; - } - - @Override - public AbstractResourceMetadata persist(AbstractImportData data) { - var cast = (AudioImportData) data; - var file = persistInternal(data); - return new AudioResourceMetadata(data.name, data.id); - } -} diff --git a/engine/src/main/java/com/pine/service/meshlet/MeshletInfo.java b/engine/src/main/java/com/pine/service/meshlet/MeshletInfo.java deleted file mode 100644 index 68a0183f..00000000 --- a/engine/src/main/java/com/pine/service/meshlet/MeshletInfo.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.pine.service.meshlet; - -public class MeshletInfo { - public final int vertexIndexStart; - public final int vertexIndexLength; - public final int trianglesStart; - public final int trianglesLength; - - public MeshletInfo( - int vertexIndexStart, - int vertexIndexLength, - int trianglesStart, - int trianglesLength - ) { - this.vertexIndexStart = vertexIndexStart; - this.vertexIndexLength = vertexIndexLength; - this.trianglesStart = trianglesStart; - this.trianglesLength = trianglesLength; - } -} \ No newline at end of file diff --git a/engine/src/main/java/com/pine/service/meshlet/MeshletUtil.java b/engine/src/main/java/com/pine/service/meshlet/MeshletUtil.java deleted file mode 100644 index 1a30187f..00000000 --- a/engine/src/main/java/com/pine/service/meshlet/MeshletUtil.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.pine.service.meshlet; - -import com.pine.service.importer.data.MeshImportData; -import org.lwjgl.system.MemoryUtil; -import org.lwjgl.util.meshoptimizer.MeshOptimizer; -import org.lwjgl.util.meshoptimizer.MeshoptMeshlet; - -import java.nio.ByteBuffer; -import java.nio.FloatBuffer; -import java.nio.IntBuffer; -import java.util.ArrayList; -import java.util.List; - -import static org.lwjgl.system.MemoryUtil.memAddress; - -public class MeshletUtil { - private static final long MAX_VERTICES = 64; - private static final long MAX_TRIANGLES = 124; - - public static Meshlets genMeshlets(MeshImportData data) { -// System.setProperty("org.lwjgl.util.NoChecks", "true"); - - long maxMeshlets = MeshOptimizer.meshopt_buildMeshletsBound(data.indices.length, MAX_VERTICES, MAX_TRIANGLES); - - // Allocate space for output meshlets and vertex remap - MeshoptMeshlet.Buffer meshlets = MeshoptMeshlet.create((int) maxMeshlets); - IntBuffer meshletVertices = MemoryUtil.memAllocInt((int) (maxMeshlets * MAX_VERTICES)); - ByteBuffer meshletTriangles = MemoryUtil.memAlloc((int) (maxMeshlets * MAX_TRIANGLES * 3)); - - IntBuffer indicesBuffer = MemoryUtil.memAllocInt(data.indices.length); - for (var i : data.indices) { - indicesBuffer.put(i); - } - - indicesBuffer.position(0); - FloatBuffer vertexBuffer = MemoryUtil.memAllocFloat(data.vertices.length); - for (var i : data.vertices) { - vertexBuffer.put(i); - } - vertexBuffer.position(0); - - long meshletCount = MeshOptimizer.nmeshopt_buildMeshlets(meshlets.address(), - memAddress(meshletVertices), - memAddress(meshletTriangles), - memAddress(indicesBuffer), - data.indices.length, - memAddress(vertexBuffer), - data.vertices.length / 3, - 3 * Float.BYTES, - MAX_VERTICES, - MAX_TRIANGLES, - .5f - ); - - List meshletList = new ArrayList<>(); - for (int i = 0; i < meshletCount; i++) { - MeshoptMeshlet meshlet = meshlets.get(i); - - // Collect vertices for the meshlet - int vertexIndexStart = meshlet.vertex_offset(); - int vertexIndexLength = meshlet.vertex_count(); - - int trianglesStart = meshlet.triangle_offset() * 3; - int trianglesLength = meshlet.triangle_count() * 3; - - meshletList.add(new MeshletInfo( - vertexIndexStart, - vertexIndexLength, - trianglesStart, - trianglesLength - )); - } - - MemoryUtil.memFree(indicesBuffer); - // Clean up - meshlets.free(); - return new Meshlets(meshletList, vertexBuffer, meshletVertices, meshletTriangles); - } -} diff --git a/engine/src/main/java/com/pine/service/meshlet/Meshlets.java b/engine/src/main/java/com/pine/service/meshlet/Meshlets.java deleted file mode 100644 index 2ad6d6d1..00000000 --- a/engine/src/main/java/com/pine/service/meshlet/Meshlets.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.pine.service.meshlet; - -import java.nio.ByteBuffer; -import java.nio.FloatBuffer; -import java.nio.IntBuffer; -import java.util.List; - -public class Meshlets { - public final List meshletInfos; - public final FloatBuffer vertices; - public final IntBuffer meshletVertices; - public final ByteBuffer meshletTriangles; - - public Meshlets(List meshletInfos, FloatBuffer vertices, IntBuffer meshletVertices, ByteBuffer meshletTriangles) { - this.meshletInfos = meshletInfos; - this.meshletVertices = meshletVertices; - this.vertices = vertices; - this.meshletTriangles = meshletTriangles; - } -} diff --git a/engine/src/main/java/com/pine/service/module/EngineModulesService.java b/engine/src/main/java/com/pine/service/module/EngineModulesService.java deleted file mode 100644 index f736131e..00000000 --- a/engine/src/main/java/com/pine/service/module/EngineModulesService.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.pine.service.module; - -import com.pine.injection.EngineExternalModule; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.injection.PInjector; -import com.pine.service.system.SystemService; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@PBean -public class EngineModulesService { - - @PInject - public SystemService systemService; - - @PInject - public PInjector injector; - - private final Map modules = new HashMap<>(); - - public Map getModules() { - return modules; - } - - public void addModules(List modules) { - for (var m : modules) { - this.modules.put(m.getClass().getName(), m); - initializeModule(m, prepareModule(m)); - } - - for (var m : modules) { - systemService.setSystems(m.getExternalSystems()); - } - } - - @NotNull - private List prepareModule(EngineExternalModule m) { - List injectables = m.getInjectables(); - injector.addInjectables(injectables); - injector.addInjectables(List.of(m)); - injector.inject(m); - injectables.forEach(i -> injector.inject(i)); - return injectables; - } - - private static void initializeModule(EngineExternalModule m, List injectables) { - m.onInitialize(); - injectables.forEach(e -> { - if (e instanceof Initializable) { - ((Initializable) e).onInitialize(); - } - }); - } -} diff --git a/engine/src/main/java/com/pine/service/rendering/RequestProcessingService.java b/engine/src/main/java/com/pine/service/rendering/RequestProcessingService.java deleted file mode 100644 index bc922a05..00000000 --- a/engine/src/main/java/com/pine/service/rendering/RequestProcessingService.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.pine.service.rendering; - -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.messaging.Loggable; -import com.pine.repository.WorldRepository; -import com.pine.repository.streaming.StreamingRepository; -import com.pine.service.grid.WorldService; -import com.pine.service.request.AbstractRequest; - - -@PBean -public class RequestProcessingService implements Loggable { - @PInject - public WorldRepository world; - - @PInject - public WorldService worldService; - - @PInject - public StreamingRepository streamingRepository; - - public void addRequest(AbstractRequest request) { - try{ - request.setup(world, streamingRepository, worldService); - request.run(); - }catch (Exception e){ - getLogger().error(e.getMessage(), e); - } - } -} diff --git a/engine/src/main/java/com/pine/service/resource/AbstractResourceService.java b/engine/src/main/java/com/pine/service/resource/AbstractResourceService.java deleted file mode 100644 index b0ba8d11..00000000 --- a/engine/src/main/java/com/pine/service/resource/AbstractResourceService.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.pine.service.resource; - -import com.pine.messaging.Loggable; - -public abstract class AbstractResourceService implements Loggable { - protected abstract void unbind(); - - public abstract void bind(T instance); -} diff --git a/engine/src/main/java/com/pine/service/resource/FBOService.java b/engine/src/main/java/com/pine/service/resource/FBOService.java deleted file mode 100644 index 22c3faf2..00000000 --- a/engine/src/main/java/com/pine/service/resource/FBOService.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.pine.service.resource; - -import com.pine.Engine; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.service.resource.fbo.FrameBufferObject; - -@PBean -public class FBOService extends AbstractResourceService { - private FrameBufferObject current; - - @PInject - public Engine engine; - - @Override - protected void unbind() { - if (current != null) { - current.stop(); - } - } - - @Override - public void bind(FrameBufferObject instance) { - if (current == instance) { - return; - } - current = instance; - current.use(); - } - -} diff --git a/engine/src/main/java/com/pine/service/resource/IResource.java b/engine/src/main/java/com/pine/service/resource/IResource.java deleted file mode 100644 index 2be00987..00000000 --- a/engine/src/main/java/com/pine/service/resource/IResource.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.pine.service.resource; - -import com.pine.injection.Disposable; -import com.pine.messaging.Loggable; - -public interface IResource extends Loggable, Disposable { -} diff --git a/engine/src/main/java/com/pine/service/resource/SSBOService.java b/engine/src/main/java/com/pine/service/resource/SSBOService.java deleted file mode 100644 index 0d6c1873..00000000 --- a/engine/src/main/java/com/pine/service/resource/SSBOService.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.pine.service.resource; - -import com.pine.injection.PBean; -import com.pine.service.resource.ssbo.ShaderStorageBufferObject; -import org.lwjgl.opengl.GL46; - -import java.nio.FloatBuffer; -import java.nio.IntBuffer; - -@PBean -public class SSBOService extends AbstractResourceService { - - @Override - public void bind(ShaderStorageBufferObject instance) { - GL46.glBindBufferBase(GL46.GL_SHADER_STORAGE_BUFFER, instance.getBindingPoint(), instance.getBuffer()); - } - - @Override - public void unbind() { - GL46.glBindBuffer(GL46.GL_SHADER_STORAGE_BUFFER, GL46.GL_NONE); - } - - public void updateBuffer(ShaderStorageBufferObject ssbo, FloatBuffer data, int offset) { - bind(ssbo); - GL46.glBufferSubData(GL46.GL_SHADER_STORAGE_BUFFER, offset, data); - unbind(); - } - - public void updateBuffer(ShaderStorageBufferObject ssbo, IntBuffer data, int offset) { - bind(ssbo); - GL46.glBufferSubData(GL46.GL_SHADER_STORAGE_BUFFER, offset, data); - } -} diff --git a/engine/src/main/java/com/pine/service/resource/fbo/FBOCreationData.java b/engine/src/main/java/com/pine/service/resource/fbo/FBOCreationData.java deleted file mode 100644 index a0393728..00000000 --- a/engine/src/main/java/com/pine/service/resource/fbo/FBOCreationData.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.pine.service.resource.fbo; - -import org.lwjgl.opengl.GL46; - -import java.util.ArrayList; -import java.util.List; - -public class FBOCreationData { - - private final List colors = new ArrayList<>(); - private boolean depthTexture; - private boolean depthTest; - private final Integer w; - private final Integer h; - - public FBOCreationData(boolean depthTexture, boolean depthTest) { - this.depthTexture = depthTexture; - this.depthTest = depthTest; - this.w = null; - this.h = null; - } - - public FBOCreationData(int w, int h) { - this.w = w; - this.h = h; - this.depthTexture = false; - this.depthTest = false; - } - - public Integer getW() { - return w; - } - - public Integer getH() { - return h; - } - - public List getSamplers() { - return colors; - } - - public boolean isDepthTexture() { - return depthTexture; - } - - public FBOCreationData addSampler(int w, int h, int attachment, int precision, int format, int type, boolean linear, boolean repeat) { - colors.add(new FBOTextureData(w, h, attachment, precision, format, type, linear, repeat)); - return this; - } - - public FBOCreationData addSampler(int attachment, int precision, int format, int type, boolean linear, boolean repeat) { - colors.add(new FBOTextureData(null, null, attachment, precision, format, type, linear, repeat)); - return this; - } - - public FBOCreationData addSampler() { - addSampler(0, GL46.GL_RGBA8, GL46.GL_RGBA, GL46.GL_UNSIGNED_BYTE, false, false); - return this; - } - - public boolean isDepthTest() { - return depthTest; - } - - public FBOCreationData setDepthTest(boolean depthTest) { - this.depthTest = depthTest; - return this; - } - - public FBOCreationData setDepthTexture(boolean depthTexture) { - this.depthTexture = depthTexture; - return this; - } -} diff --git a/engine/src/main/java/com/pine/service/resource/fbo/FBOTextureData.java b/engine/src/main/java/com/pine/service/resource/fbo/FBOTextureData.java deleted file mode 100644 index 5ef73fec..00000000 --- a/engine/src/main/java/com/pine/service/resource/fbo/FBOTextureData.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.pine.service.resource.fbo; - -public record FBOTextureData(Integer w, Integer h, - int attachment, int precision, - int format, int type, - boolean linear, boolean repeat) { -} diff --git a/engine/src/main/java/com/pine/service/resource/ubo/UBOItem.java b/engine/src/main/java/com/pine/service/resource/ubo/UBOItem.java deleted file mode 100644 index e4f053d3..00000000 --- a/engine/src/main/java/com/pine/service/resource/ubo/UBOItem.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.pine.service.resource.ubo; - -public class UBOItem { - private final int offset; - private final int dataSize; - private final int chunkSize; - - public UBOItem( - int offset, - int dataSize, - int chunkSize) { - this.offset = offset; - this.dataSize = dataSize; - this.chunkSize = chunkSize; - } - - public int offset() { - return offset; - } - - public int dataSize() { - return dataSize; - } - - public int chunkSize() { - return chunkSize; - } -} diff --git a/engine/src/main/java/com/pine/service/streaming/data/StreamData.java b/engine/src/main/java/com/pine/service/streaming/data/StreamData.java deleted file mode 100644 index a5a586f0..00000000 --- a/engine/src/main/java/com/pine/service/streaming/data/StreamData.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.pine.service.streaming.data; - -import com.pine.repository.streaming.StreamableResourceType; - -public interface StreamData { - StreamableResourceType getResourceType(); -} diff --git a/engine/src/main/java/com/pine/service/system/SystemService.java b/engine/src/main/java/com/pine/service/system/SystemService.java deleted file mode 100644 index 1da60514..00000000 --- a/engine/src/main/java/com/pine/service/system/SystemService.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.pine.service.system; - -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.injection.PInjector; -import com.pine.service.system.impl.*; -import com.pine.tasks.SyncTask; - -import java.util.List; - -@PBean -public class SystemService implements SyncTask { - @PInject - public PInjector pInjector; - - private AbstractPass[] systems = new AbstractPass[]{ - new NoiseGenPass(), - new BRDFGenPass(), - new IrradianceGenPass(), - new EnvironmentMapFilteringGenPass(), - new ShaderDataSyncPass(), - new FoliageCullingPass(), - new TerrainGBufferPass(), - new PrimitiveGBufferPass(), - new FoliageGBufferPass(), - new CopyDepthPass(), - new DecalGBufferPass(), - new GBufferShadingPass(), - new AtmospherePass(), - new CompositingPass(), - new PostProcessingPass(), - new VoxelVisualizerPass(), - new FrameCompositionPass() - }; - - public void setSystems(AbstractPass[] systems) { - for (var sys : systems) { - pInjector.inject(sys); - sys.onInitialize(); - } - this.systems = systems; - } - - @Override - public void sync() { - for (var system : systems) { - system.render(); - } - } - - - public void initialize() { - for (var sys : systems) { - pInjector.inject(sys); - sys.onInitialize(); - } - } -} \ No newline at end of file diff --git a/engine/src/main/java/com/pine/service/system/impl/FoliageCullingPass.java b/engine/src/main/java/com/pine/service/system/impl/FoliageCullingPass.java deleted file mode 100644 index 722b121e..00000000 --- a/engine/src/main/java/com/pine/service/system/impl/FoliageCullingPass.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.pine.service.system.impl; - -import com.pine.repository.core.CoreBufferRepository; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.streaming.ref.TextureResourceRef; -import com.pine.service.system.AbstractPass; -import org.joml.Vector2f; -import org.joml.Vector3f; -import org.joml.Vector4f; -import org.lwjgl.opengl.GL46; -import org.lwjgl.system.MemoryUtil; - -import java.nio.IntBuffer; - -import static com.pine.service.resource.ShaderService.COMPUTE_RUNTIME_DATA; - -public class FoliageCullingPass extends AbstractPass { - private final static int TIMEOUT = 16; - private static final int LOCAL_SIZE_X = 1; - private static final int LOCAL_SIZE_Y = 1; - private TextureResourceRef heightMap; - private TextureResourceRef foliageMask; - private UniformDTO imageSizeU; - private UniformDTO settingsU; - private UniformDTO terrainOffsetU; - private UniformDTO heightScale; - private UniformDTO colorToMatchU; - private long sinceLastRun; - private final Vector2f imageSize = new Vector2f(); - private final Vector4f settings = new Vector4f(); - private final Vector2f terrainSize = new Vector2f(); - private final IntBuffer atomicCountValue = MemoryUtil.memAllocInt(1); - - @Override - public void onInitialize() { - imageSizeU = addUniformDeclaration("imageSize"); - settingsU = addUniformDeclaration("settings"); - heightScale = addUniformDeclaration("heightScale"); - colorToMatchU = addUniformDeclaration("colorToMatch"); - terrainOffsetU = addUniformDeclaration("terrainOffset"); - } - - @Override - protected boolean isRenderable() { - if (terrainRepository.enabled && terrainRepository.foliage.isEmpty()) { - return false; - } - if ((clockRepository.totalTime - sinceLastRun) >= TIMEOUT) { - heightMap = terrainRepository.heightMapTexture != null ? (TextureResourceRef) streamingService.streamIn(terrainRepository.heightMapTexture, StreamableResourceType.TEXTURE) : null; - foliageMask = heightMap != null && terrainRepository.foliageMask != null ? (TextureResourceRef) streamingService.streamIn(terrainRepository.foliageMask, StreamableResourceType.TEXTURE) : null; - return heightMap != null && foliageMask != null; - } - return false; - } - - @Override - protected Shader getShader() { - return shaderRepository.foliageCullingCompute; - } - - @Override - protected void renderInternal() { - sinceLastRun = clockRepository.totalTime; - - bufferRepository.foliageTransformationSSBO.setBindingPoint(3); - ssboService.bind(bufferRepository.foliageTransformationSSBO); - - GL46.glBindBufferBase(GL46.GL_ATOMIC_COUNTER_BUFFER, 2, bufferRepository.atomicCounterBuffer); - GL46.glBufferSubData(GL46.GL_ATOMIC_COUNTER_BUFFER, 0, CoreBufferRepository.ZERO); - - COMPUTE_RUNTIME_DATA.groupX = (heightMap.width + LOCAL_SIZE_X - 1) / LOCAL_SIZE_X; - COMPUTE_RUNTIME_DATA.groupY = (heightMap.height + LOCAL_SIZE_Y - 1) / LOCAL_SIZE_Y; - COMPUTE_RUNTIME_DATA.groupZ = 1; - COMPUTE_RUNTIME_DATA.memoryBarrier = GL46.GL_BUFFER_UPDATE_BARRIER_BIT | GL46.GL_SHADER_IMAGE_ACCESS_BARRIER_BIT; - - shaderService.bindSampler2dDirect(foliageMask, 0); - shaderService.bindSampler2dDirect(heightMap, 1); - shaderService.bindFloat(terrainRepository.heightScale, heightScale); - - shaderService.bindVec2(terrainRepository.offset, terrainOffsetU); - - imageSize.x = heightMap.width; - imageSize.y = heightMap.height; - shaderService.bindVec2(imageSize, imageSizeU); - - settings.x = terrainRepository.maxDistanceFromCamera; - settings.y = terrainRepository.maxIterations; - settings.z = terrainRepository.instanceOffset.x; - settings.w = terrainRepository.instanceOffset.y; - shaderService.bindVec4(settings, settingsU); - - int offset = 0; - for (var foliage : terrainRepository.foliage.values()) { - // TODO - ONE RUN PER FRAME INSTEAD OF EVERYTHING ALL AT ONCE - shaderService.bindVec3(foliage.color, colorToMatchU); - - shaderService.dispatch(COMPUTE_RUNTIME_DATA); - - GL46.glGetBufferSubData(GL46.GL_ATOMIC_COUNTER_BUFFER, 0, atomicCountValue); - - foliage.count = atomicCountValue.get(0) - offset; - foliage.offset = offset; - offset = atomicCountValue.get(0); - } - } - - @Override - public String getTitle() { - return "Instance culling"; - } -} diff --git a/engine/src/main/java/com/pine/service/system/impl/FoliageGBufferPass.java b/engine/src/main/java/com/pine/service/system/impl/FoliageGBufferPass.java deleted file mode 100644 index c0f28e70..00000000 --- a/engine/src/main/java/com/pine/service/system/impl/FoliageGBufferPass.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.pine.service.system.impl; - -import com.pine.repository.core.CoreBufferRepository; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.streaming.ref.MaterialResourceRef; -import com.pine.service.streaming.ref.MeshResourceRef; - - -public class FoliageGBufferPass extends AbstractGBufferPass { - private UniformDTO terrainOffsetU; - - @Override - public void onInitialize() { - super.onInitialize(); - terrainOffsetU = addUniformDeclaration("terrainOffset"); - } - - @Override - protected Shader getShader() { - return shaderRepository.gBufferFoliageShader; - } - - @Override - protected boolean isRenderable() { - return terrainRepository.enabled; - } - - @Override - protected void renderInternal() { - prepareCall(); - bufferRepository.foliageTransformationSSBO.setBindingPoint(3); - ssboService.bind(bufferRepository.foliageTransformationSSBO); - shaderService.bindVec2(terrainRepository.offset, terrainOffsetU); - shaderService.bindSampler2dDirect(bufferRepository.noiseSampler, 10); - for(var foliage : terrainRepository.foliage.values()) { - if(foliage.count < CoreBufferRepository.MAX_INSTANCING && foliage.count > 0) { - var mesh = (MeshResourceRef) streamingService.streamIn(foliage.mesh, StreamableResourceType.MESH); - var material = (MaterialResourceRef) streamingService.streamIn(foliage.material, StreamableResourceType.MATERIAL); - bindMaterial(material); - if(mesh != null) { - meshService.bind(mesh); - meshService.setInstanceCount(foliage.count); - meshService.draw(); - } - } - } - } - - @Override - public String getTitle() { - return "Foliage"; - } -} diff --git a/engine/src/main/resources/shaders/compute/FOLIAGE_CULLING_COMPUTE.glsl b/engine/src/main/resources/shaders/compute/FOLIAGE_CULLING_COMPUTE.glsl deleted file mode 100644 index fe889be0..00000000 --- a/engine/src/main/resources/shaders/compute/FOLIAGE_CULLING_COMPUTE.glsl +++ /dev/null @@ -1,118 +0,0 @@ -layout (local_size_x = 1, local_size_y = 1) in; - -layout (binding = 0) uniform sampler2D foliageMask; -layout (binding = 1) uniform sampler2D heightMap; -layout (binding = 2, offset = 0) uniform atomic_uint globalIndex; - -layout(std430, binding = 3) writeonly buffer TransformationBuffer { - vec3 transformations[]; -}; - -uniform vec2 terrainOffset; -uniform vec3 colorToMatch; -uniform vec4 settings; -uniform vec2 imageSize; -uniform float heightScale; - -#define MAX_DISTANCE_FROM_CAMERA settings.x -#define MAX_ITERATIONS settings.y -#define INSTANCE_OFFSET_X settings.z -#define INSTANCE_OFFSET_Y settings.w -#define MAX_INSTANCING 500000 - -#include "../buffer_objects/GLOBAL_DATA_UBO.glsl" - -#include "../util/UTIL.glsl" - -vec3 heightMapToWorldSpace(vec2 uv, vec2 planeSize) { - float worldX = uv.x * planeSize.x + terrainOffset.x; - float worldZ = uv.y * planeSize.y + terrainOffset.y; - return vec3(worldX, 0, worldZ); -} - -float hash(vec2 p) { - return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123); -} - -vec2 randomOffset(vec2 inputV, float rangeX, float rangeY) { - float randomX = hash(inputV.xy / rangeX); - float randomY = hash(inputV.yx / rangeY); - return vec2(randomX* rangeX, randomY* rangeY); -} - -void addTransform(vec3 pos){ - if (atomicCounter(globalIndex) + 1 < MAX_INSTANCING){ - uint index = atomicCounterIncrement(globalIndex); - transformations[index] = pos; - } -} - - -shared vec4 l; -shared vec4 r; -shared vec4 b; -shared vec4 t; -shared vec4 n; -shared vec4 f; - -bool isPointInsideFrustum(vec3 point) { - vec4 p4D = vec4(point, 1.); - return (dot(l, p4D) >= 0) && - (dot(r, p4D) <= 0) && - (dot(t, p4D) <= 0) && - (dot(b, p4D) >= 0) && - (dot(n, p4D) >= 0) && - (dot(f, p4D) <= 0); -} - -void main() { - if (gl_LocalInvocationIndex == 0){ - mat4 m = transpose(viewProjection); - vec4 Row1 = vec4(m[0][0], m[0][1],m[0][2],m[0][3]); - vec4 Row2 = vec4(m[1][0], m[1][1],m[1][2],m[1][3]); - vec4 Row3 = vec4(m[2][0], m[2][1],m[2][2],m[2][3]); - vec4 Row4 = vec4(m[3][0], m[3][1],m[3][2],m[3][3]); - - l = Row1 + Row4; - r = Row1 - Row4; - b = Row2 + Row4; - t = Row2 - Row4; - n = Row3 + Row4; - f = Row3 - Row4; - } - - vec2 scaledTexCoord= vec2(gl_GlobalInvocationID.xy) / imageSize; - vec3 worldSpaceCoord = heightMapToWorldSpace(scaledTexCoord, imageSize); - if (isPointInsideFrustum(worldSpaceCoord)){ - vec3 pixelColor = texture(foliageMask, scaledTexCoord).rgb; - if (pixelColor == colorToMatch){ - float localHeight = texture(heightMap, scaledTexCoord).r * heightScale; - worldSpaceCoord.y = localHeight; - float distanceFromCamera = length(worldSpaceCoord.xyz - cameraWorldPosition.xyz); - int N = 0; - - if (distanceFromCamera < MAX_DISTANCE_FROM_CAMERA/8){ - N = int(MAX_ITERATIONS); - } else if (distanceFromCamera < MAX_DISTANCE_FROM_CAMERA/4){ - N = int(max(MAX_ITERATIONS, 2)/2); - } else if (distanceFromCamera < MAX_DISTANCE_FROM_CAMERA/2){ - N = int(max(MAX_ITERATIONS, 4)/4); - } else if (distanceFromCamera < MAX_DISTANCE_FROM_CAMERA){ - N = int(max(MAX_ITERATIONS, 8)/8); - } - - vec2 prefOffset = vec2(0); - for (int i = 0; i < N; i++){ - for (int j = 0; j < N; j++){ - prefOffset = randomOffset(vec2(i, j), INSTANCE_OFFSET_X, INSTANCE_OFFSET_Y); - vec3 localPos = worldSpaceCoord + vec3(prefOffset.x, 0, prefOffset.y); - float localHeight = texture(heightMap, vec2(localPos.x - terrainOffset.x, localPos.z - terrainOffset.y)/imageSize).r * heightScale; - localPos.y = localHeight; - if (isPointInsideFrustum(localPos)){ - addTransform(localPos); - } - } - } - } - } -} \ No newline at end of file diff --git a/engine/src/main/resources/shaders/uber/G_BUFFER_UTIL.glsl b/engine/src/main/resources/shaders/uber/G_BUFFER_UTIL.glsl deleted file mode 100644 index 6eb50086..00000000 --- a/engine/src/main/resources/shaders/uber/G_BUFFER_UTIL.glsl +++ /dev/null @@ -1,71 +0,0 @@ -#define PARALLAX_THRESHOLD 200. - -float encode(float depthFunc, float val) { - float half_co = depthFunc * 0.5; - float clamp_z = max(0.000001, val); - return log2(clamp_z) * half_co; -} - -mat3 computeTBN(vec3 worldPosition, vec2 initialUV, vec3 normalVec, int isDecalPass) { - if (isDecalPass == 1) { - vec3 N = abs(normalVec); - vec3 T = vec3(0., 0., 1.); - if (N.z > N.x && N.z > N.y){ - T = vec3(1., 0., 0.); - } - - T = normalize(T - N * dot(T, N)); - vec3 B = cross(T, N); - return mat3(T, B, N); - } - vec3 dp1 = dFdx(worldPosition); - vec3 dp2 = dFdy(worldPosition); - vec2 duv1 = dFdx(initialUV); - vec2 duv2 = dFdy(initialUV); - - vec3 dp2perp = cross(dp2, normalVec); - vec3 dp1perp = cross(normalVec, dp1); - vec3 T = dp2perp * duv1.x + dp1perp * duv2.x; - vec3 B = dp2perp * duv1.y + dp1perp * duv2.y; - - float invmax = inversesqrt(max(dot(T, T), dot(B, B))); - return mat3(T * invmax, B * invmax, normalVec); -} - -vec2 parallaxOcclusionMapping(vec2 initialUV, vec3 worldSpacePosition, sampler2D heightMap, float heightScale, int layers, float distanceFromCamera, mat3 TBN) { - if (distanceFromCamera > PARALLAX_THRESHOLD) return initialUV; - mat3 transposed = transpose(TBN); - vec3 viewDirection = normalize(transposed * (cameraWorldPosition.xyz - worldSpacePosition.xyz)); - float fLayers = float(max(layers, 1)); - float layerDepth = 1.0 / fLayers; - float currentLayerDepth = 0.0; - vec2 P = viewDirection.xy / viewDirection.z * max(heightScale, .00000001); - vec2 deltaTexCoords = P / fLayers; - - vec2 currentUVs = initialUV; - float currentDepthMapValue = texture(heightMap, currentUVs).r; - while (currentLayerDepth < currentDepthMapValue) { - currentUVs -= deltaTexCoords; - currentDepthMapValue = texture(heightMap, currentUVs).r; - currentLayerDepth += layerDepth; - } - - vec2 prevTexCoords = currentUVs + deltaTexCoords; - float afterDepth = currentDepthMapValue - currentLayerDepth; - float beforeDepth = texture(heightMap, prevTexCoords).r - currentLayerDepth + layerDepth; - - - float weight = afterDepth / (afterDepth - beforeDepth); - return prevTexCoords * weight + currentUVs * (1.0 - weight); -} - - -vec3 randomColor(int seed) { - float hash = fract(sin(float(seed)) * 43758.5453); - - float r = fract(hash * 13.756); - float g = fract(hash * 15.734); - float b = fract(hash * 17.652); - - return vec3(r, g, b); -} \ No newline at end of file diff --git a/engine/src/test/java/com/pine/service/grid/WorldServiceTest.java b/engine/src/test/java/com/pine/service/grid/WorldServiceTest.java deleted file mode 100644 index 1f0845db..00000000 --- a/engine/src/test/java/com/pine/service/grid/WorldServiceTest.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.pine.service.grid; - -import com.pine.repository.CameraRepository; -import com.pine.repository.WorldRepository; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.Objects; - -import static com.pine.service.grid.WorldGrid.TILE_SIZE; - -class WorldServiceTest { - private final WorldService worldService = new WorldService(); - - @BeforeEach - void setUp() { - worldService.repo = new WorldRepository(); - worldService.cameraRepository = new CameraRepository(); - } - - @Test - void currentTile() { - worldService.cameraRepository.currentCamera.position.set(0, 0, 0); - Assertions.assertEquals(WorldTile.getId(0, 0), worldService.getCurrentTile().getId()); - - worldService.cameraRepository.currentCamera.position.set(TILE_SIZE - 1, 0, TILE_SIZE - 1); - Assertions.assertEquals(WorldTile.getId(0, 0), worldService.getCurrentTile().getId()); - - worldService.cameraRepository.currentCamera.position.set(-1, 0, -1); - Assertions.assertEquals(WorldTile.getId(0, 0), worldService.getCurrentTile().getId()); - - worldService.cameraRepository.currentCamera.position.set(TILE_SIZE, 0, TILE_SIZE); - Assertions.assertEquals(WorldTile.getId(1, 1), worldService.getCurrentTile().getId()); - - worldService.cameraRepository.currentCamera.position.set(TILE_SIZE, 0, -TILE_SIZE); - Assertions.assertEquals(WorldTile.getId(1, -1), worldService.getCurrentTile().getId()); - - worldService.cameraRepository.currentCamera.position.set(-TILE_SIZE, 0, -TILE_SIZE); - Assertions.assertEquals(WorldTile.getId(-1, -1), worldService.getCurrentTile().getId()); - - worldService.cameraRepository.currentCamera.position.set(-TILE_SIZE, 0, 0); - Assertions.assertEquals(WorldTile.getId(-1, 0), worldService.getCurrentTile().getId()); - - worldService.cameraRepository.currentCamera.position.set(0, 0, -TILE_SIZE); - Assertions.assertEquals(WorldTile.getId(0, -1), worldService.getCurrentTile().getId()); - - worldService.cameraRepository.currentCamera.position.set(0, 0, TILE_SIZE); - Assertions.assertEquals(WorldTile.getId(0, 1), worldService.getCurrentTile().getId()); - - worldService.cameraRepository.currentCamera.position.set(TILE_SIZE, 0, 0); - Assertions.assertEquals(WorldTile.getId(1, 0), worldService.getCurrentTile().getId()); - - getAdjacentTiles(); - } - - void getAdjacentTiles() { - worldService.cameraRepository.currentCamera.position.set(0, 0, 0); - var tiles = worldService.getLoadedTiles(); - var topId = WorldTile.getId(0, 1); - var leftId = WorldTile.getId(1, 0); - var rightId = WorldTile.getId(-1, 0); - var bottomId = WorldTile.getId(0, -1); - for (var tile : tiles) { - if(tile == worldService.getCurrentTile()) { - continue; - } - boolean isIn = false; - Assertions.assertNotNull(tile); - if (Objects.equals(tile.getId(), topId)) { - isIn = true; - } - if (Objects.equals(tile.getId(), bottomId)) { - isIn = true; - } - if (Objects.equals(tile.getId(), leftId)) { - isIn = true; - } - if (Objects.equals(tile.getId(), rightId)) { - isIn = true; - } - - Assertions.assertTrue(isIn); - } - } - -} \ No newline at end of file diff --git a/engine/src/test/java/core/service/resource/ShaderServiceTest.java b/engine/src/test/java/core/service/resource/ShaderServiceTest.java deleted file mode 100644 index 3dce4a4b..00000000 --- a/engine/src/test/java/core/service/resource/ShaderServiceTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package core.service.resource; - -import com.pine.service.resource.ShaderService; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.io.File; - -class ShaderServiceTest { - - @Test - void processShader() { - ShaderService shaderService = new ShaderService(); - String result = shaderService.processShader("shaders" + File.separator + "TO_BE_INJECTED.frag"); - Assertions.assertTrue(result.contains("// THIS WAS HERE BEFORE")); - Assertions.assertFalse(result.contains("#include")); - Assertions.assertTrue(result.contains("// THIS WAS INJECTED")); - } -} \ No newline at end of file diff --git a/engine/src/test/resources/plane.glb b/engine/src/test/resources/plane.glb deleted file mode 100644 index 8a9fe5ea..00000000 Binary files a/engine/src/test/resources/plane.glb and /dev/null differ diff --git a/engine/src/test/resources/shaders/INJECT.glsl b/engine/src/test/resources/shaders/INJECT.glsl deleted file mode 100644 index e238efcf..00000000 --- a/engine/src/test/resources/shaders/INJECT.glsl +++ /dev/null @@ -1 +0,0 @@ -// THIS WAS INJECTED \ No newline at end of file diff --git a/engine/src/test/resources/shaders/TO_BE_INJECTED.frag b/engine/src/test/resources/shaders/TO_BE_INJECTED.frag deleted file mode 100644 index 4169957e..00000000 --- a/engine/src/test/resources/shaders/TO_BE_INJECTED.frag +++ /dev/null @@ -1,2 +0,0 @@ -// THIS WAS HERE BEFORE -#include "./INJECT.glsl" \ No newline at end of file diff --git a/pom.xml b/pom.xml index b39a1874..be12d7b1 100644 --- a/pom.xml +++ b/pom.xml @@ -6,17 +6,15 @@ com.pine pineengine 0.0.1-SNAPSHOT - pom + jar pine-engine pine-engine - - engine - editor - common - - + 22 + 22 + UTF-8 + 3.3.4 natives-windows @@ -210,6 +208,7 @@ test + @@ -226,5 +225,4 @@ - diff --git a/common/src/main/java/com/pine/FSUtil.java b/src/main/java/com/pine/FSUtil.java similarity index 100% rename from common/src/main/java/com/pine/FSUtil.java rename to src/main/java/com/pine/FSUtil.java diff --git a/editor/src/main/java/com/pine/PineEngine.java b/src/main/java/com/pine/PineEngine.java similarity index 87% rename from editor/src/main/java/com/pine/PineEngine.java rename to src/main/java/com/pine/PineEngine.java index a302893d..98da2be1 100644 --- a/editor/src/main/java/com/pine/PineEngine.java +++ b/src/main/java/com/pine/PineEngine.java @@ -1,6 +1,6 @@ package com.pine; -import com.pine.injection.PInjector; +import com.pine.common.injection.PInjector; public class PineEngine { private static final PInjector INJECTOR = new PInjector(PineEngine.class.getPackageName()); diff --git a/common/src/main/java/com/pine/GLSLVersion.java b/src/main/java/com/pine/common/GLSLVersion.java similarity index 81% rename from common/src/main/java/com/pine/GLSLVersion.java rename to src/main/java/com/pine/common/GLSLVersion.java index ef88a757..11ec9965 100644 --- a/common/src/main/java/com/pine/GLSLVersion.java +++ b/src/main/java/com/pine/common/GLSLVersion.java @@ -1,4 +1,4 @@ -package com.pine; +package com.pine.common; public class GLSLVersion { public static String getVersion(){ diff --git a/common/src/main/java/com/pine/theme/Icons.java b/src/main/java/com/pine/common/Icons.java similarity index 99% rename from common/src/main/java/com/pine/theme/Icons.java rename to src/main/java/com/pine/common/Icons.java index 357e2967..31061656 100644 --- a/common/src/main/java/com/pine/theme/Icons.java +++ b/src/main/java/com/pine/common/Icons.java @@ -1,4 +1,4 @@ -package com.pine.theme; +package com.pine.common; public class Icons { public static final String i10k = "\ue951"; diff --git a/engine/src/main/java/com/pine/service/module/Initializable.java b/src/main/java/com/pine/common/Initializable.java similarity index 64% rename from engine/src/main/java/com/pine/service/module/Initializable.java rename to src/main/java/com/pine/common/Initializable.java index 0e3b428f..6feb9739 100644 --- a/engine/src/main/java/com/pine/service/module/Initializable.java +++ b/src/main/java/com/pine/common/Initializable.java @@ -1,4 +1,4 @@ -package com.pine.service.module; +package com.pine.common; public interface Initializable { void onInitialize(); diff --git a/common/src/main/java/com/pine/MetricCollector.java b/src/main/java/com/pine/common/MetricCollector.java similarity index 96% rename from common/src/main/java/com/pine/MetricCollector.java rename to src/main/java/com/pine/common/MetricCollector.java index fa181fa8..40d0735e 100644 --- a/common/src/main/java/com/pine/MetricCollector.java +++ b/src/main/java/com/pine/common/MetricCollector.java @@ -1,4 +1,4 @@ -package com.pine; +package com.pine.common; import java.util.HashMap; import java.util.Map; diff --git a/common/src/main/java/com/pine/Mutable.java b/src/main/java/com/pine/common/Mutable.java similarity index 90% rename from common/src/main/java/com/pine/Mutable.java rename to src/main/java/com/pine/common/Mutable.java index f519be28..95aea28b 100644 --- a/common/src/main/java/com/pine/Mutable.java +++ b/src/main/java/com/pine/common/Mutable.java @@ -1,4 +1,4 @@ -package com.pine; +package com.pine.common; public interface Mutable { /** diff --git a/common/src/main/java/com/pine/Renderable.java b/src/main/java/com/pine/common/Renderable.java similarity index 62% rename from common/src/main/java/com/pine/Renderable.java rename to src/main/java/com/pine/common/Renderable.java index 0cfe3ce2..e4df095c 100644 --- a/common/src/main/java/com/pine/Renderable.java +++ b/src/main/java/com/pine/common/Renderable.java @@ -1,6 +1,6 @@ -package com.pine; +package com.pine.common; -import com.pine.messaging.Loggable; +import com.pine.common.messaging.Loggable; public interface Renderable extends Loggable { void render(); diff --git a/common/src/main/java/com/pine/SerializableRepository.java b/src/main/java/com/pine/common/SerializableRepository.java similarity index 93% rename from common/src/main/java/com/pine/SerializableRepository.java rename to src/main/java/com/pine/common/SerializableRepository.java index 645f37b1..04c15d93 100644 --- a/common/src/main/java/com/pine/SerializableRepository.java +++ b/src/main/java/com/pine/common/SerializableRepository.java @@ -1,7 +1,7 @@ -package com.pine; +package com.pine.common; -import com.pine.injection.PInject; -import com.pine.messaging.Loggable; +import com.pine.common.injection.PInject; +import com.pine.common.messaging.Loggable; import imgui.ImVec4; import imgui.type.ImInt; import org.joml.Vector3f; @@ -13,13 +13,6 @@ import java.util.Map; public interface SerializableRepository extends Serializable, Loggable { - // TODO - MANUAL SERIALIZATION AND DE-SERIALIZATION -// void deserialize(){ -// -// } - - default void onSave(){} - default void merge(Object data) { if (data == null) { return; diff --git a/common/src/main/java/com/pine/SerializationState.java b/src/main/java/com/pine/common/SerializationState.java similarity index 86% rename from common/src/main/java/com/pine/SerializationState.java rename to src/main/java/com/pine/common/SerializationState.java index 1d15a7d5..2d555681 100644 --- a/common/src/main/java/com/pine/SerializationState.java +++ b/src/main/java/com/pine/common/SerializationState.java @@ -1,4 +1,4 @@ -package com.pine; +package com.pine.common; import java.util.HashMap; import java.util.Map; diff --git a/common/src/main/java/com/pine/injection/Disposable.java b/src/main/java/com/pine/common/injection/Disposable.java similarity index 60% rename from common/src/main/java/com/pine/injection/Disposable.java rename to src/main/java/com/pine/common/injection/Disposable.java index 90bb2718..5e8520d2 100644 --- a/common/src/main/java/com/pine/injection/Disposable.java +++ b/src/main/java/com/pine/common/injection/Disposable.java @@ -1,4 +1,4 @@ -package com.pine.injection; +package com.pine.common.injection; public interface Disposable { void dispose(); diff --git a/common/src/main/java/com/pine/injection/PBean.java b/src/main/java/com/pine/common/injection/PBean.java similarity index 81% rename from common/src/main/java/com/pine/injection/PBean.java rename to src/main/java/com/pine/common/injection/PBean.java index 48bae328..f570b98e 100644 --- a/common/src/main/java/com/pine/injection/PBean.java +++ b/src/main/java/com/pine/common/injection/PBean.java @@ -1,4 +1,4 @@ -package com.pine.injection; +package com.pine.common.injection; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/common/src/main/java/com/pine/injection/PInject.java b/src/main/java/com/pine/common/injection/PInject.java similarity index 81% rename from common/src/main/java/com/pine/injection/PInject.java rename to src/main/java/com/pine/common/injection/PInject.java index aad80550..020fa780 100644 --- a/common/src/main/java/com/pine/injection/PInject.java +++ b/src/main/java/com/pine/common/injection/PInject.java @@ -1,4 +1,4 @@ -package com.pine.injection; +package com.pine.common.injection; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/common/src/main/java/com/pine/injection/PInjector.java b/src/main/java/com/pine/common/injection/PInjector.java similarity index 98% rename from common/src/main/java/com/pine/injection/PInjector.java rename to src/main/java/com/pine/common/injection/PInjector.java index 0b35010f..7d8816b3 100644 --- a/common/src/main/java/com/pine/injection/PInjector.java +++ b/src/main/java/com/pine/common/injection/PInjector.java @@ -1,6 +1,6 @@ -package com.pine.injection; +package com.pine.common.injection; -import com.pine.messaging.Loggable; +import com.pine.common.messaging.Loggable; import org.reflections.Reflections; import org.reflections.scanners.Scanners; diff --git a/common/src/main/java/com/pine/injection/PostCreation.java b/src/main/java/com/pine/common/injection/PostCreation.java similarity index 84% rename from common/src/main/java/com/pine/injection/PostCreation.java rename to src/main/java/com/pine/common/injection/PostCreation.java index 32a6cbed..7f0ea394 100644 --- a/common/src/main/java/com/pine/injection/PostCreation.java +++ b/src/main/java/com/pine/common/injection/PostCreation.java @@ -1,4 +1,4 @@ -package com.pine.injection; +package com.pine.common.injection; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/common/src/main/java/com/pine/inspection/Color.java b/src/main/java/com/pine/common/inspection/Color.java similarity index 82% rename from common/src/main/java/com/pine/inspection/Color.java rename to src/main/java/com/pine/common/inspection/Color.java index 37946c55..0bcc3188 100644 --- a/common/src/main/java/com/pine/inspection/Color.java +++ b/src/main/java/com/pine/common/inspection/Color.java @@ -1,4 +1,4 @@ -package com.pine.inspection; +package com.pine.common.inspection; import org.joml.Vector3f; diff --git a/common/src/main/java/com/pine/inspection/ExecutableField.java b/src/main/java/com/pine/common/inspection/ExecutableField.java similarity index 78% rename from common/src/main/java/com/pine/inspection/ExecutableField.java rename to src/main/java/com/pine/common/inspection/ExecutableField.java index 8cebcb5c..ca6e7578 100644 --- a/common/src/main/java/com/pine/inspection/ExecutableField.java +++ b/src/main/java/com/pine/common/inspection/ExecutableField.java @@ -1,4 +1,4 @@ -package com.pine.inspection; +package com.pine.common.inspection; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -8,6 +8,4 @@ String label() default "-"; String group() default ""; - - String icon() default ""; } diff --git a/common/src/main/java/com/pine/inspection/FieldDTO.java b/src/main/java/com/pine/common/inspection/FieldDTO.java similarity index 72% rename from common/src/main/java/com/pine/inspection/FieldDTO.java rename to src/main/java/com/pine/common/inspection/FieldDTO.java index b7a97bb6..276de005 100644 --- a/common/src/main/java/com/pine/inspection/FieldDTO.java +++ b/src/main/java/com/pine/common/inspection/FieldDTO.java @@ -1,4 +1,6 @@ -package com.pine.inspection; +package com.pine.common.inspection; + +import org.jetbrains.annotations.Nullable; import java.lang.reflect.Field; import java.util.List; @@ -11,14 +13,16 @@ public class FieldDTO { private final Object instance; private final List options; private final InspectableField delegate; + private final ListInspection listInspection; - public FieldDTO(FieldType type, InspectableField delegate, Field field, Object instance, List options) { + public FieldDTO(FieldType type, InspectableField delegate, Field field, Object instance, List options, @Nullable ListInspection listInspection) { this.type = type; this.delegate = delegate; - this.id = "##" + UUID.randomUUID().toString().replaceAll("-", ""); + this.id = "##" + UUID.randomUUID().toString().replaceAll("-", ""); this.field = field; this.instance = instance; this.options = options; + this.listInspection = listInspection; } public String getId() { @@ -76,4 +80,15 @@ public Object getValue() { public String getGroup() { return delegate.group(); } + + public Class getClassType() { + if (isList()) { + return listInspection.clazzType(); + } + return null; + } + + public boolean isList() { + return listInspection != null; + } } diff --git a/common/src/main/java/com/pine/inspection/FieldType.java b/src/main/java/com/pine/common/inspection/FieldType.java similarity index 77% rename from common/src/main/java/com/pine/inspection/FieldType.java rename to src/main/java/com/pine/common/inspection/FieldType.java index 92bd29bb..09c75bb5 100644 --- a/common/src/main/java/com/pine/inspection/FieldType.java +++ b/src/main/java/com/pine/common/inspection/FieldType.java @@ -1,5 +1,8 @@ -package com.pine.inspection; +package com.pine.common.inspection; +import com.pine.engine.repository.terrain.FoliageInstance; +import com.pine.engine.repository.terrain.MaterialLayer; +import com.pine.engine.repository.terrain.MaterialLayers; import org.joml.Quaternionf; import org.joml.Vector2f; import org.joml.Vector3f; @@ -20,7 +23,9 @@ public enum FieldType { VECTOR2(Vector2f.class), VECTOR3(Vector3f.class), VECTOR4(Vector4f.class), - QUATERNION(Quaternionf.class); + QUATERNION(Quaternionf.class), + MATERIAL_LAYERS(MaterialLayers.class), + MATERIAL_LAYER(MaterialLayer.class); private final Class clazz; diff --git a/common/src/main/java/com/pine/inspection/Inspectable.java b/src/main/java/com/pine/common/inspection/Inspectable.java similarity index 93% rename from common/src/main/java/com/pine/inspection/Inspectable.java rename to src/main/java/com/pine/common/inspection/Inspectable.java index 8e3f6374..230de699 100644 --- a/common/src/main/java/com/pine/inspection/Inspectable.java +++ b/src/main/java/com/pine/common/inspection/Inspectable.java @@ -1,6 +1,6 @@ -package com.pine.inspection; +package com.pine.common.inspection; -import com.pine.Mutable; +import com.pine.common.Mutable; import java.lang.reflect.Field; import java.util.ArrayList; @@ -31,7 +31,8 @@ final public List getFieldsAnnotated() { inspectableField, field, this, - getOptions(field) + getOptions(field), + field.getAnnotation(ListInspection.class) )); } } diff --git a/common/src/main/java/com/pine/inspection/InspectableField.java b/src/main/java/com/pine/common/inspection/InspectableField.java similarity index 92% rename from common/src/main/java/com/pine/inspection/InspectableField.java rename to src/main/java/com/pine/common/inspection/InspectableField.java index 9db9d224..b246cf8b 100644 --- a/common/src/main/java/com/pine/inspection/InspectableField.java +++ b/src/main/java/com/pine/common/inspection/InspectableField.java @@ -1,4 +1,4 @@ -package com.pine.inspection; +package com.pine.common.inspection; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/main/java/com/pine/common/inspection/ListInspection.java b/src/main/java/com/pine/common/inspection/ListInspection.java new file mode 100644 index 00000000..f7723c1c --- /dev/null +++ b/src/main/java/com/pine/common/inspection/ListInspection.java @@ -0,0 +1,9 @@ +package com.pine.common.inspection; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface ListInspection { + Class clazzType(); +} diff --git a/common/src/main/java/com/pine/inspection/MethodDTO.java b/src/main/java/com/pine/common/inspection/MethodDTO.java similarity index 78% rename from common/src/main/java/com/pine/inspection/MethodDTO.java rename to src/main/java/com/pine/common/inspection/MethodDTO.java index 2a142f40..1a32d7a1 100644 --- a/common/src/main/java/com/pine/inspection/MethodDTO.java +++ b/src/main/java/com/pine/common/inspection/MethodDTO.java @@ -1,4 +1,6 @@ -package com.pine.inspection; +package com.pine.common.inspection; + +import com.pine.common.Icons; import java.lang.reflect.Method; import java.util.UUID; @@ -11,7 +13,7 @@ public class MethodDTO { public MethodDTO(ExecutableField delegate, Method method, Object instance) { this.delegate = delegate; - this.label = delegate.icon() + delegate.label() + "##" + UUID.randomUUID().toString().replaceAll("-", ""); + this.label = Icons.play_arrow + delegate.label() + "##" + UUID.randomUUID().toString().replaceAll("-", ""); this.method = method; this.instance = instance; } diff --git a/common/src/main/java/com/pine/inspection/SelectableEnum.java b/src/main/java/com/pine/common/inspection/SelectableEnum.java similarity index 62% rename from common/src/main/java/com/pine/inspection/SelectableEnum.java rename to src/main/java/com/pine/common/inspection/SelectableEnum.java index 219c3eca..b7538370 100644 --- a/common/src/main/java/com/pine/inspection/SelectableEnum.java +++ b/src/main/java/com/pine/common/inspection/SelectableEnum.java @@ -1,4 +1,4 @@ -package com.pine.inspection; +package com.pine.common.inspection; public interface SelectableEnum { String getTitle(); diff --git a/common/src/main/java/com/pine/messaging/Loggable.java b/src/main/java/com/pine/common/messaging/Loggable.java similarity index 83% rename from common/src/main/java/com/pine/messaging/Loggable.java rename to src/main/java/com/pine/common/messaging/Loggable.java index 423c380a..19d71cca 100644 --- a/common/src/main/java/com/pine/messaging/Loggable.java +++ b/src/main/java/com/pine/common/messaging/Loggable.java @@ -1,4 +1,4 @@ -package com.pine.messaging; +package com.pine.common.messaging; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/common/src/main/java/com/pine/messaging/Message.java b/src/main/java/com/pine/common/messaging/Message.java similarity index 94% rename from common/src/main/java/com/pine/messaging/Message.java rename to src/main/java/com/pine/common/messaging/Message.java index b08cf0b5..b44d8a3f 100644 --- a/common/src/main/java/com/pine/messaging/Message.java +++ b/src/main/java/com/pine/common/messaging/Message.java @@ -1,4 +1,4 @@ -package com.pine.messaging; +package com.pine.common.messaging; import java.io.Serializable; import java.util.Date; diff --git a/common/src/main/java/com/pine/messaging/MessageRepository.java b/src/main/java/com/pine/common/messaging/MessageRepository.java similarity index 92% rename from common/src/main/java/com/pine/messaging/MessageRepository.java rename to src/main/java/com/pine/common/messaging/MessageRepository.java index 0c0b6dd6..3ca4cafe 100644 --- a/common/src/main/java/com/pine/messaging/MessageRepository.java +++ b/src/main/java/com/pine/common/messaging/MessageRepository.java @@ -1,6 +1,6 @@ -package com.pine.messaging; +package com.pine.common.messaging; -import com.pine.injection.PBean; +import com.pine.common.injection.PBean; /** * Intended for grouping messages system-wide diff --git a/common/src/main/java/com/pine/messaging/MessageSeverity.java b/src/main/java/com/pine/common/messaging/MessageSeverity.java similarity index 88% rename from common/src/main/java/com/pine/messaging/MessageSeverity.java rename to src/main/java/com/pine/common/messaging/MessageSeverity.java index d54b1c91..869c9089 100644 --- a/common/src/main/java/com/pine/messaging/MessageSeverity.java +++ b/src/main/java/com/pine/common/messaging/MessageSeverity.java @@ -1,6 +1,6 @@ -package com.pine.messaging; +package com.pine.common.messaging; -import com.pine.theme.Icons; +import com.pine.common.Icons; import imgui.ImVec4; public enum MessageSeverity { diff --git a/editor/src/main/java/com/pine/window/EditorWindow.java b/src/main/java/com/pine/editor/EditorWindow.java similarity index 74% rename from editor/src/main/java/com/pine/window/EditorWindow.java rename to src/main/java/com/pine/editor/EditorWindow.java index ea4d7380..efa016b9 100644 --- a/editor/src/main/java/com/pine/window/EditorWindow.java +++ b/src/main/java/com/pine/editor/EditorWindow.java @@ -1,24 +1,21 @@ -package com.pine.window; - -import com.pine.Engine; -import com.pine.core.AbstractView; -import com.pine.core.AbstractWindow; -import com.pine.core.WindowService; -import com.pine.injection.PInject; -import com.pine.panels.ToasterPanel; -import com.pine.panels.header.EditorHeaderPanel; -import com.pine.panels.viewport.FullScreenViewportPanel; -import com.pine.repository.EditorRepository; -import com.pine.service.ProjectService; -import com.pine.service.ThemeService; -import com.pine.service.serialization.SerializationService; -import com.pine.tools.ToolsModule; +package com.pine.editor; + +import com.pine.common.injection.PInject; +import com.pine.editor.core.AbstractView; +import com.pine.editor.core.AbstractWindow; +import com.pine.editor.core.WindowService; +import com.pine.editor.panels.ToasterPanel; +import com.pine.editor.panels.header.EditorHeaderPanel; +import com.pine.editor.panels.viewport.FullScreenViewportPanel; +import com.pine.editor.repository.EditorRepository; +import com.pine.editor.service.ProjectService; +import com.pine.editor.service.ThemeService; +import com.pine.editor.service.serialization.SerializationService; +import com.pine.engine.Engine; import imgui.ImGui; import imgui.ImVec4; import imgui.flag.ImGuiKey; -import java.util.List; - public class EditorWindow extends AbstractWindow { @PInject @@ -70,7 +67,7 @@ public void render() { if (serializationRepository.isDeserializationDone()) { if (!isInitialized) { windowService.maximize(); - engine.start(windowService.getDisplayW(), windowService.getDisplayH(), List.of(new ToolsModule()), projectService.getProjectDirectory()); + engine.start(windowService.getDisplayW(), windowService.getDisplayH(), projectService.getProjectDirectory()); appendChild(fullscreen = new FullScreenViewportPanel()); removeChild(fullscreen); isInitialized = true; diff --git a/editor/src/main/java/com/pine/core/AbstractView.java b/src/main/java/com/pine/editor/core/AbstractView.java similarity index 86% rename from editor/src/main/java/com/pine/core/AbstractView.java rename to src/main/java/com/pine/editor/core/AbstractView.java index dcadb326..d03589a3 100644 --- a/editor/src/main/java/com/pine/core/AbstractView.java +++ b/src/main/java/com/pine/editor/core/AbstractView.java @@ -1,8 +1,8 @@ -package com.pine.core; +package com.pine.editor.core; -import com.pine.Renderable; -import com.pine.injection.PInject; -import com.pine.injection.PInjector; +import com.pine.common.Renderable; +import com.pine.common.injection.PInject; +import com.pine.common.injection.PInjector; import java.util.ArrayList; import java.util.List; diff --git a/editor/src/main/java/com/pine/core/AbstractWindow.java b/src/main/java/com/pine/editor/core/AbstractWindow.java similarity index 96% rename from editor/src/main/java/com/pine/core/AbstractWindow.java rename to src/main/java/com/pine/editor/core/AbstractWindow.java index 41b2d38d..a3ceead9 100644 --- a/editor/src/main/java/com/pine/core/AbstractWindow.java +++ b/src/main/java/com/pine/editor/core/AbstractWindow.java @@ -1,7 +1,7 @@ -package com.pine.core; +package com.pine.editor.core; -import com.pine.core.dock.DockService; -import com.pine.injection.PInject; +import com.pine.common.injection.PInject; +import com.pine.editor.core.dock.DockService; import imgui.ImGui; import imgui.ImGuiViewport; import imgui.ImVec2; diff --git a/editor/src/main/java/com/pine/core/UIUtil.java b/src/main/java/com/pine/editor/core/UIUtil.java similarity index 79% rename from editor/src/main/java/com/pine/core/UIUtil.java rename to src/main/java/com/pine/editor/core/UIUtil.java index a7be966e..e46bd67c 100644 --- a/editor/src/main/java/com/pine/core/UIUtil.java +++ b/src/main/java/com/pine/editor/core/UIUtil.java @@ -1,4 +1,4 @@ -package com.pine.core; +package com.pine.editor.core; import imgui.ImGui; import imgui.ImVec2; @@ -7,11 +7,16 @@ import imgui.flag.ImGuiWindowFlags; import imgui.type.ImBoolean; -import static com.pine.theme.Icons.ONLY_ICON_BUTTON_SIZE; +import static com.pine.common.Icons.ONLY_ICON_BUTTON_SIZE; public class UIUtil { - public static final int FIXED_WINDOW_FLAGS = ImGuiWindowFlags.NoBackground | ImGuiWindowFlags.NoResize | ImGuiWindowFlags.NoTitleBar | ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoCollapse; + public static final ImVec4 DIRECTORY_COLOR = new ImVec4( + 188 / 255f, 128 / 255f, 78 / 255f, 1 + ); + public static final int FIXED_WINDOW_FLAGS = ImGuiWindowFlags.NoResize | ImGuiWindowFlags.NoTitleBar | ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoCollapse; public static final ImBoolean OPEN = new ImBoolean(true); + public static final float IDENT = 32; + public static final ImVec2 DEFAULT_PADDING = new ImVec2(4,4); private static final ImVec2 MEDIUM_SPACING = new ImVec2(5, 0); private static final ImVec2 LARGE_SPACING = new ImVec2(40, 0); diff --git a/editor/src/main/java/com/pine/core/WindowService.java b/src/main/java/com/pine/editor/core/WindowService.java similarity index 93% rename from editor/src/main/java/com/pine/core/WindowService.java rename to src/main/java/com/pine/editor/core/WindowService.java index cf20b858..4e86417d 100644 --- a/editor/src/main/java/com/pine/core/WindowService.java +++ b/src/main/java/com/pine/editor/core/WindowService.java @@ -1,12 +1,12 @@ -package com.pine.core; +package com.pine.editor.core; import com.pine.FSUtil; -import com.pine.GLSLVersion; -import com.pine.injection.*; -import com.pine.messaging.Loggable; -import com.pine.repository.EditorRepository; -import com.pine.theme.Icons; -import com.pine.window.EditorWindow; +import com.pine.common.GLSLVersion; +import com.pine.common.Icons; +import com.pine.common.injection.*; +import com.pine.common.messaging.Loggable; +import com.pine.editor.EditorWindow; +import com.pine.editor.repository.EditorRepository; import imgui.*; import imgui.flag.ImGuiCol; import imgui.flag.ImGuiConfigFlags; @@ -77,7 +77,6 @@ public void start() { if (!isMinimized) { startFrame(); window.render(); - ImGui.popStyleColor(3); ImGui.render(); imGuiGl3.renderDrawData(ImGui.getDrawData()); } @@ -205,10 +204,6 @@ public void startFrame() { imGuiGl3.newFrame(); imGuiGlfw.newFrame(); ImGui.newFrame(); - - ImGui.pushStyleColor(ImGuiCol.Button, window.getNeutralPalette()); - ImGui.pushStyleColor(ImGuiCol.ButtonHovered, window.getAccentColor()); - ImGui.pushStyleColor(ImGuiCol.ButtonActive, window.getAccentColor()); } private void clearBuffer() { diff --git a/editor/src/main/java/com/pine/core/dock/AbstractDockPanel.java b/src/main/java/com/pine/editor/core/dock/AbstractDockPanel.java similarity index 87% rename from editor/src/main/java/com/pine/core/dock/AbstractDockPanel.java rename to src/main/java/com/pine/editor/core/dock/AbstractDockPanel.java index f32a68ee..4d21957f 100644 --- a/editor/src/main/java/com/pine/core/dock/AbstractDockPanel.java +++ b/src/main/java/com/pine/editor/core/dock/AbstractDockPanel.java @@ -1,6 +1,6 @@ -package com.pine.core.dock; +package com.pine.editor.core.dock; -import com.pine.core.AbstractView; +import com.pine.editor.core.AbstractView; import imgui.ImVec2; import org.joml.Vector2f; diff --git a/editor/src/main/java/com/pine/core/dock/DockDTO.java b/src/main/java/com/pine/editor/core/dock/DockDTO.java similarity index 96% rename from editor/src/main/java/com/pine/core/dock/DockDTO.java rename to src/main/java/com/pine/editor/core/dock/DockDTO.java index 5f43e4b4..54365fea 100644 --- a/editor/src/main/java/com/pine/core/dock/DockDTO.java +++ b/src/main/java/com/pine/editor/core/dock/DockDTO.java @@ -1,6 +1,6 @@ -package com.pine.core.dock; +package com.pine.editor.core.dock; -import com.pine.messaging.Loggable; +import com.pine.common.messaging.Loggable; import imgui.type.ImInt; import java.io.Serializable; diff --git a/editor/src/main/java/com/pine/core/dock/DockPosition.java b/src/main/java/com/pine/editor/core/dock/DockPosition.java similarity index 67% rename from editor/src/main/java/com/pine/core/dock/DockPosition.java rename to src/main/java/com/pine/editor/core/dock/DockPosition.java index df0a052a..da0073ad 100644 --- a/editor/src/main/java/com/pine/core/dock/DockPosition.java +++ b/src/main/java/com/pine/editor/core/dock/DockPosition.java @@ -1,4 +1,4 @@ -package com.pine.core.dock; +package com.pine.editor.core.dock; public enum DockPosition { CENTER, diff --git a/editor/src/main/java/com/pine/core/dock/DockRepository.java b/src/main/java/com/pine/editor/core/dock/DockRepository.java similarity index 87% rename from editor/src/main/java/com/pine/core/dock/DockRepository.java rename to src/main/java/com/pine/editor/core/dock/DockRepository.java index 373d50ba..032fed1f 100644 --- a/editor/src/main/java/com/pine/core/dock/DockRepository.java +++ b/src/main/java/com/pine/editor/core/dock/DockRepository.java @@ -1,8 +1,8 @@ -package com.pine.core.dock; +package com.pine.editor.core.dock; -import com.pine.SerializableRepository; -import com.pine.injection.PBean; -import com.pine.injection.PostCreation; +import com.pine.common.SerializableRepository; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PostCreation; import java.util.ArrayList; import java.util.List; diff --git a/editor/src/main/java/com/pine/core/dock/DockService.java b/src/main/java/com/pine/editor/core/dock/DockService.java similarity index 96% rename from editor/src/main/java/com/pine/core/dock/DockService.java rename to src/main/java/com/pine/editor/core/dock/DockService.java index 72fca981..397168ca 100644 --- a/editor/src/main/java/com/pine/core/dock/DockService.java +++ b/src/main/java/com/pine/editor/core/dock/DockService.java @@ -1,9 +1,9 @@ -package com.pine.core.dock; +package com.pine.editor.core.dock; -import com.pine.core.AbstractView; -import com.pine.core.AbstractWindow; -import com.pine.injection.PBean; -import com.pine.injection.PInject; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.editor.core.AbstractView; +import com.pine.editor.core.AbstractWindow; import imgui.ImGui; import imgui.flag.ImGuiDir; import imgui.internal.ImGuiDockNode; diff --git a/editor/src/main/java/com/pine/core/dock/DockSpace.java b/src/main/java/com/pine/editor/core/dock/DockSpace.java similarity index 81% rename from editor/src/main/java/com/pine/core/dock/DockSpace.java rename to src/main/java/com/pine/editor/core/dock/DockSpace.java index 0e9e17ad..b68335a9 100644 --- a/editor/src/main/java/com/pine/core/dock/DockSpace.java +++ b/src/main/java/com/pine/editor/core/dock/DockSpace.java @@ -1,13 +1,13 @@ -package com.pine.core.dock; +package com.pine.editor.core.dock; -import com.pine.panels.console.ConsolePanel; -import com.pine.panels.files.ContentBrowser; -import com.pine.panels.hierarchy.HierarchyPanel; -import com.pine.panels.inspector.InspectorPanel; -import com.pine.panels.metrics.MetricsPanel; -import com.pine.panels.resources.ResourcesPanel; -import com.pine.panels.viewport.ViewportPanel; -import com.pine.theme.Icons; +import com.pine.common.Icons; +import com.pine.editor.panels.console.ConsolePanel; +import com.pine.editor.panels.files.FilesPanel; +import com.pine.editor.panels.hierarchy.HierarchyPanel; +import com.pine.editor.panels.inspector.InspectorPanel; +import com.pine.editor.panels.metrics.MetricsPanel; +import com.pine.editor.panels.resources.ResourcesPanel; +import com.pine.editor.panels.viewport.ViewportPanel; import java.util.Arrays; @@ -16,7 +16,7 @@ public enum DockSpace { Hierarchy("Hierarchy", Icons.account_tree, HierarchyPanel.class), Inspector("Inspector", Icons.search, InspectorPanel.class), Console("Console", Icons.terminal, ConsolePanel.class), - Files("Files", Icons.folder_open, ContentBrowser.class), + Files("Files", Icons.folder_open, FilesPanel.class), Resources("Resources", Icons.data_array, ResourcesPanel.class), Metrics("Metrics", Icons.bar_chart, MetricsPanel.class); diff --git a/editor/src/main/java/com/pine/core/dock/DockSpacePanel.java b/src/main/java/com/pine/editor/core/dock/DockSpacePanel.java similarity index 93% rename from editor/src/main/java/com/pine/core/dock/DockSpacePanel.java rename to src/main/java/com/pine/editor/core/dock/DockSpacePanel.java index fa375504..bfb708bd 100644 --- a/editor/src/main/java/com/pine/core/dock/DockSpacePanel.java +++ b/src/main/java/com/pine/editor/core/dock/DockSpacePanel.java @@ -1,11 +1,11 @@ -package com.pine.core.dock; - -import com.pine.core.AbstractView; -import com.pine.injection.PInject; -import com.pine.messaging.Loggable; -import com.pine.messaging.MessageRepository; -import com.pine.messaging.MessageSeverity; -import com.pine.theme.Icons; +package com.pine.editor.core.dock; + +import com.pine.common.Icons; +import com.pine.common.injection.PInject; +import com.pine.common.messaging.Loggable; +import com.pine.common.messaging.MessageRepository; +import com.pine.common.messaging.MessageSeverity; +import com.pine.editor.core.AbstractView; import imgui.ImGui; import imgui.ImVec2; import imgui.flag.*; @@ -14,8 +14,8 @@ import java.io.Serializable; -import static com.pine.core.UIUtil.OPEN; -import static com.pine.theme.Icons.ONLY_ICON_BUTTON_SIZE; +import static com.pine.common.Icons.ONLY_ICON_BUTTON_SIZE; +import static com.pine.editor.core.UIUtil.OPEN; public final class DockSpacePanel extends AbstractView implements Loggable, Serializable { private static final int FLAGS = ImGuiWindowFlags.NoCollapse | ImGuiWindowFlags.NoMove | ImGuiWindowFlags.MenuBar; diff --git a/editor/src/main/java/com/pine/panels/AbstractEntityViewPanel.java b/src/main/java/com/pine/editor/panels/AbstractEntityViewPanel.java similarity index 64% rename from editor/src/main/java/com/pine/panels/AbstractEntityViewPanel.java rename to src/main/java/com/pine/editor/panels/AbstractEntityViewPanel.java index 1d2b1225..bb142479 100644 --- a/editor/src/main/java/com/pine/panels/AbstractEntityViewPanel.java +++ b/src/main/java/com/pine/editor/panels/AbstractEntityViewPanel.java @@ -1,16 +1,16 @@ -package com.pine.panels; +package com.pine.editor.panels; -import com.pine.core.dock.AbstractDockPanel; -import com.pine.injection.PInject; -import com.pine.messaging.MessageRepository; -import com.pine.messaging.MessageSeverity; -import com.pine.repository.EditorRepository; -import com.pine.repository.WorldRepository; -import com.pine.service.SelectionService; -import com.pine.service.grid.WorldService; -import com.pine.service.rendering.RequestProcessingService; -import com.pine.service.request.CopyEntitiesRequest; -import com.pine.service.request.DeleteEntityRequest; +import com.pine.common.injection.PInject; +import com.pine.common.messaging.MessageRepository; +import com.pine.common.messaging.MessageSeverity; +import com.pine.editor.core.dock.AbstractDockPanel; +import com.pine.editor.repository.EditorRepository; +import com.pine.editor.service.SelectionService; +import com.pine.engine.repository.WorldRepository; +import com.pine.engine.service.rendering.RequestProcessingService; +import com.pine.engine.service.request.CopyEntitiesRequest; +import com.pine.engine.service.request.DeleteEntityRequest; +import com.pine.engine.service.world.WorldService; import imgui.ImGui; import imgui.extension.imguizmo.ImGuizmo; import imgui.flag.ImGuiKey; @@ -30,7 +30,7 @@ public abstract class AbstractEntityViewPanel extends AbstractDockPanel { public WorldRepository world; protected void hotKeys() { - if((!ImGui.isWindowHovered() && !isWindowFocused) || ImGuizmo.isUsing()){ + if (!ImGui.isWindowHovered() || !isWindowFocused || ImGuizmo.isUsing()) { return; } var isNotEmptyOfSelection = !stateRepository.selected.isEmpty(); @@ -46,21 +46,21 @@ protected void hotKeys() { } if (isNotEmptyOfSelection && ImGui.isKeyPressed(ImGuiKey.C)) { - messageRepository.pushMessage("Copying " + stateRepository.selected.size() + " entities", MessageSeverity.WARN); + messageRepository.pushMessage("Copying " + stateRepository.selected.size() + " entities", MessageSeverity.WARN); stateRepository.copied.clear(); stateRepository.copied.addAll(stateRepository.selected.keySet()); } if (ctrlDown && ImGui.isKeyPressed(ImGuiKey.A)) { - for(var tile : worldService.getLoadedTiles()){ - if(tile != null) { + for (var tile : worldService.getLoadedTiles()) { + if (tile != null) { selectionService.addAllSelected(world.entityMap.values()); } } } if (!stateRepository.copied.isEmpty() && ctrlDown && ImGui.isKeyPressed(ImGuiKey.V)) { - messageRepository.pushMessage("Pasting " + stateRepository.copied.size() + " entities", MessageSeverity.WARN); + messageRepository.pushMessage("Pasting " + stateRepository.copied.size() + " entities", MessageSeverity.WARN); var request = new CopyEntitiesRequest(stateRepository.copied, selectionService.stateRepository.mainSelection); requestProcessingService.addRequest(request); } @@ -68,6 +68,6 @@ protected void hotKeys() { hotKeysInternal(); } - protected void hotKeysInternal(){ + protected void hotKeysInternal() { } } diff --git a/editor/src/main/java/com/pine/panels/ToasterPanel.java b/src/main/java/com/pine/editor/panels/ToasterPanel.java similarity index 80% rename from editor/src/main/java/com/pine/panels/ToasterPanel.java rename to src/main/java/com/pine/editor/panels/ToasterPanel.java index 809b6790..bb74c221 100644 --- a/editor/src/main/java/com/pine/panels/ToasterPanel.java +++ b/src/main/java/com/pine/editor/panels/ToasterPanel.java @@ -1,17 +1,17 @@ -package com.pine.panels; +package com.pine.editor.panels; -import com.pine.core.AbstractView; -import com.pine.injection.PInject; -import com.pine.messaging.Message; -import com.pine.messaging.MessageRepository; -import com.pine.service.ThemeService; +import com.pine.common.injection.PInject; +import com.pine.common.messaging.Message; +import com.pine.common.messaging.MessageRepository; +import com.pine.editor.core.AbstractView; +import com.pine.editor.service.ThemeService; import imgui.ImGui; import imgui.ImVec2; import imgui.flag.ImGuiCol; import imgui.flag.ImGuiWindowFlags; -import static com.pine.core.UIUtil.OPEN; -import static com.pine.messaging.MessageRepository.MESSAGE_DURATION; +import static com.pine.common.messaging.MessageRepository.MESSAGE_DURATION; +import static com.pine.editor.core.UIUtil.OPEN; public class ToasterPanel extends AbstractView { private static final int FLAGS = ImGuiWindowFlags.NoDecoration | ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoSavedSettings; diff --git a/src/main/java/com/pine/editor/panels/component/AbstractFieldView.java b/src/main/java/com/pine/editor/panels/component/AbstractFieldView.java new file mode 100644 index 00000000..9106c031 --- /dev/null +++ b/src/main/java/com/pine/editor/panels/component/AbstractFieldView.java @@ -0,0 +1,18 @@ +package com.pine.editor.panels.component; + +import com.pine.common.inspection.FieldDTO; +import com.pine.editor.core.AbstractView; + +import java.util.function.BiConsumer; + +public abstract class AbstractFieldView extends AbstractView { + private final String name; + + public AbstractFieldView(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/com/pine/editor/panels/component/AbstractFormField.java b/src/main/java/com/pine/editor/panels/component/AbstractFormField.java new file mode 100644 index 00000000..7113fb70 --- /dev/null +++ b/src/main/java/com/pine/editor/panels/component/AbstractFormField.java @@ -0,0 +1,16 @@ +package com.pine.editor.panels.component; + +import com.pine.common.inspection.FieldDTO; + +import java.util.function.BiConsumer; + +public abstract class AbstractFormField extends AbstractFieldView { + protected final FieldDTO dto; + protected final BiConsumer changeHandler; + + public AbstractFormField(FieldDTO dto, BiConsumer changeHandler) { + super(dto.getLabel()); + this.dto = dto; + this.changeHandler = changeHandler; + } +} diff --git a/src/main/java/com/pine/editor/panels/component/AccordionPanel.java b/src/main/java/com/pine/editor/panels/component/AccordionPanel.java new file mode 100644 index 00000000..1634c156 --- /dev/null +++ b/src/main/java/com/pine/editor/panels/component/AccordionPanel.java @@ -0,0 +1,45 @@ +package com.pine.editor.panels.component; + +import com.pine.editor.core.AbstractView; +import com.pine.editor.core.UIUtil; +import imgui.ImGui; +import imgui.ImVec4; +import imgui.flag.ImGuiCol; +import imgui.type.ImString; + +import java.util.ArrayList; +import java.util.List; + +public class AccordionPanel extends AbstractView { + public String title; + private final List views = new ArrayList<>(); + + public List getViews() { + return views; + } + + public void append(AbstractFieldView view) { + appendChild(view); + views.add(view); + } + + @Override + public void render() { + if (title.isEmpty()) { + renderInternal(); + return; + } + + if (ImGui.collapsingHeader(title + imguiId)) { + ImGui.indent(UIUtil.IDENT); + renderInternal(); + ImGui.unindent(UIUtil.IDENT); + } + } + + private void renderInternal() { + for (var view : views) { + view.render(); + } + } +} diff --git a/src/main/java/com/pine/editor/panels/component/FormPanel.java b/src/main/java/com/pine/editor/panels/component/FormPanel.java new file mode 100644 index 00000000..58328452 --- /dev/null +++ b/src/main/java/com/pine/editor/panels/component/FormPanel.java @@ -0,0 +1,179 @@ +package com.pine.editor.panels.component; + +import com.pine.common.injection.PInject; +import com.pine.common.inspection.FieldDTO; +import com.pine.common.inspection.Inspectable; +import com.pine.common.inspection.MethodDTO; +import com.pine.editor.core.AbstractView; +import com.pine.editor.core.UIUtil; +import com.pine.editor.panels.component.impl.*; +import com.pine.editor.service.ThemeService; +import com.pine.engine.inspection.ResourceTypeField; +import com.pine.engine.inspection.TypePreviewField; +import imgui.ImGui; +import imgui.flag.ImGuiCol; +import imgui.flag.ImGuiTreeNodeFlags; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; + +public class FormPanel extends AbstractView { + private final BiConsumer changeHandler; + private Inspectable inspectable; + private final Map groups = new HashMap<>(); + private String search; + private boolean compactMode; + private boolean somethingMatches; + + @PInject + public ThemeService theme; + private boolean isDefaultOpen; + + public FormPanel(BiConsumer changeHandler) { + this.changeHandler = changeHandler; + } + + public void setInspection(Inspectable data) { + if (this.inspectable == data) { + return; + } + this.inspectable = data; + children.clear(); + groups.clear(); + + if (data == null) { + return; + } + processMethods(data); + processFields(data); + } + + private void processMethods(Inspectable data) { + for (MethodDTO methodDTO : data.getMethodsAnnotated()) { + if (!groups.containsKey(methodDTO.getGroup())) { + groups.put(methodDTO.getGroup(), appendChild(new AccordionPanel())); + } + + AccordionPanel group = groups.get(methodDTO.getGroup()); + group.title = methodDTO.getGroup(); + group.append(new ExecutableFunctionField(methodDTO)); + } + } + + private void processFields(Inspectable data) { + for (FieldDTO field : data.getFieldsAnnotated()) { + if (!groups.containsKey(field.getGroup())) { + groups.put(field.getGroup(), appendChild(new AccordionPanel())); + } + + AccordionPanel group = groups.get(field.getGroup()); + group.title = field.getGroup(); + switch (field.getType()) { + case STRING: + if (field.getField().isAnnotationPresent(ResourceTypeField.class)) { + group.append(new ResourceField(field, changeHandler)); + } else if (field.getField().isAnnotationPresent(TypePreviewField.class)) { + group.append(new PreviewField(field, changeHandler)); + } else { + group.append(new StringField(field, changeHandler)); + } + break; + case INT: + group.append(new IntField(field, changeHandler)); + break; + case LIST: + group.append(new ListField(field, changeHandler)); + break; + case FLOAT: + group.append(new FloatField(field, changeHandler)); + break; + case BOOLEAN: + group.append(new BooleanField(field, changeHandler)); + break; + case VECTOR2: + group.append(new Vector2Field(field, changeHandler)); + break; + case VECTOR3: + group.append(new Vector3Field(field, changeHandler)); + break; + case VECTOR4: + group.append(new Vector4Field(field, changeHandler)); + break; + case QUATERNION: + group.append(new QuaternionField(field, changeHandler)); + break; + case COLOR: + group.append(new ColorField(field, changeHandler)); + break; + case OPTIONS: + group.append(new OptionsField(field, changeHandler)); + break; + case MATERIAL_LAYER: + case MATERIAL_LAYERS: + group.append(new CompositeInspectableField(field, changeHandler)); + break; + } + } + } + + public Inspectable getInspectable() { + return inspectable; + } + + @Override + public void render() { + if (inspectable != null) { + ImGui.pushStyleColor(ImGuiCol.Header, theme.neutralPalette); + if (search == null || search.isEmpty()) { + if (compactMode) { + if (ImGui.collapsingHeader(inspectable.getIcon() + inspectable.getTitle() + imguiId, isDefaultOpen ? ImGuiTreeNodeFlags.DefaultOpen : ImGuiTreeNodeFlags.None)) { + ImGui.indent(UIUtil.IDENT); + super.render(); + ImGui.separator(); + ImGui.unindent(UIUtil.IDENT); + } + } else { + renderTitle(); + super.render(); + } + } else { + if (somethingMatches) { + renderTitle(); + } + somethingMatches = false; + for (var group : groups.values()) { + boolean groupMatches = group.title.toLowerCase().contains(search); + if (groupMatches) { + ImGui.text(group.title); + ImGui.separator(); + } + for (var view : group.getViews()) { + if (groupMatches || view.getName().toLowerCase().contains(search)) { + view.render(); + somethingMatches = true; + } + } + } + } + ImGui.popStyleColor(); + } + } + + private void renderTitle() { + ImGui.text(inspectable.getIcon() + inspectable.getTitle()); + ImGui.separator(); + } + + public void setSearch(String fieldSearch) { + this.search = fieldSearch; + } + + public void setCompactMode(boolean v) { + this.compactMode = v; + } + + public void setDefaultOpen(boolean defaultOpen) { + isDefaultOpen = defaultOpen; + } +} diff --git a/editor/src/main/java/com/pine/panels/component/impl/BooleanField.java b/src/main/java/com/pine/editor/panels/component/impl/BooleanField.java similarity index 53% rename from editor/src/main/java/com/pine/panels/component/impl/BooleanField.java rename to src/main/java/com/pine/editor/panels/component/impl/BooleanField.java index 8a77009d..19213acf 100644 --- a/editor/src/main/java/com/pine/panels/component/impl/BooleanField.java +++ b/src/main/java/com/pine/editor/panels/component/impl/BooleanField.java @@ -1,7 +1,7 @@ -package com.pine.panels.component.impl; +package com.pine.editor.panels.component.impl; -import com.pine.inspection.FieldDTO; -import com.pine.panels.component.AbstractFormField; +import com.pine.common.inspection.FieldDTO; +import com.pine.editor.panels.component.AbstractFormField; import imgui.ImGui; import java.util.function.BiConsumer; @@ -16,10 +16,12 @@ public BooleanField(FieldDTO dto, BiConsumer changerHandler) { @Override public void render() { - if(ImGui.checkbox(dto.getLabel(), value)){ - if(!dto.isDisabled()) { + if (dto.isDisabled()) { + ImGui.textDisabled(dto.getLabel() + ": " + value); + } else { + if (ImGui.checkbox(dto.getLabel(), value)) { value = !value; - changerHandler.accept(dto, value); + changeHandler.accept(dto, value); } } } diff --git a/src/main/java/com/pine/editor/panels/component/impl/ColorField.java b/src/main/java/com/pine/editor/panels/component/impl/ColorField.java new file mode 100644 index 00000000..f301d931 --- /dev/null +++ b/src/main/java/com/pine/editor/panels/component/impl/ColorField.java @@ -0,0 +1,36 @@ +package com.pine.editor.panels.component.impl; + +import com.pine.common.inspection.Color; +import com.pine.common.inspection.FieldDTO; +import com.pine.editor.panels.component.AbstractFormField; +import imgui.ImGui; +import imgui.ImVec4; +import imgui.flag.ImGuiColorEditFlags; + +import java.util.function.BiConsumer; + +public class ColorField extends AbstractFormField { + private final ImVec4 values = new ImVec4(); + private final float[] valuesV = new float[3]; + + public ColorField(FieldDTO dto, BiConsumer changerHandler) { + super(dto, changerHandler); + var cast = (Color) dto.getValue(); + valuesV[0] = values.x = cast.x; + valuesV[1] = values.y = cast.y; + valuesV[2] = values.z = cast.z; + values.w = 1; + } + + @Override + public void render() { + if(dto.isDisabled()){ + ImGui.colorButton(dto.getId(), values); + }else { + ImGui.text(dto.getLabel()); + if (ImGui.colorPicker3(dto.getId(), valuesV, ImGuiColorEditFlags.NoSidePreview | ImGuiColorEditFlags.DisplayRGB | ImGuiColorEditFlags.NoAlpha)) { + changeHandler.accept(dto, valuesV); + } + } + } +} diff --git a/src/main/java/com/pine/editor/panels/component/impl/CompositeInspectableField.java b/src/main/java/com/pine/editor/panels/component/impl/CompositeInspectableField.java new file mode 100644 index 00000000..130bf9cd --- /dev/null +++ b/src/main/java/com/pine/editor/panels/component/impl/CompositeInspectableField.java @@ -0,0 +1,26 @@ +package com.pine.editor.panels.component.impl; + +import com.pine.common.inspection.FieldDTO; +import com.pine.common.inspection.Inspectable; +import com.pine.editor.panels.component.AbstractFormField; +import com.pine.editor.panels.component.FormPanel; + +import java.util.function.BiConsumer; + +public class CompositeInspectableField extends AbstractFormField { + private final Inspectable value; + + public CompositeInspectableField(FieldDTO field, BiConsumer changeHandler) { + super(field, changeHandler); + value = (Inspectable) field.getValue(); + } + + @Override + public void onInitialize() { + super.onInitialize(); + FormPanel form = appendChild(new FormPanel(changeHandler)); + form.setInspection(value); + form.setCompactMode(true); + form.setDefaultOpen(true); + } +} diff --git a/editor/src/main/java/com/pine/panels/component/impl/ExecutableFunctionField.java b/src/main/java/com/pine/editor/panels/component/impl/ExecutableFunctionField.java similarity index 60% rename from editor/src/main/java/com/pine/panels/component/impl/ExecutableFunctionField.java rename to src/main/java/com/pine/editor/panels/component/impl/ExecutableFunctionField.java index 5d8a2fe6..562c48a7 100644 --- a/editor/src/main/java/com/pine/panels/component/impl/ExecutableFunctionField.java +++ b/src/main/java/com/pine/editor/panels/component/impl/ExecutableFunctionField.java @@ -1,13 +1,15 @@ -package com.pine.panels.component.impl; +package com.pine.editor.panels.component.impl; -import com.pine.core.AbstractView; -import com.pine.inspection.MethodDTO; +import com.pine.common.inspection.MethodDTO; +import com.pine.editor.core.AbstractView; +import com.pine.editor.panels.component.AbstractFieldView; import imgui.ImGui; -public class ExecutableFunctionField extends AbstractView { +public class ExecutableFunctionField extends AbstractFieldView { private final MethodDTO dto; public ExecutableFunctionField(MethodDTO dto) { + super(dto.getLabel()); this.dto = dto; } diff --git a/editor/src/main/java/com/pine/panels/component/impl/FloatField.java b/src/main/java/com/pine/editor/panels/component/impl/FloatField.java similarity index 78% rename from editor/src/main/java/com/pine/panels/component/impl/FloatField.java rename to src/main/java/com/pine/editor/panels/component/impl/FloatField.java index 348e37bc..6b010b83 100644 --- a/editor/src/main/java/com/pine/panels/component/impl/FloatField.java +++ b/src/main/java/com/pine/editor/panels/component/impl/FloatField.java @@ -1,7 +1,7 @@ -package com.pine.panels.component.impl; +package com.pine.editor.panels.component.impl; -import com.pine.inspection.FieldDTO; -import com.pine.panels.component.AbstractFormField; +import com.pine.common.inspection.FieldDTO; +import com.pine.editor.panels.component.AbstractFormField; import imgui.ImGui; import java.util.function.BiConsumer; @@ -25,7 +25,7 @@ public void render() { } else { ImGui.text(dto.getLabel()); if (ImGui.dragFloat(imguiId, values, .01f, dto.getMin(), dto.getMax())) { - changerHandler.accept(dto, values[0]); + changeHandler.accept(dto, values[0]); } } } diff --git a/editor/src/main/java/com/pine/panels/component/impl/IntField.java b/src/main/java/com/pine/editor/panels/component/impl/IntField.java similarity index 78% rename from editor/src/main/java/com/pine/panels/component/impl/IntField.java rename to src/main/java/com/pine/editor/panels/component/impl/IntField.java index 6b7301d5..605dfd66 100644 --- a/editor/src/main/java/com/pine/panels/component/impl/IntField.java +++ b/src/main/java/com/pine/editor/panels/component/impl/IntField.java @@ -1,7 +1,7 @@ -package com.pine.panels.component.impl; +package com.pine.editor.panels.component.impl; -import com.pine.inspection.FieldDTO; -import com.pine.panels.component.AbstractFormField; +import com.pine.common.inspection.FieldDTO; +import com.pine.editor.panels.component.AbstractFormField; import imgui.ImGui; import java.util.function.BiConsumer; @@ -25,7 +25,7 @@ public void render() { } else { ImGui.text(dto.getLabel()); if (ImGui.dragInt(imguiId, values, 1, dto.getMin(), dto.getMax())) { - changerHandler.accept(dto, values[0]); + changeHandler.accept(dto, values[0]); } } } diff --git a/src/main/java/com/pine/editor/panels/component/impl/ListField.java b/src/main/java/com/pine/editor/panels/component/impl/ListField.java new file mode 100644 index 00000000..97c57835 --- /dev/null +++ b/src/main/java/com/pine/editor/panels/component/impl/ListField.java @@ -0,0 +1,52 @@ +package com.pine.editor.panels.component.impl; + +import com.pine.common.Icons; +import com.pine.common.inspection.FieldDTO; +import com.pine.common.inspection.Inspectable; +import com.pine.editor.core.UIUtil; +import com.pine.editor.panels.component.AbstractFormField; +import com.pine.editor.panels.component.FormPanel; +import imgui.ImGui; +import imgui.flag.ImGuiTreeNodeFlags; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.BiConsumer; + +public class ListField extends AbstractFormField { + private final List value; + private final List forms = new ArrayList<>(); + + public ListField(FieldDTO field, BiConsumer changeHandler) { + super(field, changeHandler); + value = (List) field.getValue(); + } + + @Override + public void render() { + if(ImGui.collapsingHeader(dto.getLabel(), ImGuiTreeNodeFlags.DefaultOpen)) { + ImGui.indent(UIUtil.IDENT); + if (ImGui.button(Icons.add + "Add new")) { + try { + value.add((Inspectable) dto.getClassType().getConstructor().newInstance()); + } catch (Exception e) { + getLogger().error("Could not instantiate object", e); + } + } + + for (int i = 0; i < value.size(); i++) { + var instance = value.get(i); + if (forms.size() - 1 < i) { + var form = appendChild(new FormPanel(changeHandler)); + forms.add(form); + removeChild(form); + form.setInspection(instance); + form.setCompactMode(true); + form.setDefaultOpen(true); + } + forms.get(i).render(); + } + ImGui.unindent(UIUtil.IDENT); + } + } +} diff --git a/editor/src/main/java/com/pine/panels/component/impl/OptionsField.java b/src/main/java/com/pine/editor/panels/component/impl/OptionsField.java similarity index 75% rename from editor/src/main/java/com/pine/panels/component/impl/OptionsField.java rename to src/main/java/com/pine/editor/panels/component/impl/OptionsField.java index d111adfa..6111f505 100644 --- a/editor/src/main/java/com/pine/panels/component/impl/OptionsField.java +++ b/src/main/java/com/pine/editor/panels/component/impl/OptionsField.java @@ -1,8 +1,8 @@ -package com.pine.panels.component.impl; +package com.pine.editor.panels.component.impl; -import com.pine.inspection.FieldDTO; -import com.pine.inspection.SelectableEnum; -import com.pine.panels.component.AbstractFormField; +import com.pine.common.inspection.FieldDTO; +import com.pine.common.inspection.SelectableEnum; +import com.pine.editor.panels.component.AbstractFormField; import imgui.ImGui; import java.util.function.BiConsumer; @@ -25,7 +25,7 @@ public void render() { for (var op : dto.getOptions()) { if (ImGui.checkbox(op.getTitle(), selected == op)) { selected = op; - changerHandler.accept(dto, op); + changeHandler.accept(dto, op); } } } diff --git a/editor/src/main/java/com/pine/panels/component/impl/PreviewField.java b/src/main/java/com/pine/editor/panels/component/impl/PreviewField.java similarity index 67% rename from editor/src/main/java/com/pine/panels/component/impl/PreviewField.java rename to src/main/java/com/pine/editor/panels/component/impl/PreviewField.java index 9b5822dc..61b95551 100644 --- a/editor/src/main/java/com/pine/panels/component/impl/PreviewField.java +++ b/src/main/java/com/pine/editor/panels/component/impl/PreviewField.java @@ -1,24 +1,24 @@ -package com.pine.panels.component.impl; - -import com.pine.injection.PInject; -import com.pine.inspection.FieldDTO; -import com.pine.panels.component.AbstractFormField; -import com.pine.repository.ClockRepository; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.importer.ImporterService; -import com.pine.service.streaming.StreamingService; -import com.pine.service.streaming.ref.TextureResourceRef; +package com.pine.editor.panels.component.impl; + +import com.pine.common.injection.PInject; +import com.pine.common.inspection.FieldDTO; +import com.pine.editor.panels.component.AbstractFormField; +import com.pine.engine.repository.ClockRepository; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.importer.ImporterService; +import com.pine.engine.service.streaming.StreamingService; +import com.pine.engine.service.streaming.ref.TextureResourceRef; import imgui.ImGui; import imgui.ImVec2; import java.util.Objects; import java.util.function.BiConsumer; -import static com.pine.panels.viewport.ViewportPanel.INV_Y; -import static com.pine.service.importer.impl.TextureImporter.PREVIEW_EXT; +import static com.pine.editor.panels.viewport.ViewportPanel.INV_Y; +import static com.pine.engine.service.importer.impl.TextureImporter.PREVIEW_EXT; public class PreviewField extends AbstractFormField { - private static final ImVec2 INV_X_L = new ImVec2(-1, 0); + public static final ImVec2 INV_X_L = new ImVec2(-1, 0); private String value; private TextureResourceRef textureRef; private final ImVec2 sizeVec = new ImVec2(); diff --git a/editor/src/main/java/com/pine/panels/component/impl/QuaternionField.java b/src/main/java/com/pine/editor/panels/component/impl/QuaternionField.java similarity index 82% rename from editor/src/main/java/com/pine/panels/component/impl/QuaternionField.java rename to src/main/java/com/pine/editor/panels/component/impl/QuaternionField.java index dfa0c6cc..6c3f8bcf 100644 --- a/editor/src/main/java/com/pine/panels/component/impl/QuaternionField.java +++ b/src/main/java/com/pine/editor/panels/component/impl/QuaternionField.java @@ -1,7 +1,7 @@ -package com.pine.panels.component.impl; +package com.pine.editor.panels.component.impl; -import com.pine.inspection.FieldDTO; -import com.pine.panels.component.AbstractFormField; +import com.pine.common.inspection.FieldDTO; +import com.pine.editor.panels.component.AbstractFormField; import imgui.ImGui; import org.joml.Quaternionf; @@ -31,7 +31,7 @@ public void render() { ImGui.text("W: " + values[3]); } else { if (ImGui.dragFloat4(imguiId, values, .01f, dto.getMin(), dto.getMax())) { - changerHandler.accept(dto, values); + changeHandler.accept(dto, values); } } } diff --git a/editor/src/main/java/com/pine/panels/component/impl/ResourceField.java b/src/main/java/com/pine/editor/panels/component/impl/ResourceField.java similarity index 76% rename from editor/src/main/java/com/pine/panels/component/impl/ResourceField.java rename to src/main/java/com/pine/editor/panels/component/impl/ResourceField.java index 13cdc2a8..4c4193e0 100644 --- a/editor/src/main/java/com/pine/panels/component/impl/ResourceField.java +++ b/src/main/java/com/pine/editor/panels/component/impl/ResourceField.java @@ -1,14 +1,15 @@ -package com.pine.panels.component.impl; - -import com.pine.injection.PInject; -import com.pine.inspection.FieldDTO; -import com.pine.inspection.ResourceTypeField; -import com.pine.panels.component.AbstractFormField; -import com.pine.repository.FSEntry; -import com.pine.repository.FilesRepository; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.repository.streaming.StreamingRepository; -import com.pine.theme.Icons; +package com.pine.editor.panels.component.impl; + +import com.pine.common.Icons; +import com.pine.common.injection.PInject; +import com.pine.common.inspection.FieldDTO; +import com.pine.editor.core.UIUtil; +import com.pine.editor.panels.component.AbstractFormField; +import com.pine.editor.repository.FSEntry; +import com.pine.editor.repository.FilesRepository; +import com.pine.engine.inspection.ResourceTypeField; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.streaming.StreamingRepository; import imgui.ImGui; import imgui.type.ImInt; @@ -80,7 +81,7 @@ public void render() { ImGui.columns(2, "##resourceColumns" + imguiId, false); ImGui.setColumnWidth(0, 65); if (previewField == null) { - previewField = appendChild(new PreviewField(dto, changerHandler)); + previewField = appendChild(new PreviewField(dto, changeHandler)); previewField.setSmallSize(true); } previewField.render(); @@ -90,6 +91,7 @@ public void render() { ImGui.columns(1); } else { ImGui.text(dto.getLabel()); + ImGui.setNextItemWidth(ImGui.getContentRegionAvailX() - Icons.ONLY_ICON_BUTTON_SIZE - 16); renderCombo(); ImGui.sameLine(); renderRemove(); @@ -97,15 +99,15 @@ public void render() { } private void renderRemove() { - if (ImGui.button(Icons.close + "Remove" + imguiId)) { + if (ImGui.button(Icons.close + imguiId, Icons.ONLY_ICON_BUTTON_SIZE, Icons.ONLY_ICON_BUTTON_SIZE)) { selected.set(-1); - changerHandler.accept(dto, null); + changeHandler.accept(dto, null); } } private void renderCombo() { if (ImGui.combo(imguiId, selected, itemsArr)) { - changerHandler.accept(dto, allByType.get(selected.get()).getId()); + changeHandler.accept(dto, allByType.get(selected.get()).getId()); } } } diff --git a/editor/src/main/java/com/pine/panels/component/impl/StringField.java b/src/main/java/com/pine/editor/panels/component/impl/StringField.java similarity index 74% rename from editor/src/main/java/com/pine/panels/component/impl/StringField.java rename to src/main/java/com/pine/editor/panels/component/impl/StringField.java index af851b47..238bd8e9 100644 --- a/editor/src/main/java/com/pine/panels/component/impl/StringField.java +++ b/src/main/java/com/pine/editor/panels/component/impl/StringField.java @@ -1,7 +1,7 @@ -package com.pine.panels.component.impl; +package com.pine.editor.panels.component.impl; -import com.pine.inspection.FieldDTO; -import com.pine.panels.component.AbstractFormField; +import com.pine.common.inspection.FieldDTO; +import com.pine.editor.panels.component.AbstractFormField; import imgui.ImGui; import imgui.type.ImString; @@ -22,7 +22,7 @@ public void render() { ImGui.textDisabled(value.get()); } else { if (ImGui.inputText(dto.getId(), value)) { - changerHandler.accept(dto, value.get()); + changeHandler.accept(dto, value.get()); } } } diff --git a/editor/src/main/java/com/pine/panels/component/impl/Vector2Field.java b/src/main/java/com/pine/editor/panels/component/impl/Vector2Field.java similarity index 79% rename from editor/src/main/java/com/pine/panels/component/impl/Vector2Field.java rename to src/main/java/com/pine/editor/panels/component/impl/Vector2Field.java index 5fc3ac6c..8b261f2c 100644 --- a/editor/src/main/java/com/pine/panels/component/impl/Vector2Field.java +++ b/src/main/java/com/pine/editor/panels/component/impl/Vector2Field.java @@ -1,7 +1,7 @@ -package com.pine.panels.component.impl; +package com.pine.editor.panels.component.impl; -import com.pine.inspection.FieldDTO; -import com.pine.panels.component.AbstractFormField; +import com.pine.common.inspection.FieldDTO; +import com.pine.editor.panels.component.AbstractFormField; import imgui.ImGui; import org.joml.Vector2f; @@ -27,7 +27,7 @@ public void render() { ImGui.text("Y: " + values[1]); } else { if (ImGui.dragFloat2(imguiId, values, .01f, dto.getMin(), dto.getMax())) { - changerHandler.accept(dto, values); + changeHandler.accept(dto, values); } } } diff --git a/editor/src/main/java/com/pine/panels/component/impl/Vector3Field.java b/src/main/java/com/pine/editor/panels/component/impl/Vector3Field.java similarity index 81% rename from editor/src/main/java/com/pine/panels/component/impl/Vector3Field.java rename to src/main/java/com/pine/editor/panels/component/impl/Vector3Field.java index 4a9d370d..877b2b1e 100644 --- a/editor/src/main/java/com/pine/panels/component/impl/Vector3Field.java +++ b/src/main/java/com/pine/editor/panels/component/impl/Vector3Field.java @@ -1,7 +1,7 @@ -package com.pine.panels.component.impl; +package com.pine.editor.panels.component.impl; -import com.pine.inspection.FieldDTO; -import com.pine.panels.component.AbstractFormField; +import com.pine.common.inspection.FieldDTO; +import com.pine.editor.panels.component.AbstractFormField; import imgui.ImGui; import org.joml.Vector3f; @@ -29,7 +29,7 @@ public void render() { ImGui.text("Z: " + values[2]); } else { if (ImGui.dragFloat3(imguiId, values, .01f, dto.getMin(), dto.getMax())) { - changerHandler.accept(dto, values); + changeHandler.accept(dto, values); } } } diff --git a/editor/src/main/java/com/pine/panels/component/impl/Vector4Field.java b/src/main/java/com/pine/editor/panels/component/impl/Vector4Field.java similarity index 82% rename from editor/src/main/java/com/pine/panels/component/impl/Vector4Field.java rename to src/main/java/com/pine/editor/panels/component/impl/Vector4Field.java index a3e605bf..ccaf0798 100644 --- a/editor/src/main/java/com/pine/panels/component/impl/Vector4Field.java +++ b/src/main/java/com/pine/editor/panels/component/impl/Vector4Field.java @@ -1,7 +1,7 @@ -package com.pine.panels.component.impl; +package com.pine.editor.panels.component.impl; -import com.pine.inspection.FieldDTO; -import com.pine.panels.component.AbstractFormField; +import com.pine.common.inspection.FieldDTO; +import com.pine.editor.panels.component.AbstractFormField; import imgui.ImGui; import org.joml.Vector4f; @@ -31,7 +31,7 @@ public void render() { ImGui.text("W: " + values[3]); } else { if (ImGui.dragFloat4(imguiId, values, .01f, dto.getMin(), dto.getMax())) { - changerHandler.accept(dto, values); + changeHandler.accept(dto, values); } } } diff --git a/editor/src/main/java/com/pine/panels/console/ConsoleHeaderPanel.java b/src/main/java/com/pine/editor/panels/console/ConsoleHeaderPanel.java similarity index 79% rename from editor/src/main/java/com/pine/panels/console/ConsoleHeaderPanel.java rename to src/main/java/com/pine/editor/panels/console/ConsoleHeaderPanel.java index 67b89b7b..182261ee 100644 --- a/editor/src/main/java/com/pine/panels/console/ConsoleHeaderPanel.java +++ b/src/main/java/com/pine/editor/panels/console/ConsoleHeaderPanel.java @@ -1,8 +1,8 @@ -package com.pine.panels.console; +package com.pine.editor.panels.console; -import com.pine.core.AbstractView; -import com.pine.theme.Icons; -import com.pine.util.InMemoryAppender; +import com.pine.common.Icons; +import com.pine.editor.core.AbstractView; +import com.pine.editor.util.InMemoryAppender; import imgui.ImGui; import imgui.type.ImString; diff --git a/editor/src/main/java/com/pine/panels/console/ConsolePanel.java b/src/main/java/com/pine/editor/panels/console/ConsolePanel.java similarity index 91% rename from editor/src/main/java/com/pine/panels/console/ConsolePanel.java rename to src/main/java/com/pine/editor/panels/console/ConsolePanel.java index be9c2141..2007af3b 100644 --- a/editor/src/main/java/com/pine/panels/console/ConsolePanel.java +++ b/src/main/java/com/pine/editor/panels/console/ConsolePanel.java @@ -1,8 +1,8 @@ -package com.pine.panels.console; +package com.pine.editor.panels.console; -import com.pine.core.dock.AbstractDockPanel; -import com.pine.util.InMemoryAppender; -import com.pine.util.LogMessage; +import com.pine.editor.core.dock.AbstractDockPanel; +import com.pine.editor.util.InMemoryAppender; +import com.pine.editor.util.LogMessage; import imgui.ImGui; import imgui.ImVec4; import imgui.flag.ImGuiTableColumnFlags; diff --git a/src/main/java/com/pine/editor/panels/files/DirectoryPanel.java b/src/main/java/com/pine/editor/panels/files/DirectoryPanel.java new file mode 100644 index 00000000..2f90f460 --- /dev/null +++ b/src/main/java/com/pine/editor/panels/files/DirectoryPanel.java @@ -0,0 +1,234 @@ +package com.pine.editor.panels.files; + +import com.pine.common.Icons; +import com.pine.common.injection.PInject; +import com.pine.editor.core.AbstractView; +import com.pine.editor.core.UIUtil; +import com.pine.editor.panels.component.impl.PreviewField; +import com.pine.editor.repository.EditorRepository; +import com.pine.editor.repository.FSEntry; +import com.pine.editor.repository.FilesRepository; +import com.pine.editor.service.FilesService; +import com.pine.editor.service.ThemeService; +import com.pine.engine.component.ComponentType; +import com.pine.engine.component.MeshComponent; +import com.pine.engine.repository.ClockRepository; +import com.pine.engine.repository.WorldRepository; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.importer.ImporterService; +import com.pine.engine.service.importer.data.SceneImportData; +import com.pine.engine.service.rendering.RequestProcessingService; +import com.pine.engine.service.request.AddEntityRequest; +import com.pine.engine.service.request.LoadSceneRequest; +import com.pine.engine.service.streaming.StreamingService; +import com.pine.engine.service.streaming.impl.SceneService; +import com.pine.engine.service.streaming.ref.TextureResourceRef; +import imgui.ImGui; +import imgui.ImVec2; +import imgui.ImVec4; +import imgui.flag.ImGuiCol; +import imgui.flag.ImGuiKey; +import imgui.flag.ImGuiMouseButton; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static com.pine.editor.panels.viewport.ViewportPanel.INV_Y; + +public class DirectoryPanel extends AbstractView { + + private static final int CARD_SIZE = 90; + private static final int TEXT_OFFSET = 28; + private static final ImVec2 TEXTURE_SIZE = new ImVec2(CARD_SIZE - 15, CARD_SIZE - TEXT_OFFSET - 4); + + @PInject + public FilesService filesService; + @PInject + public ClockRepository clockRepository; + @PInject + public ThemeService themeService; + @PInject + public FilesRepository filesRepository; + @PInject + public EditorRepository editorRepository; + @PInject + public RequestProcessingService requestProcessingService; + @PInject + public SceneService sceneService; + @PInject + public ImporterService importerService; + @PInject + public WorldRepository worldRepository; + @PInject + public StreamingService streamingService; + + public boolean isWindowFocused; + public String currentDirectory; + public Map selected; + public Map toCut; + public FSEntry inspection; + private boolean isSomethingHovered; + + @Override + public void render() { + if (ImGui.beginChild(imguiId)) { + isSomethingHovered = ImGui.isWindowHovered(); + if (ImGui.isWindowFocused()) { + selected.clear(); + inspection = null; + } + float size = Math.round(ImGui.getWindowSizeX() / CARD_SIZE) * CARD_SIZE - CARD_SIZE; + List children = filesRepository.parentChildren.get(currentDirectory); + if (children != null) { + int rowIndex = 1; + for (String child : children) { + FSEntry fEntry = filesRepository.entry.get(child); + boolean isSelected = selected.containsKey(child); + ImGui.pushStyleColor(ImGuiCol.ChildBg, isSelected || fEntry.isHovered ? editorRepository.accent : themeService.palette0); + renderItem(child, fEntry); + ImGui.popStyleColor(); + if (rowIndex * CARD_SIZE < size) { + ImGui.sameLine(); + rowIndex++; + } else { + rowIndex = 0; + } + } + } + hotkeys(); + } + ImGui.endChild(); + } + + private void renderItem(String child, FSEntry fEntry) { + if (ImGui.beginChild(child, CARD_SIZE, CARD_SIZE + 15, true)) { + fEntry.isHovered = ImGui.isWindowHovered(); + isSomethingHovered = isSomethingHovered || fEntry.isHovered; + onClick(fEntry); + if (fEntry.isDirectory()) { + ImGui.textColored(UIUtil.DIRECTORY_COLOR, Icons.folder); + } else if (fEntry.type == StreamableResourceType.TEXTURE) { + var texture = streamingService.streamIn(child, StreamableResourceType.TEXTURE); + if (texture != null) { + texture.lastUse = clockRepository.totalTime; + ImGui.image(((TextureResourceRef) texture).texture, TEXTURE_SIZE, PreviewField.INV_X_L, INV_Y); + } + } else { + ImGui.text(fEntry.getType().getIcon()); + } + ImGui.dummy(0, ImGui.getContentRegionAvailY() - TEXT_OFFSET); + ImGui.separator(); + if (toCut.containsKey(child)) { + ImGui.textDisabled(fEntry.name); + } else { + ImGui.text(fEntry.name); + } + } + ImGui.endChild(); + } + + private void hotkeys() { + if (!isSomethingHovered) { + return; + } + if (ImGui.isKeyPressed(ImGuiKey.Enter) && !selected.isEmpty()) { + openSelected(); + } + + if (ImGui.isKeyPressed(ImGuiKey.Delete) && !selected.isEmpty()) { + deleteSelected(); + } + + if (ImGui.isKeyDown(ImGuiKey.LeftCtrl) && ImGui.isKeyPressed(ImGuiKey.A)) { + selectAll(); + } + + if (ImGui.isKeyDown(ImGuiKey.LeftCtrl) && ImGui.isKeyPressed(ImGuiKey.X)) { + cutSelected(); + } + + if (ImGui.isKeyDown(ImGuiKey.LeftCtrl) && ImGui.isKeyPressed(ImGuiKey.V)) { + pasteSelected(); + } + } + + private void pasteSelected() { + for (var key : toCut.keySet()) { + var children = filesRepository.parentChildren.get(currentDirectory); + if (!children.contains(key)) { + var previousParentId = filesRepository.childParent.get(key); + filesRepository.parentChildren.get(previousParentId).remove(key); + + children.add(key); + filesRepository.childParent.put(key, currentDirectory); + } + } + toCut.clear(); + } + + private void openSelected() { + for (String id : selected.keySet()) { + openResource(filesRepository.entry.get(id)); + } + } + + private void cutSelected() { + toCut.clear(); + toCut.putAll(selected); + } + + private void selectAll() { + var children = filesRepository.parentChildren.get(currentDirectory); + for (var child : children) { + selected.put(child, true); + } + } + + private void deleteSelected() { + filesService.deleteSelected(selected.keySet()); + inspection = null; + } + + protected void onClick(FSEntry root) { + if (root.isHovered && ImGui.isMouseClicked(ImGuiMouseButton.Left)) { + if (!ImGui.isKeyDown(ImGuiKey.LeftCtrl)) { + selected.clear(); + } + if (selected.containsKey(root.getId()) && ImGui.isKeyDown(ImGuiKey.LeftCtrl)) { + selected.remove(root.getId()); + inspection = null; + } else { + selected.put(root.getId(), true); + inspection = root; + } + } + if (root.isHovered && ImGui.isMouseDoubleClicked(ImGuiMouseButton.Left)) { + openResource(root); + } + } + + protected void openResource(FSEntry root) { + if (root == null) { + return; + } + if (root.isDirectory()) { + currentDirectory = root.id; + selected.clear(); + } else { + switch (root.getType()) { + case SCENE -> { + var scene = (SceneImportData) sceneService.stream(importerService.getPathToFile(root.getId(), StreamableResourceType.SCENE), Collections.emptyMap(), Collections.emptyMap()); + requestProcessingService.addRequest(new LoadSceneRequest(worldRepository.entityMap.get(WorldRepository.ROOT_ID), scene)); + } + case MESH -> { + var request = new AddEntityRequest(List.of(ComponentType.MESH)); + requestProcessingService.addRequest(request); + + MeshComponent meshComponent = worldRepository.bagMeshComponent.get(request.getResponse().id()); + meshComponent.lod0 = root.getId(); + } + } + } + } +} diff --git a/editor/src/main/java/com/pine/panels/files/FileInspectorPanel.java b/src/main/java/com/pine/editor/panels/files/FileInspectorPanel.java similarity index 67% rename from editor/src/main/java/com/pine/panels/files/FileInspectorPanel.java rename to src/main/java/com/pine/editor/panels/files/FileInspectorPanel.java index 68a0c593..3b3f8bd5 100644 --- a/editor/src/main/java/com/pine/panels/files/FileInspectorPanel.java +++ b/src/main/java/com/pine/editor/panels/files/FileInspectorPanel.java @@ -1,18 +1,17 @@ -package com.pine.panels.files; +package com.pine.editor.panels.files; import com.pine.FSUtil; -import com.pine.core.AbstractView; -import com.pine.injection.PInject; -import com.pine.inspection.FieldDTO; -import com.pine.panels.component.FormPanel; -import com.pine.repository.FSEntry; -import com.pine.repository.streaming.AbstractResourceRef; -import com.pine.repository.streaming.StreamingRepository; -import com.pine.service.importer.ImporterService; -import com.pine.service.importer.metadata.AbstractResourceMetadata; -import com.pine.service.request.UpdateFieldRequest; +import com.pine.common.injection.PInject; +import com.pine.common.inspection.FieldDTO; +import com.pine.editor.core.AbstractView; +import com.pine.editor.panels.component.FormPanel; +import com.pine.editor.repository.FSEntry; +import com.pine.engine.repository.streaming.AbstractResourceRef; +import com.pine.engine.repository.streaming.StreamingRepository; +import com.pine.engine.service.importer.ImporterService; +import com.pine.engine.service.importer.metadata.AbstractResourceMetadata; +import com.pine.engine.service.request.UpdateFieldRequest; import imgui.ImGui; -import imgui.flag.ImGuiInputTextFlags; import imgui.type.ImString; public class FileInspectorPanel extends AbstractView { @@ -37,14 +36,16 @@ public void setInspection(FSEntry inspection) { currentMetadata = null; return; } - currentMetadata = (AbstractResourceMetadata) FSUtil.readBinary(importerService.getPathToMetadata(inspection.id, inspection.getType())); - if (currentMetadata != null) { - if (currentMetadata.getResourceType().isMutable()) { - dataForm.setInspection(importerService.readFile(currentMetadata)); - } else { - dataForm.setInspection(null); + if(!inspection.isDirectory) { + currentMetadata = (AbstractResourceMetadata) FSUtil.readBinary(importerService.getPathToMetadata(inspection.id, inspection.getType())); + if (currentMetadata != null) { + if (currentMetadata.getResourceType().isMutable()) { + dataForm.setInspection(importerService.readFile(currentMetadata)); + } else { + dataForm.setInspection(null); + } + metadataForm.setInspection(currentMetadata); } - metadataForm.setInspection(currentMetadata); } } this.inspection = inspection; @@ -55,8 +56,8 @@ public void setInspection(FSEntry inspection) { @Override public void onInitialize() { - appendChild(dataForm = new FormPanel(this::handleChange)); appendChild(metadataForm = new FormPanel(this::handleMetadataChange)); + appendChild(dataForm = new FormPanel(this::handleChange)); } private void handleChange(FieldDTO dto, Object object) { @@ -88,10 +89,11 @@ private void onChange(FieldDTO dto, Object object, String path, boolean dispose) public void render() { if (ImGui.beginChild(imguiId)) { if (inspection != null) { - ImGui.textDisabled(inspection.id); - if (ImGui.inputText("##name" + imguiId, inspectionName, ImGuiInputTextFlags.EnterReturnsTrue)) { + ImGui.text("Name"); + if (ImGui.inputText("##name" + imguiId, inspectionName)) { inspection.name = inspectionName.get(); } + ImGui.separator(); } super.render(); } diff --git a/editor/src/main/java/com/pine/panels/files/ContentBrowser.java b/src/main/java/com/pine/editor/panels/files/FilesPanel.java similarity index 82% rename from editor/src/main/java/com/pine/panels/files/ContentBrowser.java rename to src/main/java/com/pine/editor/panels/files/FilesPanel.java index 2a795ecd..81753c1c 100644 --- a/editor/src/main/java/com/pine/panels/files/ContentBrowser.java +++ b/src/main/java/com/pine/editor/panels/files/FilesPanel.java @@ -1,23 +1,23 @@ -package com.pine.panels.files; - -import com.pine.core.UIUtil; -import com.pine.core.dock.AbstractDockPanel; -import com.pine.injection.PInject; -import com.pine.messaging.MessageRepository; -import com.pine.messaging.MessageSeverity; -import com.pine.repository.FSEntry; -import com.pine.repository.FilesRepository; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.FilesService; -import com.pine.service.importer.ImporterService; -import com.pine.theme.Icons; +package com.pine.editor.panels.files; + +import com.pine.common.Icons; +import com.pine.common.injection.PInject; +import com.pine.common.messaging.MessageRepository; +import com.pine.common.messaging.MessageSeverity; +import com.pine.editor.core.UIUtil; +import com.pine.editor.core.dock.AbstractDockPanel; +import com.pine.editor.repository.FSEntry; +import com.pine.editor.repository.FilesRepository; +import com.pine.editor.service.FilesService; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.importer.ImporterService; import imgui.ImGui; import java.util.*; -import static com.pine.theme.Icons.ONLY_ICON_BUTTON_SIZE; +import static com.pine.common.Icons.ONLY_ICON_BUTTON_SIZE; -public class ContentBrowser extends AbstractDockPanel { +public class FilesPanel extends AbstractDockPanel { @PInject public ImporterService importerService; @PInject @@ -64,9 +64,9 @@ public void render() { fileInspector.setInspection(inspection); directoryPanel.selected = selected; directoryPanel.toCut = toCut; - directoryPanel.currentDirectory = currentDirectory; renderHeader(); + directoryPanel.currentDirectory = currentDirectory; directoryPanel.isWindowFocused = isWindowFocused; ImGui.columns(2, "##filesColumns" + imguiId); if (!isFirstRender) { @@ -77,8 +77,8 @@ public void render() { directoryPanel.render(); inspection = directoryPanel.inspection; if(!Objects.equals(currentDirectory, directoryPanel.currentDirectory)){ - updateDirectoryPath(); currentDirectory = directoryPanel.currentDirectory; + updateDirectoryPath(); } ImGui.nextColumn(); @@ -93,14 +93,16 @@ private void renderHeader() { String id = UUID.randomUUID().toString(); var d = new FSEntry("New Directory (" + id.substring(0, 4) + ")", id); filesRepository.childParent.put(id, currentDirectory); - filesRepository.parentChildren.get(id).add(id); filesRepository.parentChildren.put(id, new ArrayList<>()); + filesRepository.parentChildren.get(currentDirectory).add(id); filesRepository.entry.put(id, d); + filesService.serialize(); } if (!Objects.equals(currentDirectory, FilesRepository.ROOT_DIRECTORY_ID)) { ImGui.sameLine(); if (ImGui.button(Icons.arrow_upward + "##goUpDir", ONLY_ICON_BUTTON_SIZE, ONLY_ICON_BUTTON_SIZE)) { currentDirectory = filesRepository.childParent.get(currentDirectory); + updateDirectoryPath(); } } ImGui.sameLine(); diff --git a/editor/src/main/java/com/pine/panels/header/EditorHeaderPanel.java b/src/main/java/com/pine/editor/panels/header/EditorHeaderPanel.java similarity index 87% rename from editor/src/main/java/com/pine/panels/header/EditorHeaderPanel.java rename to src/main/java/com/pine/editor/panels/header/EditorHeaderPanel.java index d0a21a0a..b2985c50 100644 --- a/editor/src/main/java/com/pine/panels/header/EditorHeaderPanel.java +++ b/src/main/java/com/pine/editor/panels/header/EditorHeaderPanel.java @@ -1,18 +1,18 @@ -package com.pine.panels.header; - -import com.pine.core.AbstractView; -import com.pine.core.UIUtil; -import com.pine.injection.PInject; -import com.pine.repository.EditorRepository; -import com.pine.service.ProjectService; -import com.pine.theme.Icons; +package com.pine.editor.panels.header; + +import com.pine.common.Icons; +import com.pine.common.injection.PInject; +import com.pine.editor.core.AbstractView; +import com.pine.editor.core.UIUtil; +import com.pine.editor.repository.EditorRepository; +import com.pine.editor.service.ProjectService; import imgui.ImGui; import imgui.ImGuiIO; import imgui.flag.ImGuiInputTextFlags; import imgui.flag.ImGuiKey; import imgui.type.ImString; -import static com.pine.theme.Icons.ONLY_ICON_BUTTON_SIZE; +import static com.pine.common.Icons.ONLY_ICON_BUTTON_SIZE; public class EditorHeaderPanel extends AbstractView { @PInject diff --git a/src/main/java/com/pine/editor/panels/header/GlobalSettingsPanel.java b/src/main/java/com/pine/editor/panels/header/GlobalSettingsPanel.java new file mode 100644 index 00000000..68e529df --- /dev/null +++ b/src/main/java/com/pine/editor/panels/header/GlobalSettingsPanel.java @@ -0,0 +1,123 @@ +package com.pine.editor.panels.header; + +import com.pine.common.Icons; +import com.pine.common.injection.PInject; +import com.pine.editor.core.AbstractView; +import com.pine.editor.core.UIUtil; +import com.pine.editor.repository.EditorMode; +import com.pine.editor.repository.EditorRepository; +import com.pine.engine.component.ComponentType; +import com.pine.engine.repository.CameraRepository; +import com.pine.engine.repository.EngineRepository; +import com.pine.engine.repository.ShadingMode; +import com.pine.engine.service.rendering.RequestProcessingService; +import com.pine.engine.service.request.AddComponentRequest; +import com.pine.engine.service.request.AddEntityRequest; +import imgui.ImGui; +import imgui.type.ImInt; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import static com.pine.common.Icons.ONLY_ICON_BUTTON_SIZE; + +public class GlobalSettingsPanel extends AbstractView { + private static final String[] SHADING_MODE_OPTIONS = ShadingMode.getLabels(); + + private final float[] cameraSensitivity = new float[1]; + private final ImInt editorMode = new ImInt(0); + + @PInject + public EngineRepository engineRepository; + + @PInject + public EditorRepository editorRepository; + + @PInject + public CameraRepository cameraRepository; + + @PInject + public RequestProcessingService requestProcessingService; + + private final List types = new ArrayList<>(); + + @Override + public void onInitialize() { + types.add(Icons.add + " Add entity"); + types.addAll(ComponentType.getSoleTypes().stream().map(a -> a.getIcon() + a.getTitle()).toList()); + } + + @Override + public void render() { + editorMode.set(editorRepository.editorMode.index); + ImGui.setNextItemWidth(150); + if (ImGui.combo(imguiId, editorMode, EditorMode.getOptions())) { + editorRepository.editorMode = EditorMode.valueOfIndex(editorMode.get()); + } + + ImGui.sameLine(); + ImGui.setNextItemWidth(150); + if (ImGui.beginCombo(imguiId + "entities", types.getFirst())) { + for (int i = 1; i < types.size(); i++) { + String type = types.get(i); + if (ImGui.selectable(type)) { + ComponentType entityComponent = ComponentType.getSoleTypes().get(i - 1); + requestProcessingService.addRequest(new AddEntityRequest(List.of(entityComponent))); + } + } + ImGui.endCombo(); + } + + cameraMode(); + shadingMode(); + } + + + private void cameraMode() { + UIUtil.dynamicSpacing(575); + ImGui.text("Camera"); + ImGui.sameLine(); + if (ImGui.button(Icons.center_focus_strong + "##centerCamera", ONLY_ICON_BUTTON_SIZE, ONLY_ICON_BUTTON_SIZE)) { + cameraRepository.currentCamera.position.zero(); + cameraRepository.currentCamera.registerChange(); + } + + ImGui.sameLine(); + cameraSensitivity[0] = cameraRepository.movementSensitivity; + ImGui.setNextItemWidth(75); + if (ImGui.dragFloat("##speedCamera", cameraSensitivity, .1f, .1f)) { + cameraRepository.movementSensitivity = Math.max(0, cameraSensitivity[0]); + } + } + + private void shadingMode() { + UIUtil.dynamicSpacing(405); + + ImGui.text("Shading"); + + ImGui.sameLine(); + if (UIUtil.renderOption(Icons.grid_on + "##world", editorRepository.gridOverlayObjects, true, editorRepository.accent)) { + editorRepository.gridOverlayObjects = !editorRepository.gridOverlayObjects; + } + + ImGui.sameLine(); + if (UIUtil.renderOption(Icons.details + "Wireframe##wireframeShading", engineRepository.shadingMode == ShadingMode.WIREFRAME, false, editorRepository.accent)) { + engineRepository.shadingMode = ShadingMode.WIREFRAME; + editorRepository.shadingModelOption.set(ShadingMode.WIREFRAME.getIndex()); + } + + ImGui.sameLine(); + if (UIUtil.renderOption(Icons.palette + "Random##randomShading", engineRepository.shadingMode == ShadingMode.RANDOM, false, editorRepository.accent)) { + engineRepository.shadingMode = ShadingMode.RANDOM; + editorRepository.shadingModelOption.set(ShadingMode.RANDOM.getIndex()); + } + + ImGui.sameLine(); + ImGui.setNextItemWidth(150); + if (ImGui.combo("##shadingMode", editorRepository.shadingModelOption, SHADING_MODE_OPTIONS)) { + engineRepository.shadingMode = ShadingMode.values()[editorRepository.shadingModelOption.get()]; + } + } + +} diff --git a/editor/src/main/java/com/pine/panels/hierarchy/HierarchyHeaderPanel.java b/src/main/java/com/pine/editor/panels/hierarchy/HierarchyHeaderPanel.java similarity index 70% rename from editor/src/main/java/com/pine/panels/hierarchy/HierarchyHeaderPanel.java rename to src/main/java/com/pine/editor/panels/hierarchy/HierarchyHeaderPanel.java index 32c18832..32ccb891 100644 --- a/editor/src/main/java/com/pine/panels/hierarchy/HierarchyHeaderPanel.java +++ b/src/main/java/com/pine/editor/panels/hierarchy/HierarchyHeaderPanel.java @@ -1,20 +1,20 @@ -package com.pine.panels.hierarchy; - -import com.pine.core.AbstractView; -import com.pine.injection.PInject; -import com.pine.repository.EditorRepository; -import com.pine.service.rendering.RequestProcessingService; -import com.pine.service.request.AddEntityRequest; -import com.pine.theme.Icons; +package com.pine.editor.panels.hierarchy; + +import com.pine.common.Icons; +import com.pine.common.injection.PInject; +import com.pine.editor.core.AbstractView; +import com.pine.editor.repository.EditorRepository; +import com.pine.engine.service.rendering.RequestProcessingService; +import com.pine.engine.service.request.AddEntityRequest; import imgui.ImGui; import imgui.type.ImString; -import static com.pine.theme.Icons.ONLY_ICON_BUTTON_SIZE; +import static com.pine.common.Icons.ONLY_ICON_BUTTON_SIZE; public class HierarchyHeaderPanel extends AbstractView { private static final String FILTER_OFF_LABEL = Icons.filter_list_off + "##hierarchyFilter"; private static final String FILTER_ON_LABEL = Icons.filter_list + "##hierarchyFilter"; - private static final String ADD_LABEL = Icons.add + "##hierarchyAdd"; + private static final String ADD_LABEL = Icons.inventory_2 + "##hierarchyAdd"; @PInject public RequestProcessingService requestProcessingService; diff --git a/editor/src/main/java/com/pine/panels/hierarchy/HierarchyPanel.java b/src/main/java/com/pine/editor/panels/hierarchy/HierarchyPanel.java similarity index 80% rename from editor/src/main/java/com/pine/panels/hierarchy/HierarchyPanel.java rename to src/main/java/com/pine/editor/panels/hierarchy/HierarchyPanel.java index 728c2c0f..a5bd5828 100644 --- a/editor/src/main/java/com/pine/panels/hierarchy/HierarchyPanel.java +++ b/src/main/java/com/pine/editor/panels/hierarchy/HierarchyPanel.java @@ -1,13 +1,15 @@ -package com.pine.panels.hierarchy; - -import com.pine.component.AbstractComponent; -import com.pine.component.Entity; -import com.pine.injection.PInject; -import com.pine.panels.AbstractEntityViewPanel; -import com.pine.repository.WorldRepository; -import com.pine.service.ThemeService; -import com.pine.service.request.HierarchyRequest; -import com.pine.theme.Icons; +package com.pine.editor.panels.hierarchy; + +import com.pine.common.Icons; +import com.pine.common.injection.PInject; +import com.pine.editor.core.UIUtil; +import com.pine.editor.panels.AbstractEntityViewPanel; +import com.pine.editor.repository.EditorRepository; +import com.pine.editor.service.ThemeService; +import com.pine.engine.component.AbstractComponent; +import com.pine.engine.component.Entity; +import com.pine.engine.repository.WorldRepository; +import com.pine.engine.service.request.HierarchyRequest; import imgui.ImGui; import imgui.ImVec2; import imgui.ImVec4; @@ -19,7 +21,7 @@ import java.util.Map; import java.util.Objects; -import static com.pine.panels.console.ConsolePanel.TABLE_FLAGS; +import static com.pine.editor.panels.console.ConsolePanel.TABLE_FLAGS; public class HierarchyPanel extends AbstractEntityViewPanel { @@ -27,6 +29,7 @@ public class HierarchyPanel extends AbstractEntityViewPanel { private static final ImVec4 TRANSPARENT = new ImVec4(0, 0, 0, 0); private static final ImVec2 PADDING = new ImVec2(0, 0); + private final ImVec4 rowColor = new ImVec4(0, 0, 0, 1); private HierarchyHeaderPanel header; private Entity onDrag; private final ImString search = new ImString(); @@ -38,6 +41,9 @@ public class HierarchyPanel extends AbstractEntityViewPanel { @PInject public ThemeService theme; + @PInject + public EditorRepository editorRepository; + @Override public void onInitialize() { appendChild(header = new HierarchyHeaderPanel(search)); @@ -82,16 +88,29 @@ private boolean renderNode(String entityId) { boolean isSearchMatch = matchSearch(entity); ImGui.tableNextRow(); + if (stateRepository.selected.containsKey(entityId)) { + ImGui.tableSetBgColor(ImGuiTableBgTarget.RowBg0, editorRepository.accentU32); + ImGui.tableSetBgColor(ImGuiTableBgTarget.RowBg1, editorRepository.accentU32); + } ImGui.tableNextColumn(); int flags = getFlags(entity); boolean open; - if(world.culled.containsKey(entityId)) { + if (world.culled.containsKey(entityId) || world.hiddenEntities.containsKey(entityId)) { ImGui.pushStyleColor(ImGuiCol.Text, theme.textDisabled); - open = ImGui.treeNodeEx(getNodeLabel(entity, true), flags); + open = isOpen(entity, flags); ImGui.popStyleColor(); - }else{ - open = ImGui.treeNodeEx(getNodeLabel(entity, true), flags); + } else { + if (entity.isContainer()) { + rowColor.x = entity.color.x; + rowColor.y = entity.color.y; + rowColor.z = entity.color.z; + ImGui.pushStyleColor(ImGuiCol.Text, rowColor); + open = isOpen(entity, flags); + ImGui.popStyleColor(); + } else { + open = isOpen(entity, flags); + } } if (!Objects.equals(entity.id(), WorldRepository.ROOT_ID)) { @@ -109,14 +128,20 @@ private boolean renderNode(String entityId) { return isSearchMatch; } + private boolean isOpen(Entity entity, int flags) { + boolean open; + open = ImGui.treeNodeEx(getNodeLabel(entity, true), flags); + return open; + } + private @NotNull String getNodeLabel(Entity node, boolean addId) { - return (Objects.equals(WorldRepository.ROOT_ID, node.id()) ? Icons.inventory_2 : Icons.view_in_ar) + node.getTitle() + (addId ? ("##" + node.id() + imguiId) : ""); + return (node.isContainer() ? Icons.inventory_2 : Icons.view_in_ar) + node.name + (addId ? ("##" + node.id() + imguiId) : ""); } private boolean matchSearch(Entity node) { boolean isSearchMatch = false; if (isOnSearch) { - isSearchMatch = node.getTitle().contains(search.get()); + isSearchMatch = node.name.contains(search.get()); if (isSearchMatch) { searchMatch.put(node.id(), BYTE); } else { @@ -173,9 +198,6 @@ private void addComponent(AbstractComponent component) { private int getFlags(Entity node) { int flags = ImGuiTreeNodeFlags.SpanFullWidth; - if (stateRepository.selected.containsKey(node.id())) { - flags |= ImGuiTreeNodeFlags.Selected; - } if (isOnSearch) { flags |= ImGuiTreeNodeFlags.DefaultOpen; } diff --git a/src/main/java/com/pine/editor/panels/inspector/InspectorPanel.java b/src/main/java/com/pine/editor/panels/inspector/InspectorPanel.java new file mode 100644 index 00000000..fb90cc99 --- /dev/null +++ b/src/main/java/com/pine/editor/panels/inspector/InspectorPanel.java @@ -0,0 +1,107 @@ +package com.pine.editor.panels.inspector; + +import com.pine.common.Icons; +import com.pine.common.injection.PInject; +import com.pine.common.inspection.FieldDTO; +import com.pine.common.inspection.Inspectable; +import com.pine.editor.core.AbstractView; +import com.pine.editor.core.dock.AbstractDockPanel; +import com.pine.editor.panels.component.FormPanel; +import com.pine.editor.repository.EditorRepository; +import com.pine.editor.service.ThemeService; +import com.pine.engine.component.Entity; +import com.pine.engine.repository.WorldRepository; +import com.pine.engine.repository.terrain.TerrainRepository; +import com.pine.engine.service.rendering.RequestProcessingService; +import com.pine.engine.service.request.UpdateFieldRequest; +import com.pine.engine.service.world.WorldService; +import imgui.ImGui; +import imgui.flag.ImGuiCol; +import imgui.type.ImString; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class InspectorPanel extends AbstractDockPanel { + @PInject + public RequestProcessingService requestProcessingService; + @PInject + public EditorRepository editorRepository; + @PInject + public WorldService worldService; + @PInject + public WorldRepository world; + @PInject + public TerrainRepository terrainRepository; + @PInject + public List repositories; + + private String selectedId; + private final ImString fieldSearch = new ImString(); + private final List dynamicForms = new ArrayList<>(); + private final List staticForms = new ArrayList<>(); + + @Override + public void onInitialize() { + for (Inspectable repo : repositories) { + var form = appendChild(new FormPanel(this::handleChange)); + form.setInspection(repo); + staticForms.add(form); + form.setCompactMode(true); + } + } + + private void handleChange(FieldDTO dto, Object newValue) { + requestProcessingService.addRequest(new UpdateFieldRequest(dto, newValue)); + } + + @Override + public void render() { + tick(); + ImGui.text(Icons.search); + ImGui.sameLine(); + ImGui.inputText(imguiId + "search", fieldSearch); + String search = fieldSearch.get().toLowerCase(); + if (ImGui.beginChild(imguiId + "cont")) { + for (var form : dynamicForms) { + form.setSearch(search); + form.render(); + } + if (!dynamicForms.isEmpty()) { + ImGui.separator(); + } + for (var form : staticForms) { + form.setSearch(search); + form.render(); + } + } + ImGui.endChild(); + } + + private void tick() { + if (!Objects.equals(editorRepository.mainSelection, selectedId)) { + dynamicForms.clear(); + selectedId = editorRepository.mainSelection; + if (selectedId != null) { + var selected = world.entityMap.get(selectedId); + if (selected != null) { + addDynamicInspection(selected); + world.runByComponent(this::addDynamicInspection, selectedId); + } + } + + if (selectedId == null && !dynamicForms.isEmpty()) { + dynamicForms.clear(); + } + } + } + + private void addDynamicInspection(Inspectable comp) { + var form = appendChild(new FormPanel(this::handleChange)); + form.setInspection(comp); + removeChild(form); + form.setCompactMode(true); + dynamicForms.add(form); + } +} diff --git a/editor/src/main/java/com/pine/panels/metrics/MetricsPanel.java b/src/main/java/com/pine/editor/panels/metrics/MetricsPanel.java similarity index 89% rename from editor/src/main/java/com/pine/panels/metrics/MetricsPanel.java rename to src/main/java/com/pine/editor/panels/metrics/MetricsPanel.java index e21b55e7..2c254196 100644 --- a/editor/src/main/java/com/pine/panels/metrics/MetricsPanel.java +++ b/src/main/java/com/pine/editor/panels/metrics/MetricsPanel.java @@ -1,14 +1,14 @@ -package com.pine.panels.metrics; +package com.pine.editor.panels.metrics; -import com.pine.MetricCollector; -import com.pine.core.dock.AbstractDockPanel; +import com.pine.common.MetricCollector; +import com.pine.editor.core.dock.AbstractDockPanel; import imgui.ImGui; import imgui.ImVec4; import imgui.flag.ImGuiTableColumnFlags; import java.util.Map; -import static com.pine.panels.console.ConsolePanel.TABLE_FLAGS; +import static com.pine.editor.panels.console.ConsolePanel.TABLE_FLAGS; public class MetricsPanel extends AbstractDockPanel { diff --git a/editor/src/main/java/com/pine/panels/resources/ResourcesPanel.java b/src/main/java/com/pine/editor/panels/resources/ResourcesPanel.java similarity index 70% rename from editor/src/main/java/com/pine/panels/resources/ResourcesPanel.java rename to src/main/java/com/pine/editor/panels/resources/ResourcesPanel.java index 1bc8176d..fced7d74 100644 --- a/editor/src/main/java/com/pine/panels/resources/ResourcesPanel.java +++ b/src/main/java/com/pine/editor/panels/resources/ResourcesPanel.java @@ -1,22 +1,23 @@ -package com.pine.panels.resources; - -import com.pine.component.MeshComponent; -import com.pine.core.dock.AbstractDockPanel; -import com.pine.injection.PInject; -import com.pine.repository.EngineRepository; -import com.pine.repository.FoliageInstance; -import com.pine.repository.terrain.TerrainRepository; -import com.pine.repository.WorldRepository; -import com.pine.repository.streaming.AbstractResourceRef; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.repository.streaming.StreamingRepository; -import com.pine.service.grid.WorldService; +package com.pine.editor.panels.resources; + +import com.pine.common.injection.PInject; +import com.pine.editor.core.dock.AbstractDockPanel; +import com.pine.engine.component.MeshComponent; +import com.pine.engine.repository.WorldRepository; +import com.pine.engine.repository.streaming.AbstractResourceRef; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.streaming.StreamingRepository; +import com.pine.engine.repository.terrain.FoliageInstance; +import com.pine.engine.repository.terrain.TerrainRepository; +import com.pine.engine.service.streaming.StreamingService; +import com.pine.engine.service.streaming.ref.MeshResourceRef; +import com.pine.engine.service.world.WorldService; import imgui.ImGui; import imgui.flag.ImGuiTableColumnFlags; import java.util.Collection; -import static com.pine.panels.console.ConsolePanel.TABLE_FLAGS; +import static com.pine.editor.panels.console.ConsolePanel.TABLE_FLAGS; public class ResourcesPanel extends AbstractDockPanel { @@ -25,7 +26,7 @@ public class ResourcesPanel extends AbstractDockPanel { public WorldService worldService; @PInject - public EngineRepository engineRepository; + public StreamingService streamingService; @PInject public TerrainRepository terrainRepository; @@ -39,6 +40,7 @@ public class ResourcesPanel extends AbstractDockPanel { private int totalTriangles = 0; private int totalTerrainTiles = 0; private int totalTerrainTriangles = 0; + private int totalDrawCalls = 0; @Override public void render() { @@ -47,21 +49,16 @@ public void render() { ImGui.tableSetupColumn("Quantity", ImGuiTableColumnFlags.WidthFixed, 120f); ImGui.tableHeadersRow(); + computeDrawCallQuantity(); computeTerrainData(); - render("Individual draw calls", getDrawCallQuantity()); + render("Individual draw calls", totalDrawCalls); render("Terrain tiles visible", totalTerrainTiles); render("Terrain triangles rendered", totalTerrainTriangles); - int total = 0; - for (FoliageInstance f : terrainRepository.foliage.values()) { - total += f.count; - } - render("Foliage instances", total); - - render("Triangles being rendered", getTotalTriangleCount()); + render("Triangles being rendered", totalTriangles + totalTerrainTiles); render("Textures", getTotalTextureCount()); @@ -105,13 +102,8 @@ public int getTotalTextureCount() { return total; } - public int getTotalTriangleCount() { - // TODO - INCLUDE FOLIAGE - return totalTriangles; - } - - public int getDrawCallQuantity() { - int totalDrawCalls = totalTriangles = 0; + public void computeDrawCallQuantity() { + totalDrawCalls = totalTriangles = 0; for (var tile : worldService.getLoadedTiles()) { if (tile != null) { @@ -125,7 +117,6 @@ public int getDrawCallQuantity() { } } - return totalDrawCalls; } private void render(String Resources_to_be_streamed_in, int schedule) { diff --git a/editor/src/main/java/com/pine/panels/viewport/AbstractViewportPanel.java b/src/main/java/com/pine/editor/panels/viewport/AbstractViewportPanel.java similarity index 74% rename from editor/src/main/java/com/pine/panels/viewport/AbstractViewportPanel.java rename to src/main/java/com/pine/editor/panels/viewport/AbstractViewportPanel.java index 74c46f9c..919a6780 100644 --- a/editor/src/main/java/com/pine/panels/viewport/AbstractViewportPanel.java +++ b/src/main/java/com/pine/editor/panels/viewport/AbstractViewportPanel.java @@ -1,14 +1,16 @@ -package com.pine.panels.viewport; - -import com.pine.Engine; -import com.pine.injection.PInject; -import com.pine.panels.AbstractEntityViewPanel; -import com.pine.repository.CameraRepository; -import com.pine.repository.EditorRepository; -import com.pine.repository.RuntimeRepository; -import com.pine.service.camera.Camera; -import com.pine.service.camera.CameraMovementService; -import com.pine.service.resource.fbo.FrameBufferObject; +package com.pine.editor.panels.viewport; + +import com.pine.common.injection.PInject; +import com.pine.editor.panels.AbstractEntityViewPanel; +import com.pine.editor.repository.EditorRepository; +import com.pine.engine.Engine; +import com.pine.engine.repository.CameraRepository; +import com.pine.engine.repository.RuntimeRepository; +import com.pine.engine.service.camera.Camera; +import com.pine.engine.service.camera.CameraMovementService; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.fbo.FBOCreationData; +import com.pine.engine.service.resource.fbo.FBOService; import imgui.ImGui; import imgui.ImGuiIO; import imgui.ImVec2; @@ -16,9 +18,7 @@ import imgui.flag.ImGuiKey; import imgui.flag.ImGuiMouseButton; -import static com.pine.core.dock.DockSpacePanel.FRAME_SIZE; -import static com.pine.panels.viewport.ViewportPanel.INV_X; -import static com.pine.panels.viewport.ViewportPanel.INV_Y; +import static com.pine.editor.core.dock.DockSpacePanel.FRAME_SIZE; public abstract class AbstractViewportPanel extends AbstractEntityViewPanel { @PInject @@ -36,20 +36,27 @@ public abstract class AbstractViewportPanel extends AbstractEntityViewPanel { @PInject public CameraMovementService cameraMovementService; - private FrameBufferObject fbo; + @PInject + public FBOService fboService; + + protected FBO fbo; protected final ImVec2 sizeVec = new ImVec2(); private boolean isFirstMovement; protected ImGuiIO io; @Override public void onInitialize() { - this.fbo = new FrameBufferObject(engine.runtimeRepository.getDisplayW(), engine.runtimeRepository.getDisplayH()).addSampler(); + this.fbo = fboService.create(new FBOCreationData(engine.runtimeRepository.getDisplayW(), engine.runtimeRepository.getDisplayH(), false).addSampler("Viewport")); io = ImGui.getIO(); } final protected void renderFrame() { engine.render(); - ImGui.image(engine.getTargetFBO().getMainSampler(), sizeVec, INV_Y, INV_X); + ImGui.image(getSampler(), sizeVec, ViewportPanel.INV_Y, ViewportPanel.INV_X); + } + + protected int getSampler() { + return engine.getTargetFBO().getMainSampler(); } final protected void updateCamera() { diff --git a/editor/src/main/java/com/pine/panels/viewport/CameraPositionPanel.java b/src/main/java/com/pine/editor/panels/viewport/CameraPositionPanel.java similarity index 51% rename from editor/src/main/java/com/pine/panels/viewport/CameraPositionPanel.java rename to src/main/java/com/pine/editor/panels/viewport/CameraPositionPanel.java index 03afb5f4..90cff03d 100644 --- a/editor/src/main/java/com/pine/panels/viewport/CameraPositionPanel.java +++ b/src/main/java/com/pine/editor/panels/viewport/CameraPositionPanel.java @@ -1,22 +1,23 @@ -package com.pine.panels.viewport; +package com.pine.editor.panels.viewport; -import com.pine.core.AbstractView; -import com.pine.core.UIUtil; -import com.pine.injection.PInject; -import com.pine.repository.CameraRepository; -import com.pine.repository.WorldRepository; -import com.pine.service.grid.WorldService; +import com.pine.common.injection.PInject; +import com.pine.editor.core.AbstractView; +import com.pine.editor.core.UIUtil; +import com.pine.engine.repository.CameraRepository; +import com.pine.engine.service.world.WorldService; import imgui.ImGui; import imgui.ImVec4; +import imgui.flag.ImGuiStyleVar; import org.joml.Vector3f; -import static com.pine.core.UIUtil.FIXED_WINDOW_FLAGS; -import static com.pine.core.UIUtil.OPEN; +import static com.pine.editor.core.UIUtil.FIXED_WINDOW_FLAGS; +import static com.pine.editor.core.UIUtil.OPEN; public class CameraPositionPanel extends AbstractView { private static final ImVec4 RED = new ImVec4(1, 0, 0, 1); private static final ImVec4 GREEN = new ImVec4(0, 1, 0, 1); private static final ImVec4 BLUE = new ImVec4(0, .5f, 1, 1); + private static final float TO_DEG = (float) (180f / Math.PI); @PInject public CameraRepository cameraRepository; @@ -26,8 +27,10 @@ public class CameraPositionPanel extends AbstractView { @Override public void render() { - ImGui.setNextWindowPos(ImGui.getWindowPosX() + 8, ImGui.getWindowPosY() + ImGui.getWindowSizeY() - 25); - ImGui.setNextWindowSize(ImGui.getWindowSizeX() - 16, 16); + ImGui.setNextWindowPos(ImGui.getWindowPosX(), ImGui.getWindowPosY() + ImGui.getWindowSizeY() - 25); + ImGui.setNextWindowSize(ImGui.getWindowSizeX(), 16); + ImGui.pushStyleVar(ImGuiStyleVar.WindowPadding, UIUtil.DEFAULT_PADDING); + ImGui.setNextWindowBgAlpha(.4f); if (ImGui.begin(imguiId + "cameraPos", OPEN, FIXED_WINDOW_FLAGS)) { Vector3f positionCamera = cameraRepository.currentCamera.position; ImGui.text("Current tile: " + worldService.getCurrentTile().getX() + " " + worldService.getCurrentTile().getZ()); @@ -37,7 +40,13 @@ public void render() { ImGui.textColored(GREEN, "Y: " + (int) positionCamera.y); ImGui.sameLine(); ImGui.textColored(BLUE, "Z: " + (int) positionCamera.z); + ImGui.sameLine(); + + ImGui.text("Yaw: " + (int) (cameraRepository.currentCamera.yaw * TO_DEG)); + ImGui.sameLine(); + ImGui.text("Pitch: " + (int) (cameraRepository.currentCamera.pitch * TO_DEG)); } + ImGui.popStyleVar(); ImGui.end(); } } diff --git a/editor/src/main/java/com/pine/panels/viewport/FullScreenViewportPanel.java b/src/main/java/com/pine/editor/panels/viewport/FullScreenViewportPanel.java similarity index 57% rename from editor/src/main/java/com/pine/panels/viewport/FullScreenViewportPanel.java rename to src/main/java/com/pine/editor/panels/viewport/FullScreenViewportPanel.java index b9d9f687..cd4f6165 100644 --- a/editor/src/main/java/com/pine/panels/viewport/FullScreenViewportPanel.java +++ b/src/main/java/com/pine/editor/panels/viewport/FullScreenViewportPanel.java @@ -1,24 +1,13 @@ -package com.pine.panels.viewport; +package com.pine.editor.panels.viewport; -import com.pine.Engine; -import com.pine.core.AbstractView; -import com.pine.injection.PInject; -import com.pine.repository.CameraRepository; -import com.pine.repository.EditorRepository; -import com.pine.repository.RuntimeRepository; -import com.pine.service.camera.CameraMovementService; -import com.pine.service.camera.Camera; -import com.pine.service.resource.fbo.FrameBufferObject; +import com.pine.common.injection.PInject; +import com.pine.editor.repository.EditorRepository; import imgui.ImGui; -import imgui.ImGuiIO; import imgui.ImVec2; -import imgui.extension.imguizmo.ImGuizmo; -import imgui.flag.ImGuiKey; -import imgui.flag.ImGuiMouseButton; import imgui.flag.ImGuiStyleVar; -import static com.pine.core.AbstractWindow.FLAGS; -import static com.pine.core.UIUtil.OPEN; +import static com.pine.editor.core.AbstractWindow.FLAGS; +import static com.pine.editor.core.UIUtil.OPEN; public class FullScreenViewportPanel extends AbstractViewportPanel { private static final ImVec2 PADDING_NONE = new ImVec2(0, 0); diff --git a/editor/src/main/java/com/pine/panels/viewport/GizmoPanel.java b/src/main/java/com/pine/editor/panels/viewport/GizmoPanel.java similarity index 92% rename from editor/src/main/java/com/pine/panels/viewport/GizmoPanel.java rename to src/main/java/com/pine/editor/panels/viewport/GizmoPanel.java index f16e3cb4..67dc5c36 100644 --- a/editor/src/main/java/com/pine/panels/viewport/GizmoPanel.java +++ b/src/main/java/com/pine/editor/panels/viewport/GizmoPanel.java @@ -1,11 +1,11 @@ -package com.pine.panels.viewport; - -import com.pine.component.TransformationComponent; -import com.pine.core.AbstractView; -import com.pine.injection.PInject; -import com.pine.repository.CameraRepository; -import com.pine.repository.EditorRepository; -import com.pine.service.SelectionService; +package com.pine.editor.panels.viewport; + +import com.pine.common.injection.PInject; +import com.pine.editor.core.AbstractView; +import com.pine.editor.repository.EditorRepository; +import com.pine.editor.service.SelectionService; +import com.pine.engine.component.TransformationComponent; +import com.pine.engine.repository.CameraRepository; import imgui.ImVec2; import imgui.extension.imguizmo.ImGuizmo; import imgui.extension.imguizmo.flag.Operation; diff --git a/editor/src/main/java/com/pine/panels/viewport/ViewportPanel.java b/src/main/java/com/pine/editor/panels/viewport/ViewportPanel.java similarity index 69% rename from editor/src/main/java/com/pine/panels/viewport/ViewportPanel.java rename to src/main/java/com/pine/editor/panels/viewport/ViewportPanel.java index ce54bcea..cc949c37 100644 --- a/editor/src/main/java/com/pine/panels/viewport/ViewportPanel.java +++ b/src/main/java/com/pine/editor/panels/viewport/ViewportPanel.java @@ -1,28 +1,17 @@ -package com.pine.panels.viewport; +package com.pine.editor.panels.viewport; -import com.pine.Engine; -import com.pine.core.AbstractView; -import com.pine.injection.PInject; -import com.pine.panels.AbstractEntityViewPanel; -import com.pine.panels.viewport.header.ViewportHeaderPanel; -import com.pine.repository.CameraRepository; -import com.pine.repository.EditorMode; -import com.pine.repository.EditorRepository; -import com.pine.repository.RuntimeRepository; -import com.pine.service.ViewportPickingService; -import com.pine.service.camera.Camera; -import com.pine.service.camera.CameraMovementService; -import com.pine.service.resource.fbo.FrameBufferObject; +import com.pine.common.injection.PInject; +import com.pine.editor.core.AbstractView; +import com.pine.editor.panels.viewport.header.ViewportHeaderPanel; +import com.pine.editor.repository.EditorMode; +import com.pine.editor.repository.EditorRepository; +import com.pine.editor.service.ViewportPickingService; import imgui.ImGui; -import imgui.ImGuiIO; import imgui.ImVec2; -import imgui.extension.imguizmo.ImGuizmo; import imgui.extension.imguizmo.flag.Operation; import imgui.flag.ImGuiKey; import imgui.flag.ImGuiMouseButton; -import static com.pine.core.dock.DockSpacePanel.FRAME_SIZE; - public class ViewportPanel extends AbstractViewportPanel { public static final ImVec2 INV_X = new ImVec2(1, 0); @@ -34,7 +23,7 @@ public class ViewportPanel extends AbstractViewportPanel { @PInject public ViewportPickingService viewportPickingService; - private AbstractView headerPanel; + private ViewportHeaderPanel headerPanel; private AbstractView cameraPanel; private GizmoPanel gizmoPanel; @@ -52,6 +41,9 @@ public void render() { hotKeys(); tick(); + if(headerPanel.getViewBuffer() == -1){ + headerPanel.setViewBuffer(fbo.getMainSampler()); + } renderFrame(); if (editorRepository.editorMode == EditorMode.TRANSFORM) { @@ -61,6 +53,11 @@ public void render() { cameraPanel.render(); } + @Override + protected int getSampler() { + return headerPanel.getViewBuffer(); + } + @Override protected void hotKeysInternal() { if (ImGui.isKeyPressed(ImGuiKey.T)) diff --git a/src/main/java/com/pine/editor/panels/viewport/header/AbstractViewportSettingsPanel.java b/src/main/java/com/pine/editor/panels/viewport/header/AbstractViewportSettingsPanel.java new file mode 100644 index 00000000..dd26124d --- /dev/null +++ b/src/main/java/com/pine/editor/panels/viewport/header/AbstractViewportSettingsPanel.java @@ -0,0 +1,19 @@ +package com.pine.editor.panels.viewport.header; + +import com.pine.common.injection.PInject; +import com.pine.editor.core.AbstractView; +import com.pine.editor.repository.EditorRepository; +import com.pine.engine.service.streaming.StreamingService; + +public class AbstractViewportSettingsPanel extends AbstractView { + + @PInject + public EditorRepository editorRepository; + + @PInject + public StreamingService streamingService; + + public void renderOutside() { + + } +} diff --git a/editor/src/main/java/com/pine/panels/viewport/header/GizmoSettingsPanel.java b/src/main/java/com/pine/editor/panels/viewport/header/GizmoSettingsPanel.java similarity index 97% rename from editor/src/main/java/com/pine/panels/viewport/header/GizmoSettingsPanel.java rename to src/main/java/com/pine/editor/panels/viewport/header/GizmoSettingsPanel.java index e380c3e0..f85fd281 100644 --- a/editor/src/main/java/com/pine/panels/viewport/header/GizmoSettingsPanel.java +++ b/src/main/java/com/pine/editor/panels/viewport/header/GizmoSettingsPanel.java @@ -1,7 +1,7 @@ -package com.pine.panels.viewport.header; +package com.pine.editor.panels.viewport.header; -import com.pine.core.UIUtil; -import com.pine.theme.Icons; +import com.pine.common.Icons; +import com.pine.editor.core.UIUtil; import imgui.ImGui; import imgui.ImVec2; import imgui.extension.imguizmo.flag.Mode; diff --git a/editor/src/main/java/com/pine/panels/viewport/header/PaintingSettingsPanel.java b/src/main/java/com/pine/editor/panels/viewport/header/PaintingSettingsPanel.java similarity index 61% rename from editor/src/main/java/com/pine/panels/viewport/header/PaintingSettingsPanel.java rename to src/main/java/com/pine/editor/panels/viewport/header/PaintingSettingsPanel.java index eec4cc2d..7a283ff2 100644 --- a/editor/src/main/java/com/pine/panels/viewport/header/PaintingSettingsPanel.java +++ b/src/main/java/com/pine/editor/panels/viewport/header/PaintingSettingsPanel.java @@ -1,15 +1,18 @@ -package com.pine.panels.viewport.header; +package com.pine.editor.panels.viewport.header; -import com.pine.core.UIUtil; -import com.pine.injection.PInject; -import com.pine.repository.BrushMode; -import com.pine.repository.EditorMode; -import com.pine.repository.terrain.TerrainRepository; -import com.pine.repository.core.CoreBufferRepository; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.streaming.ref.TextureResourceRef; +import com.pine.common.injection.PInject; +import com.pine.editor.core.UIUtil; +import com.pine.editor.repository.BrushMode; +import com.pine.editor.repository.EditorMode; +import com.pine.engine.repository.core.CoreBufferRepository; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.terrain.MaterialLayer; +import com.pine.engine.repository.terrain.MaterialLayers; +import com.pine.engine.repository.terrain.TerrainRepository; +import com.pine.engine.service.streaming.ref.TextureResourceRef; import imgui.ImGui; import imgui.ImVec2; +import imgui.flag.ImGuiWindowFlags; public class PaintingSettingsPanel extends AbstractViewportSettingsPanel { private final float[] brushRadius = new float[]{1}; @@ -47,6 +50,23 @@ public void render() { if (ImGui.dragFloat("Brush density", brushDensity, .001f, 0, 1)) { editorRepository.brushDensity = brushDensity[0]; } + + if (editorRepository.editorMode == EditorMode.MATERIAL) { + UIUtil.spacing(); + ImGui.text("Selected layer"); + ImGui.sameLine(); + ImGui.setNextItemWidth(150); + var selected = terrainRepository.materialLayers.getLayer(editorRepository.selectedMaterialLayer); + if (ImGui.beginCombo(imguiId + "materialLayers", selected.name)) { + for (int i = 0; i < MaterialLayers.MAX_LAYERS; i++) { + MaterialLayer type = terrainRepository.materialLayers.getLayer(i); + if (ImGui.selectable(type.name)) { + editorRepository.selectedMaterialLayer = i; + } + } + ImGui.endCombo(); + } + } } @Override @@ -58,7 +78,7 @@ public void renderOutside() { float maskSize = ImGui.getWindowSizeX() * .15f; ImGui.setNextWindowSize(maskSize, maskSize); ImGui.setNextWindowPos(ImGui.getWindowPosX() + ImGui.getWindowSizeX() - maskSize, ImGui.getWindowPosY() + ImGui.getWindowSizeY() - maskSize); - if (ImGui.begin(imguiId, UIUtil.OPEN, UIUtil.FIXED_WINDOW_FLAGS)) { + if (ImGui.begin(imguiId, UIUtil.OPEN, ImGuiWindowFlags.NoResize | ImGuiWindowFlags.NoTitleBar | ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoCollapse)) { maskRes.x = ImGui.getWindowSizeX(); maskRes.y = ImGui.getWindowSizeX(); ImGui.image(targetTexture.texture, maskRes); @@ -73,8 +93,8 @@ private String getTextureId() { case TERRAIN -> { return terrainRepository.heightMapTexture; } - case FOLIAGE -> { - return terrainRepository.foliageMask; + case MATERIAL -> { + return terrainRepository.materialMask; } } return null; diff --git a/src/main/java/com/pine/editor/panels/viewport/header/ViewportHeaderPanel.java b/src/main/java/com/pine/editor/panels/viewport/header/ViewportHeaderPanel.java new file mode 100644 index 00000000..b1e4919e --- /dev/null +++ b/src/main/java/com/pine/editor/panels/viewport/header/ViewportHeaderPanel.java @@ -0,0 +1,104 @@ +package com.pine.editor.panels.viewport.header; + +import com.pine.common.injection.PInject; +import com.pine.editor.core.AbstractView; +import com.pine.editor.core.UIUtil; +import com.pine.editor.repository.EditorMode; +import com.pine.editor.repository.EditorRepository; +import com.pine.engine.service.resource.fbo.FBOService; +import com.pine.engine.service.resource.fbo.FBOTextureData; +import imgui.ImGui; +import imgui.ImVec2; +import imgui.flag.ImGuiStyleVar; +import imgui.flag.ImGuiWindowFlags; +import imgui.type.ImInt; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import static com.pine.editor.core.dock.DockSpacePanel.FRAME_SIZE; + +public class ViewportHeaderPanel extends AbstractView { + private static final int FLAGS = ImGuiWindowFlags.NoResize | ImGuiWindowFlags.NoTitleBar | ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoCollapse; + private static final ImVec2 PADDING = new ImVec2(4, 4); + private static final float HEIGHT = 35; + + @PInject + public EditorRepository editorRepository; + + @PInject + public FBOService fboService; + + private AbstractViewportSettingsPanel paintGizmo; + private AbstractViewportSettingsPanel gizmo; + private final ImInt bufferVisualization = new ImInt(0); + private String[] samplerNames; + private int[] samplerIds; + private int viewBuffer = -1; + private int defaultBuffer; + private int prevSize = -1; + + + public int getViewBuffer() { + return viewBuffer; + } + + public void setViewBuffer(int viewBuffer) { + this.viewBuffer = viewBuffer; + this.defaultBuffer = viewBuffer; + bufferVisualization.set(0); + } + + @Override + public void onInitialize() { + appendChild(gizmo = new GizmoSettingsPanel()); + appendChild(paintGizmo = new PaintingSettingsPanel()); + } + + @Override + public void render() { + AbstractViewportSettingsPanel currentPanel; + if (editorRepository.editorMode == EditorMode.TRANSFORM) { + currentPanel = gizmo; + } else { + currentPanel = paintGizmo; + } + ImGui.setNextWindowPos(ImGui.getWindowPosX(), ImGui.getWindowPosY() + FRAME_SIZE); + ImGui.setNextWindowSize(ImGui.getWindowSizeX(), HEIGHT); + ImGui.setNextWindowBgAlpha(.4f); + ImGui.pushStyleVar(ImGuiStyleVar.WindowPadding, PADDING); + ImGui.begin(imguiId, UIUtil.OPEN, FLAGS); + ImGui.popStyleVar(); + currentPanel.render(); + + UIUtil.dynamicSpacing(154); + ImGui.setNextItemWidth(150); + if(prevSize != fboService.data.size()){ + List samplers = new ArrayList<>(); + for (var fbo : fboService.data.values()) { + samplers.addAll(fbo.getSamplers()); + } + samplerNames = new String[samplers.size() + 1]; + samplerNames[0] = "Default"; + samplerIds = new int[samplers.size()]; + for (int i = 0; i < samplers.size(); i++) { + var sampler = samplers.get(i); + samplerNames[i + 1] = sampler.name(); + samplerIds[i] = sampler.id(); + } + prevSize = fboService.data.size(); + } + if (ImGui.combo(imguiId, bufferVisualization, samplerNames)) { + if (bufferVisualization.get() == 0) { + viewBuffer = defaultBuffer; + } else { + viewBuffer = samplerIds[bufferVisualization.get() - 1]; + } + } + ImGui.end(); + + currentPanel.renderOutside(); + } + +} diff --git a/editor/src/main/java/com/pine/repository/BrushMode.java b/src/main/java/com/pine/editor/repository/BrushMode.java similarity index 74% rename from editor/src/main/java/com/pine/repository/BrushMode.java rename to src/main/java/com/pine/editor/repository/BrushMode.java index 89d5d603..135cdfea 100644 --- a/editor/src/main/java/com/pine/repository/BrushMode.java +++ b/src/main/java/com/pine/editor/repository/BrushMode.java @@ -1,6 +1,6 @@ -package com.pine.repository; +package com.pine.editor.repository; -import com.pine.theme.Icons; +import com.pine.common.Icons; public enum BrushMode { ADD(Icons.add + "Add"), diff --git a/editor/src/main/java/com/pine/repository/EditorMode.java b/src/main/java/com/pine/editor/repository/EditorMode.java similarity index 87% rename from editor/src/main/java/com/pine/repository/EditorMode.java rename to src/main/java/com/pine/editor/repository/EditorMode.java index 31534e02..8d93695e 100644 --- a/editor/src/main/java/com/pine/repository/EditorMode.java +++ b/src/main/java/com/pine/editor/repository/EditorMode.java @@ -1,12 +1,11 @@ -package com.pine.repository; +package com.pine.editor.repository; -import com.pine.theme.Icons; +import com.pine.common.Icons; public enum EditorMode { TRANSFORM("Transform", Icons.transform, 0), TERRAIN("Terrain", Icons.terrain, 1), - FOLIAGE("Foliage", Icons.forest, 2), - MATERIAL("Material", Icons.format_paint, 3); + MATERIAL("Material", Icons.format_paint, 2); private static String[] options; public final String label; diff --git a/editor/src/main/java/com/pine/repository/EditorRepository.java b/src/main/java/com/pine/editor/repository/EditorRepository.java similarity index 84% rename from editor/src/main/java/com/pine/repository/EditorRepository.java rename to src/main/java/com/pine/editor/repository/EditorRepository.java index c9fbd412..11aad32d 100644 --- a/editor/src/main/java/com/pine/repository/EditorRepository.java +++ b/src/main/java/com/pine/editor/repository/EditorRepository.java @@ -1,14 +1,15 @@ -package com.pine.repository; - -import com.pine.SerializableRepository; -import com.pine.component.TransformationComponent; -import com.pine.injection.PBean; -import com.pine.inspection.Color; -import com.pine.inspection.Inspectable; -import com.pine.inspection.InspectableField; -import com.pine.service.camera.Camera; -import com.pine.theme.Icons; -import com.pine.tools.types.ExecutionEnvironment; +package com.pine.editor.repository; + +import com.pine.common.Icons; +import com.pine.common.SerializableRepository; +import com.pine.common.injection.PBean; +import com.pine.common.inspection.Color; +import com.pine.common.inspection.Inspectable; +import com.pine.common.inspection.InspectableField; +import com.pine.engine.component.TransformationComponent; +import com.pine.engine.repository.ShadingMode; +import com.pine.engine.service.camera.Camera; +import com.pine.engine.type.ExecutionEnvironment; import imgui.ImVec4; import imgui.extension.imguizmo.flag.Mode; import imgui.extension.imguizmo.flag.Operation; @@ -73,7 +74,7 @@ public class EditorRepository extends Inspectable implements SerializableReposit public boolean gizmoUseSnapRotate; public boolean gizmoUseSnapScale; - public final ImInt shadingModelOption = new ImInt(DebugShadingModel.LIT.getIndex()); + public final ImInt shadingModelOption = new ImInt(ShadingMode.LIT.getIndex()); public boolean showOnlyEntitiesHierarchy = false; public Map pinnedEntities = new HashMap<>(); @@ -86,7 +87,7 @@ public class EditorRepository extends Inspectable implements SerializableReposit public BrushMode brushMode = BrushMode.ADD; public float brushRadius = 10; public float brushDensity = .5f; - public String foliageForPainting; + public int selectedMaterialLayer = 0; public boolean fullScreen; public boolean showPaintingMask = false; diff --git a/editor/src/main/java/com/pine/repository/FSEntry.java b/src/main/java/com/pine/editor/repository/FSEntry.java similarity index 64% rename from editor/src/main/java/com/pine/repository/FSEntry.java rename to src/main/java/com/pine/editor/repository/FSEntry.java index eb91f4bd..1f997345 100644 --- a/editor/src/main/java/com/pine/repository/FSEntry.java +++ b/src/main/java/com/pine/editor/repository/FSEntry.java @@ -1,22 +1,29 @@ -package com.pine.repository; +package com.pine.editor.repository; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.importer.ImporterService; +import com.pine.common.Icons; +import com.pine.common.inspection.Inspectable; +import com.pine.common.inspection.InspectableField; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.importer.ImporterService; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; -public class FSEntry { +public class FSEntry extends Inspectable { private static final SimpleDateFormat FORMATTER = new SimpleDateFormat("dd/MM/yyyy HH:mm"); public final String id; + + @InspectableField(label = "Name") public String name; + public final StreamableResourceType type; public final String sizeText; public String creationDateString; public final boolean isDirectory; + public boolean isHovered = false; public FSEntry(File file, StreamableResourceType type, String id, String name) { creationDateString = FORMATTER.format(new Date(file.lastModified())); @@ -46,4 +53,14 @@ public String getId() { public StreamableResourceType getType() { return type; } + + @Override + public String getTitle() { + return name; + } + + @Override + public String getIcon() { + return isDirectory ? Icons.folder : Icons.file_open; + } } diff --git a/editor/src/main/java/com/pine/repository/FilesRepository.java b/src/main/java/com/pine/editor/repository/FilesRepository.java similarity index 82% rename from editor/src/main/java/com/pine/repository/FilesRepository.java rename to src/main/java/com/pine/editor/repository/FilesRepository.java index 71b036cd..b2c3948d 100644 --- a/editor/src/main/java/com/pine/repository/FilesRepository.java +++ b/src/main/java/com/pine/editor/repository/FilesRepository.java @@ -1,8 +1,8 @@ -package com.pine.repository; +package com.pine.editor.repository; -import com.pine.SerializableRepository; -import com.pine.injection.PBean; -import com.pine.repository.streaming.StreamableResourceType; +import com.pine.common.SerializableRepository; +import com.pine.common.injection.PBean; +import com.pine.engine.repository.streaming.StreamableResourceType; import java.util.ArrayList; import java.util.HashMap; diff --git a/editor/src/main/java/com/pine/service/FSService.java b/src/main/java/com/pine/editor/service/FSService.java similarity index 89% rename from editor/src/main/java/com/pine/service/FSService.java rename to src/main/java/com/pine/editor/service/FSService.java index c0cbaf1d..607b7220 100644 --- a/editor/src/main/java/com/pine/service/FSService.java +++ b/src/main/java/com/pine/editor/service/FSService.java @@ -1,7 +1,7 @@ -package com.pine.service; +package com.pine.editor.service; -import com.pine.injection.PBean; -import com.pine.messaging.Loggable; +import com.pine.common.injection.PBean; +import com.pine.common.messaging.Loggable; import java.io.File; import java.nio.file.Files; diff --git a/editor/src/main/java/com/pine/service/FilesService.java b/src/main/java/com/pine/editor/service/FilesService.java similarity index 79% rename from editor/src/main/java/com/pine/service/FilesService.java rename to src/main/java/com/pine/editor/service/FilesService.java index dbda16a3..8105569c 100644 --- a/editor/src/main/java/com/pine/service/FilesService.java +++ b/src/main/java/com/pine/editor/service/FilesService.java @@ -1,22 +1,22 @@ -package com.pine.service; +package com.pine.editor.service; import com.pine.FSUtil; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.messaging.Loggable; -import com.pine.messaging.MessageRepository; -import com.pine.messaging.MessageSeverity; -import com.pine.repository.FSEntry; -import com.pine.repository.FilesRepository; -import com.pine.repository.streaming.StreamingRepository; -import com.pine.service.importer.ImporterService; -import com.pine.service.importer.metadata.AbstractResourceMetadata; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.common.messaging.Loggable; +import com.pine.common.messaging.MessageRepository; +import com.pine.common.messaging.MessageSeverity; +import com.pine.editor.repository.FSEntry; +import com.pine.editor.repository.FilesRepository; +import com.pine.engine.repository.streaming.StreamingRepository; +import com.pine.engine.service.importer.ImporterService; +import com.pine.engine.service.importer.metadata.AbstractResourceMetadata; import java.io.File; import java.util.Collection; import java.util.List; -import static com.pine.service.importer.impl.TextureImporter.PREVIEW_EXT; +import static com.pine.engine.service.importer.impl.TextureImporter.PREVIEW_EXT; @PBean public class FilesService implements Loggable { @@ -85,16 +85,21 @@ public void importFile(String currentDirectory) { } messageRepository.pushMessage(paths.size() + " files imported", MessageSeverity.SUCCESS); - projectService.serializationService.serializeRepository(projectService.getProjectDirectory(), filesRepository); + serialize(); filesRepository.isImporting = false; }); } + public void serialize(){ + projectService.serializationService.serializeRepository(projectService.getProjectDirectory(), filesRepository); + } + public void createEntry(String currentDirectory, AbstractResourceMetadata r) { var entry = new FSEntry(new File(importerService.getPathToFile(r.id, r.getResourceType())), r.getResourceType(), r.id, r.name); filesRepository.parentChildren.get(currentDirectory).add(entry.id); filesRepository.entry.put(entry.id, entry); filesRepository.childParent.put(entry.id, currentDirectory); filesRepository.byType.get(entry.type).add(entry.id); + serialize(); } } diff --git a/editor/src/main/java/com/pine/service/NativeDialogService.java b/src/main/java/com/pine/editor/service/NativeDialogService.java similarity index 95% rename from editor/src/main/java/com/pine/service/NativeDialogService.java rename to src/main/java/com/pine/editor/service/NativeDialogService.java index 7127bdba..941dbaea 100644 --- a/editor/src/main/java/com/pine/service/NativeDialogService.java +++ b/src/main/java/com/pine/editor/service/NativeDialogService.java @@ -1,7 +1,7 @@ -package com.pine.service; +package com.pine.editor.service; -import com.pine.injection.PBean; -import com.pine.repository.streaming.StreamableResourceType; +import com.pine.common.injection.PBean; +import com.pine.engine.repository.streaming.StreamableResourceType; import org.lwjgl.PointerBuffer; import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryUtil; diff --git a/editor/src/main/java/com/pine/service/ProjectService.java b/src/main/java/com/pine/editor/service/ProjectService.java similarity index 89% rename from editor/src/main/java/com/pine/service/ProjectService.java rename to src/main/java/com/pine/editor/service/ProjectService.java index 227841fa..d8b5a488 100644 --- a/editor/src/main/java/com/pine/service/ProjectService.java +++ b/src/main/java/com/pine/editor/service/ProjectService.java @@ -1,11 +1,11 @@ -package com.pine.service; - -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.injection.PInjector; -import com.pine.injection.PostCreation; -import com.pine.messaging.Loggable; -import com.pine.service.serialization.SerializationService; +package com.pine.editor.service; + +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.common.injection.PInjector; +import com.pine.common.injection.PostCreation; +import com.pine.common.messaging.Loggable; +import com.pine.editor.service.serialization.SerializationService; import java.io.File; import java.nio.file.Files; diff --git a/editor/src/main/java/com/pine/service/SelectionService.java b/src/main/java/com/pine/editor/service/SelectionService.java similarity index 84% rename from editor/src/main/java/com/pine/service/SelectionService.java rename to src/main/java/com/pine/editor/service/SelectionService.java index 7cca6ddf..d42201c3 100644 --- a/editor/src/main/java/com/pine/service/SelectionService.java +++ b/src/main/java/com/pine/editor/service/SelectionService.java @@ -1,11 +1,11 @@ -package com.pine.service; - -import com.pine.component.Entity; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.repository.EditorRepository; -import com.pine.repository.WorldRepository; -import com.pine.service.grid.WorldService; +package com.pine.editor.service; + +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.editor.repository.EditorRepository; +import com.pine.engine.component.Entity; +import com.pine.engine.repository.WorldRepository; +import com.pine.engine.service.world.WorldService; import java.util.Collection; diff --git a/editor/src/main/java/com/pine/service/ThemeService.java b/src/main/java/com/pine/editor/service/ThemeService.java similarity index 81% rename from editor/src/main/java/com/pine/service/ThemeService.java rename to src/main/java/com/pine/editor/service/ThemeService.java index bb69fce2..0d270b1b 100644 --- a/editor/src/main/java/com/pine/service/ThemeService.java +++ b/src/main/java/com/pine/editor/service/ThemeService.java @@ -1,9 +1,9 @@ -package com.pine.service; +package com.pine.editor.service; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.injection.PostCreation; -import com.pine.repository.EditorRepository; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.common.injection.PostCreation; +import com.pine.editor.repository.EditorRepository; import imgui.ImGui; import imgui.ImGuiStyle; import imgui.ImVec4; @@ -44,7 +44,7 @@ public void tick() { ImGui.styleColorsDark(); setDarkMode(); } - + var accentDarker = new ImVec4(editorRepository.accentColor.x, editorRepository.accentColor.y, editorRepository.accentColor.z, 1).times(.85f, .85f, .85f, 1); textDisabled = new ImVec4(palette6.x / 2f, palette6.y / 2f, palette6.z / 2f, 1); colors[ImGuiCol.Text] = palette6; colors[ImGuiCol.TextDisabled] = textDisabled; @@ -60,22 +60,22 @@ public void tick() { colors[ImGuiCol.MenuBarBg] = palette0; colors[ImGuiCol.ScrollbarBg] = palette0; colors[ImGuiCol.ScrollbarGrab] = palette3; - colors[ImGuiCol.ScrollbarGrabHovered] = palette4; + colors[ImGuiCol.ScrollbarGrabHovered] = accentDarker; colors[ImGuiCol.ScrollbarGrabActive] = palette2; colors[ImGuiCol.SliderGrab] = palette4; colors[ImGuiCol.ButtonActive] = palette2; colors[ImGuiCol.Separator] = palette5; - colors[ImGuiCol.SeparatorHovered] = palette6; + colors[ImGuiCol.SeparatorHovered] = accentDarker; colors[ImGuiCol.SeparatorActive] = palette6; colors[ImGuiCol.ResizeGrip] = palette4; colors[ImGuiCol.Tab] = palette2; - colors[ImGuiCol.TabHovered] = palette3; + colors[ImGuiCol.TabHovered] = accentDarker; colors[ImGuiCol.DockingPreview] = palette4; colors[ImGuiCol.DockingEmptyBg] = palette6; colors[ImGuiCol.PlotLines] = palette5; - colors[ImGuiCol.PlotLinesHovered] = palette6; + colors[ImGuiCol.PlotLinesHovered] = accentDarker; colors[ImGuiCol.PlotHistogram] = palette5; - colors[ImGuiCol.PlotHistogramHovered] = palette6; + colors[ImGuiCol.PlotHistogramHovered] = accentDarker; colors[ImGuiCol.DragDropTarget] = palette4; colors[ImGuiCol.NavHighlight] = palette3; colors[ImGuiCol.NavWindowingHighlight] = palette2; @@ -86,18 +86,22 @@ public void tick() { editorRepository.accent.z = editorRepository.accentColor.z; editorRepository.accent.x = editorRepository.accentColor.x; editorRepository.accent.w = 1; - editorRepository.accentU32 = ImGui.getColorU32(editorRepository.accent); + editorRepository.accentU32 = ImGui.getColorU32(new ImVec4(editorRepository.accent.x, editorRepository.accent.y, editorRepository.accent.z, .4f)); - colors[ImGuiCol.FrameBgHovered] = editorRepository.accent; + colors[ImGuiCol.FrameBgHovered] = accentDarker; colors[ImGuiCol.FrameBgActive] = editorRepository.accent; colors[ImGuiCol.CheckMark] = editorRepository.accent; colors[ImGuiCol.SliderGrabActive] = editorRepository.accent; - colors[ImGuiCol.Button] = editorRepository.accent; - colors[ImGuiCol.ButtonHovered] = editorRepository.accent; + + colors[ImGuiCol.Button] = neutralPalette; + colors[ImGuiCol.ButtonHovered] = accentDarker; + colors[ImGuiCol.ButtonActive] = editorRepository.accent; + colors[ImGuiCol.Header] = editorRepository.accent; - colors[ImGuiCol.HeaderHovered] = editorRepository.accent; + colors[ImGuiCol.HeaderHovered] = accentDarker; colors[ImGuiCol.HeaderActive] = editorRepository.accent; - colors[ImGuiCol.ResizeGripHovered] = editorRepository.accent; + + colors[ImGuiCol.ResizeGripHovered] = accentDarker; colors[ImGuiCol.ResizeGripActive] = editorRepository.accent; colors[ImGuiCol.TextSelectedBg] = editorRepository.accent; diff --git a/editor/src/main/java/com/pine/service/ViewportPickingService.java b/src/main/java/com/pine/editor/service/ViewportPickingService.java similarity index 86% rename from editor/src/main/java/com/pine/service/ViewportPickingService.java rename to src/main/java/com/pine/editor/service/ViewportPickingService.java index 4c0d3d07..b3139a2a 100644 --- a/editor/src/main/java/com/pine/service/ViewportPickingService.java +++ b/src/main/java/com/pine/editor/service/ViewportPickingService.java @@ -1,14 +1,13 @@ -package com.pine.service; - -import com.pine.component.MeshComponent; -import com.pine.component.TransformationComponent; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.messaging.Loggable; -import com.pine.repository.RuntimeRepository; -import com.pine.repository.WorldRepository; -import com.pine.repository.core.CoreBufferRepository; -import com.pine.service.grid.WorldService; +package com.pine.editor.service; + +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.common.messaging.Loggable; +import com.pine.engine.component.TransformationComponent; +import com.pine.engine.repository.RuntimeRepository; +import com.pine.engine.repository.WorldRepository; +import com.pine.engine.repository.core.CoreBufferRepository; +import com.pine.engine.service.world.WorldService; import imgui.ImGui; import imgui.flag.ImGuiKey; import org.lwjgl.BufferUtils; @@ -16,7 +15,6 @@ import org.lwjgl.opengl.GL46; import java.nio.FloatBuffer; -import java.util.Collection; @PBean public class ViewportPickingService implements Loggable { diff --git a/editor/src/main/java/com/pine/service/serialization/RepositoryContainer.java b/src/main/java/com/pine/editor/service/serialization/RepositoryContainer.java similarity index 81% rename from editor/src/main/java/com/pine/service/serialization/RepositoryContainer.java rename to src/main/java/com/pine/editor/service/serialization/RepositoryContainer.java index 2ecd3c86..d8fdefe8 100644 --- a/editor/src/main/java/com/pine/service/serialization/RepositoryContainer.java +++ b/src/main/java/com/pine/editor/service/serialization/RepositoryContainer.java @@ -1,4 +1,4 @@ -package com.pine.service.serialization; +package com.pine.editor.service.serialization; import java.io.Serializable; import java.util.ArrayList; diff --git a/editor/src/main/java/com/pine/service/serialization/SerializationService.java b/src/main/java/com/pine/editor/service/serialization/SerializationService.java similarity index 82% rename from editor/src/main/java/com/pine/service/serialization/SerializationService.java rename to src/main/java/com/pine/editor/service/serialization/SerializationService.java index ceb2b648..5452a8c5 100644 --- a/editor/src/main/java/com/pine/service/serialization/SerializationService.java +++ b/src/main/java/com/pine/editor/service/serialization/SerializationService.java @@ -1,13 +1,13 @@ -package com.pine.service.serialization; +package com.pine.editor.service.serialization; import com.pine.FSUtil; -import com.pine.SerializableRepository; -import com.pine.SerializationState; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.messaging.Loggable; -import com.pine.messaging.MessageRepository; -import com.pine.messaging.MessageSeverity; +import com.pine.common.SerializableRepository; +import com.pine.common.SerializationState; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.common.messaging.Loggable; +import com.pine.common.messaging.MessageRepository; +import com.pine.common.messaging.MessageSeverity; import org.apache.commons.codec.digest.DigestUtils; import java.io.File; @@ -17,8 +17,8 @@ import java.util.Date; import java.util.List; -import static com.pine.service.ProjectService.CONFIG_NAME; -import static com.pine.service.ProjectService.IDENTIFIER; +import static com.pine.editor.service.ProjectService.CONFIG_NAME; +import static com.pine.editor.service.ProjectService.IDENTIFIER; @PBean public class SerializationService implements Loggable { @@ -42,11 +42,6 @@ public void writeProjectMetadata(String projectDirectory) { public void serialize(String projectDirectory, boolean silent) { getLogger().info("Beginning project serialization to {}", projectDirectory); long start = System.currentTimeMillis(); - - for (SerializableRepository r : serializableRepositories) { - r.onSave(); - } - new Thread(() -> { boolean success = true; for (SerializableRepository r : serializableRepositories) { @@ -73,7 +68,7 @@ public boolean serializeRepository(String projectDirectory, SerializableReposito } private String getFilePath(String projectDirectory, SerializableRepository repository) { - return projectDirectory + File.separator + DigestUtils.sha1Hex(repository.getClass().getSimpleName()) + ".json"; + return projectDirectory + File.separator + repository.getClass().getSimpleName() + ".json"; } public void deserialize(String projectDirectory) { diff --git a/editor/src/main/java/com/pine/util/InMemoryAppender.java b/src/main/java/com/pine/editor/util/InMemoryAppender.java similarity index 98% rename from editor/src/main/java/com/pine/util/InMemoryAppender.java rename to src/main/java/com/pine/editor/util/InMemoryAppender.java index 9521154b..d6e6f358 100644 --- a/editor/src/main/java/com/pine/util/InMemoryAppender.java +++ b/src/main/java/com/pine/editor/util/InMemoryAppender.java @@ -1,4 +1,4 @@ -package com.pine.util; +package com.pine.editor.util; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.Filter; diff --git a/editor/src/main/java/com/pine/util/LogMessage.java b/src/main/java/com/pine/editor/util/LogMessage.java similarity index 96% rename from editor/src/main/java/com/pine/util/LogMessage.java rename to src/main/java/com/pine/editor/util/LogMessage.java index d59de210..620504de 100644 --- a/editor/src/main/java/com/pine/util/LogMessage.java +++ b/src/main/java/com/pine/editor/util/LogMessage.java @@ -1,4 +1,4 @@ -package com.pine.util; +package com.pine.editor.util; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.LogEvent; diff --git a/engine/src/main/java/com/pine/Engine.java b/src/main/java/com/pine/engine/Engine.java similarity index 68% rename from engine/src/main/java/com/pine/Engine.java rename to src/main/java/com/pine/engine/Engine.java index 1a958357..a9b31493 100644 --- a/engine/src/main/java/com/pine/Engine.java +++ b/src/main/java/com/pine/engine/Engine.java @@ -1,18 +1,18 @@ -package com.pine; - -import com.pine.injection.EngineExternalModule; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.repository.RuntimeRepository; -import com.pine.repository.core.CoreBufferRepository; -import com.pine.repository.core.CoreMeshRepository; -import com.pine.repository.core.CoreShaderRepository; -import com.pine.service.module.EngineModulesService; -import com.pine.service.resource.IResource; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.system.SystemService; -import com.pine.tasks.AbstractTask; -import com.pine.tasks.SyncTask; +package com.pine.engine; + +import com.pine.common.MetricCollector; +import com.pine.common.injection.Disposable; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.common.messaging.Loggable; +import com.pine.engine.repository.RuntimeRepository; +import com.pine.engine.repository.core.CoreBufferRepository; +import com.pine.engine.repository.core.CoreMeshRepository; +import com.pine.engine.repository.core.CoreShaderRepository; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.system.SystemService; +import com.pine.engine.tasks.AbstractTask; +import com.pine.engine.tasks.SyncTask; import org.jetbrains.annotations.NotNull; import org.lwjgl.opengl.GL46; @@ -23,13 +23,11 @@ import java.util.List; @PBean -public class Engine extends MetricCollector implements IResource { +public class Engine extends MetricCollector implements Disposable, Loggable { public static final float PI_OVER_2 = (float) (Math.PI / 2); public static final int MAX_LIGHTS = 310; - private FrameBufferObject targetFBO; + private FBO targetFBO; - @PInject - public EngineModulesService modules; @PInject public SystemService systemsService; @PInject @@ -41,13 +39,15 @@ public class Engine extends MetricCollector implements IResource { @PInject public RuntimeRepository runtimeRepository; @PInject + public List disposables; + @PInject public List syncTasks; @PInject public List tasks; private boolean ready = false; private String targetDirectory; - public void start(int displayW, int displayH, List modules, String targetDirectory) { + public void start(int displayW, int displayH, String targetDirectory) { runtimeRepository.setDisplayW(displayW); runtimeRepository.setDisplayH(displayH); runtimeRepository.setInvDisplayW(1f / displayW); @@ -55,14 +55,13 @@ public void start(int displayW, int displayH, List modules setupGL(); - primitiveRepository.initialize(); - bufferRepository.initialize(); - shaderRepository.initialize(); - systemsService.initialize(); + primitiveRepository.onInitialize(); + bufferRepository.onInitialize(); + shaderRepository.onInitialize(); + systemsService.onInitialize(); targetFBO = bufferRepository.gBufferTarget; - this.modules.addModules(modules); tasks.forEach(t -> { t.onInitialize(); t.start(); @@ -105,7 +104,7 @@ public void render() { return; } startTracking(); - for (FrameBufferObject fbo : bufferRepository.all) { + for (FBO fbo : bufferRepository.all) { fbo.clear(); } @@ -120,11 +119,11 @@ public void render() { MetricCollector.shouldCollect = false; } - public void setTargetFBO(@NotNull FrameBufferObject fbo) { + public void setTargetFBO(@NotNull FBO fbo) { this.targetFBO = fbo; } - public FrameBufferObject getTargetFBO() { + public FBO getTargetFBO() { return targetFBO; } @@ -143,9 +142,6 @@ public String getTitle() { @Override public void dispose() { - shaderRepository.dispose(); - bufferRepository.dispose(); - primitiveRepository.dispose(); + disposables.forEach(Disposable::dispose); } - } diff --git a/engine/src/main/java/com/pine/component/AbstractComponent.java b/src/main/java/com/pine/engine/component/AbstractComponent.java similarity index 92% rename from engine/src/main/java/com/pine/component/AbstractComponent.java rename to src/main/java/com/pine/engine/component/AbstractComponent.java index a5c19fa4..16ad17b2 100644 --- a/engine/src/main/java/com/pine/component/AbstractComponent.java +++ b/src/main/java/com/pine/engine/component/AbstractComponent.java @@ -1,6 +1,6 @@ -package com.pine.component; +package com.pine.engine.component; -import com.pine.inspection.Inspectable; +import com.pine.common.inspection.Inspectable; import java.util.Set; diff --git a/src/main/java/com/pine/engine/component/ComponentType.java b/src/main/java/com/pine/engine/component/ComponentType.java new file mode 100644 index 00000000..721df3ec --- /dev/null +++ b/src/main/java/com/pine/engine/component/ComponentType.java @@ -0,0 +1,60 @@ +package com.pine.engine.component; + +import com.pine.common.Icons; +import com.pine.engine.component.light.PointLightComponent; +import com.pine.engine.component.light.SphereLightComponent; +import com.pine.engine.component.light.SpotLightComponent; +import com.pine.engine.type.LightType; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public enum ComponentType implements Serializable { + POINT_LIGHT(LightType.POINT.getTitle(), Icons.lightbulb, PointLightComponent.class, true), + SPHERE_LIGHT(LightType.SPHERE.getTitle(), Icons.sunny, SphereLightComponent.class, true), + SPOT_LIGHT(LightType.SPOT.getTitle(), Icons.highlight, SpotLightComponent.class, true), + ENVIRONMENT_PROBE("Environment Probe", Icons.blur_on, EnvironmentProbeComponent.class, true), + MESH("Mesh", Icons.category, MeshComponent.class, true), + DECAL("Decal", Icons.layers, DecalComponent.class, true), + CULLING("Culling", Icons.visibility_off, CullingComponent.class, false), + TRANSFORMATION("Transformation", Icons.transform, TransformationComponent.class, false); + + private final boolean isSoleType; + private final String title; + private final String icon; + private transient final Class clazz; + + ComponentType(String title, String icon, Class clazz, boolean isSoleType) { + this.title = title; + this.icon = icon; + this.isSoleType = isSoleType; + this.clazz = clazz; + } + + public static List getSoleTypes() { + List types = new ArrayList<>(); + for (ComponentType type : ComponentType.values()) { + if (type.isSoleType) { + types.add(type); + } + } + return types; + } + + public String getTitle() { + return title; + } + + public Class getClazz() { + return clazz; + } + + public String getIcon() { + return icon; + } + + public boolean isSoleType() { + return isSoleType; + } +} diff --git a/engine/src/main/java/com/pine/component/CullingComponent.java b/src/main/java/com/pine/engine/component/CullingComponent.java similarity index 88% rename from engine/src/main/java/com/pine/component/CullingComponent.java rename to src/main/java/com/pine/engine/component/CullingComponent.java index 566f50a8..7fa7f23e 100644 --- a/engine/src/main/java/com/pine/component/CullingComponent.java +++ b/src/main/java/com/pine/engine/component/CullingComponent.java @@ -1,6 +1,6 @@ -package com.pine.component; +package com.pine.engine.component; -import com.pine.inspection.InspectableField; +import com.pine.common.inspection.InspectableField; public class CullingComponent extends AbstractComponent { @InspectableField(label = "Enable culling") diff --git a/engine/src/main/java/com/pine/component/DecalComponent.java b/src/main/java/com/pine/engine/component/DecalComponent.java similarity index 67% rename from engine/src/main/java/com/pine/component/DecalComponent.java rename to src/main/java/com/pine/engine/component/DecalComponent.java index b0d9445f..cbe52c2c 100644 --- a/engine/src/main/java/com/pine/component/DecalComponent.java +++ b/src/main/java/com/pine/engine/component/DecalComponent.java @@ -1,11 +1,9 @@ -package com.pine.component; +package com.pine.engine.component; -import com.pine.inspection.InspectableField; -import com.pine.inspection.ResourceTypeField; -import com.pine.repository.rendering.RenderingRequest; -import com.pine.repository.streaming.StreamableResourceType; +import com.pine.common.inspection.InspectableField; +import com.pine.engine.inspection.ResourceTypeField; +import com.pine.engine.repository.streaming.StreamableResourceType; -import java.util.Map; import java.util.Set; diff --git a/engine/src/main/java/com/pine/component/Entity.java b/src/main/java/com/pine/engine/component/Entity.java similarity index 64% rename from engine/src/main/java/com/pine/component/Entity.java rename to src/main/java/com/pine/engine/component/Entity.java index 7a541d35..b8ace1f0 100644 --- a/engine/src/main/java/com/pine/component/Entity.java +++ b/src/main/java/com/pine/engine/component/Entity.java @@ -1,8 +1,10 @@ -package com.pine.component; +package com.pine.engine.component; -import com.pine.inspection.Inspectable; -import com.pine.inspection.InspectableField; -import com.pine.theme.Icons; +import com.pine.common.Icons; +import com.pine.common.inspection.Color; +import com.pine.common.inspection.Inspectable; +import com.pine.common.inspection.InspectableField; +import com.pine.editor.core.UIUtil; import java.io.Serializable; import java.text.SimpleDateFormat; @@ -15,6 +17,9 @@ public class Entity extends Inspectable implements Serializable { @InspectableField(label = "Name") public String name; + @InspectableField(label = "Color (container only)") + public final Color color = new Color(UIUtil.DIRECTORY_COLOR.x, UIUtil.DIRECTORY_COLOR.y, UIUtil.DIRECTORY_COLOR.z); + @InspectableField(label = "Identifier", disabled = true) public final String id; @@ -24,6 +29,8 @@ public class Entity extends Inspectable implements Serializable { @InspectableField(label = "Render index", disabled = true) public int renderIndex; + public boolean isContainer = false; + public Entity(String id, String name) { this.id = id; this.name = name; @@ -40,7 +47,7 @@ public Entity() { @Override public String getTitle() { - return name; + return "Entity metadata"; } @Override @@ -51,4 +58,12 @@ public String getIcon() { public Entity cloneEntity() { return new Entity(UUID.randomUUID().toString(), name + " (clone)"); } + + public boolean isContainer() { + return isContainer; + } + + public void setContainer(boolean container) { + isContainer = container; + } } diff --git a/engine/src/main/java/com/pine/component/EnvironmentProbeComponent.java b/src/main/java/com/pine/engine/component/EnvironmentProbeComponent.java similarity index 93% rename from engine/src/main/java/com/pine/component/EnvironmentProbeComponent.java rename to src/main/java/com/pine/engine/component/EnvironmentProbeComponent.java index 3433bbb9..97df0119 100644 --- a/engine/src/main/java/com/pine/component/EnvironmentProbeComponent.java +++ b/src/main/java/com/pine/engine/component/EnvironmentProbeComponent.java @@ -1,4 +1,4 @@ -package com.pine.component; +package com.pine.engine.component; import java.util.Set; diff --git a/engine/src/main/java/com/pine/component/MeshComponent.java b/src/main/java/com/pine/engine/component/MeshComponent.java similarity index 63% rename from engine/src/main/java/com/pine/component/MeshComponent.java rename to src/main/java/com/pine/engine/component/MeshComponent.java index b21cacad..0e693bd5 100644 --- a/engine/src/main/java/com/pine/component/MeshComponent.java +++ b/src/main/java/com/pine/engine/component/MeshComponent.java @@ -1,11 +1,10 @@ -package com.pine.component; +package com.pine.engine.component; -import com.pine.inspection.InspectableField; -import com.pine.inspection.ResourceTypeField; -import com.pine.repository.rendering.RenderingRequest; -import com.pine.repository.streaming.StreamableResourceType; +import com.pine.common.inspection.InspectableField; +import com.pine.engine.inspection.ResourceTypeField; +import com.pine.engine.repository.rendering.RenderingRequest; +import com.pine.engine.repository.streaming.StreamableResourceType; -import java.util.Map; import java.util.Set; @@ -18,35 +17,35 @@ public class MeshComponent extends AbstractComponent { public String material; @ResourceTypeField(type = StreamableResourceType.MESH) - @InspectableField(group = "Mesh", label = "Mesh LOD 0") + @InspectableField(label = "Mesh LOD 0") public String lod0; - @InspectableField(group = "Mesh", label = "Use LOD 0 when distance") + @InspectableField(label = "Use LOD 0 when distance") public float lod0DistanceUntil = 50; @ResourceTypeField(type = StreamableResourceType.MESH) - @InspectableField(group = "Mesh", label = "Mesh LOD 1") + @InspectableField(label = "Mesh LOD 1") public String lod1; - @InspectableField(group = "Mesh", label = "Use LOD 1 when distance") + @InspectableField(label = "Use LOD 1 when distance") public float lod1DistanceUntil = 100; @ResourceTypeField(type = StreamableResourceType.MESH) - @InspectableField(group = "Mesh", label = "Mesh LOD 2") + @InspectableField(label = "Mesh LOD 2") public String lod2; - @InspectableField(group = "Mesh", label = "Use LOD 2 when distance") + @InspectableField(label = "Use LOD 2 when distance") public float lod2DistanceUntil = 150; @ResourceTypeField(type = StreamableResourceType.MESH) - @InspectableField(group = "Mesh", label = "Mesh LOD 3") + @InspectableField(label = "Mesh LOD 3") public String lod3; - @InspectableField(group = "Mesh", label = "Use LOD 3 when distance") + @InspectableField(label = "Use LOD 3 when distance") public float lod3DistanceUntil = 200; @ResourceTypeField(type = StreamableResourceType.MESH) - @InspectableField(group = "Mesh", label = "Mesh LOD 4") + @InspectableField(label = "Mesh LOD 4") public String lod4; public RenderingRequest renderRequest; diff --git a/engine/src/main/java/com/pine/component/TransformationComponent.java b/src/main/java/com/pine/engine/component/TransformationComponent.java similarity index 93% rename from engine/src/main/java/com/pine/component/TransformationComponent.java rename to src/main/java/com/pine/engine/component/TransformationComponent.java index ded4ccc7..da4ea6d3 100644 --- a/engine/src/main/java/com/pine/component/TransformationComponent.java +++ b/src/main/java/com/pine/engine/component/TransformationComponent.java @@ -1,6 +1,6 @@ -package com.pine.component; +package com.pine.engine.component; -import com.pine.inspection.InspectableField; +import com.pine.common.inspection.InspectableField; import org.joml.Matrix4f; import org.joml.Quaternionf; import org.joml.Vector3f; diff --git a/engine/src/main/java/com/pine/component/light/AbstractLightComponent.java b/src/main/java/com/pine/engine/component/light/AbstractLightComponent.java similarity index 74% rename from engine/src/main/java/com/pine/component/light/AbstractLightComponent.java rename to src/main/java/com/pine/engine/component/light/AbstractLightComponent.java index 1663fe1e..c02a1ad8 100644 --- a/engine/src/main/java/com/pine/component/light/AbstractLightComponent.java +++ b/src/main/java/com/pine/engine/component/light/AbstractLightComponent.java @@ -1,15 +1,14 @@ -package com.pine.component.light; +package com.pine.engine.component.light; -import com.pine.component.AbstractComponent; -import com.pine.component.ComponentType; -import com.pine.inspection.Color; -import com.pine.inspection.InspectableField; -import com.pine.theme.Icons; -import com.pine.type.LightType; +import com.pine.common.inspection.Color; +import com.pine.common.inspection.InspectableField; +import com.pine.engine.component.AbstractComponent; +import com.pine.engine.component.ComponentType; +import com.pine.engine.type.LightType; import java.util.Set; -import static com.pine.service.grid.WorldGrid.TILE_SIZE; +import static com.pine.engine.service.world.WorldGrid.TILE_SIZE; public abstract class AbstractLightComponent extends AbstractComponent { @InspectableField(label = "Screen Space Shadows") diff --git a/engine/src/main/java/com/pine/component/light/PointLightComponent.java b/src/main/java/com/pine/engine/component/light/PointLightComponent.java similarity index 81% rename from engine/src/main/java/com/pine/component/light/PointLightComponent.java rename to src/main/java/com/pine/engine/component/light/PointLightComponent.java index 382c2d67..83d31ddc 100644 --- a/engine/src/main/java/com/pine/component/light/PointLightComponent.java +++ b/src/main/java/com/pine/engine/component/light/PointLightComponent.java @@ -1,8 +1,8 @@ -package com.pine.component.light; +package com.pine.engine.component.light; -import com.pine.component.ComponentType; -import com.pine.inspection.InspectableField; -import com.pine.type.LightType; +import com.pine.common.inspection.InspectableField; +import com.pine.engine.component.ComponentType; +import com.pine.engine.type.LightType; public class PointLightComponent extends AbstractLightComponent { @InspectableField(label="Shadow map") diff --git a/engine/src/main/java/com/pine/component/light/SphereLightComponent.java b/src/main/java/com/pine/engine/component/light/SphereLightComponent.java similarity index 70% rename from engine/src/main/java/com/pine/component/light/SphereLightComponent.java rename to src/main/java/com/pine/engine/component/light/SphereLightComponent.java index 055cf063..3d91486a 100644 --- a/engine/src/main/java/com/pine/component/light/SphereLightComponent.java +++ b/src/main/java/com/pine/engine/component/light/SphereLightComponent.java @@ -1,8 +1,8 @@ -package com.pine.component.light; +package com.pine.engine.component.light; -import com.pine.component.ComponentType; -import com.pine.inspection.InspectableField; -import com.pine.type.LightType; +import com.pine.common.inspection.InspectableField; +import com.pine.engine.component.ComponentType; +import com.pine.engine.type.LightType; public class SphereLightComponent extends AbstractLightComponent { diff --git a/engine/src/main/java/com/pine/component/light/SpotLightComponent.java b/src/main/java/com/pine/engine/component/light/SpotLightComponent.java similarity index 69% rename from engine/src/main/java/com/pine/component/light/SpotLightComponent.java rename to src/main/java/com/pine/engine/component/light/SpotLightComponent.java index ec04b26a..2f97319e 100644 --- a/engine/src/main/java/com/pine/component/light/SpotLightComponent.java +++ b/src/main/java/com/pine/engine/component/light/SpotLightComponent.java @@ -1,8 +1,8 @@ -package com.pine.component.light; +package com.pine.engine.component.light; -import com.pine.component.ComponentType; -import com.pine.inspection.InspectableField; -import com.pine.type.LightType; +import com.pine.common.inspection.InspectableField; +import com.pine.engine.component.ComponentType; +import com.pine.engine.type.LightType; public class SpotLightComponent extends AbstractLightComponent { diff --git a/engine/src/main/java/com/pine/inspection/ResourceTypeField.java b/src/main/java/com/pine/engine/inspection/ResourceTypeField.java similarity index 65% rename from engine/src/main/java/com/pine/inspection/ResourceTypeField.java rename to src/main/java/com/pine/engine/inspection/ResourceTypeField.java index c79c8ee3..83e29484 100644 --- a/engine/src/main/java/com/pine/inspection/ResourceTypeField.java +++ b/src/main/java/com/pine/engine/inspection/ResourceTypeField.java @@ -1,6 +1,6 @@ -package com.pine.inspection; +package com.pine.engine.inspection; -import com.pine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.streaming.StreamableResourceType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/engine/src/main/java/com/pine/inspection/TypePreviewField.java b/src/main/java/com/pine/engine/inspection/TypePreviewField.java similarity index 81% rename from engine/src/main/java/com/pine/inspection/TypePreviewField.java rename to src/main/java/com/pine/engine/inspection/TypePreviewField.java index 7aa4ab0e..00ca2ded 100644 --- a/engine/src/main/java/com/pine/inspection/TypePreviewField.java +++ b/src/main/java/com/pine/engine/inspection/TypePreviewField.java @@ -1,4 +1,4 @@ -package com.pine.inspection; +package com.pine.engine.inspection; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/main/java/com/pine/engine/repository/AtmosphereRepository.java b/src/main/java/com/pine/engine/repository/AtmosphereRepository.java new file mode 100644 index 00000000..5ab72a36 --- /dev/null +++ b/src/main/java/com/pine/engine/repository/AtmosphereRepository.java @@ -0,0 +1,126 @@ +package com.pine.engine.repository; + +import com.pine.common.Icons; +import com.pine.common.SerializableRepository; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.common.inspection.Color; +import com.pine.common.inspection.ExecutableField; +import com.pine.common.inspection.Inspectable; +import com.pine.common.inspection.InspectableField; +import com.pine.engine.service.environment.EnvironmentMapGenService; +import com.pine.engine.type.AtmosphereType; +import org.joml.Matrix4f; +import org.joml.Vector3f; +import org.joml.Vector4f; + +@PBean +public class AtmosphereRepository extends Inspectable implements SerializableRepository { + + @PInject + public transient EnvironmentMapGenService environmentMapGenService; + + @ExecutableField(label = "Bake environment maps") + public void process() { + environmentMapGenService.bake(); + } + + @InspectableField(label = "Render atmosphere") + public boolean enabled = false; + + @InspectableField(group = "Shadows", label = "Enabled") + public boolean shadows = true; + + @InspectableField(group = "Shadows", label = "View size") + public float shadowsViewSize = 10; + + @InspectableField(group = "Shadows", label = "Far plane") + public float shadowsFarPlane = 100000; + + @InspectableField(group = "Shadows", label = "Near plane") + public float shadowsNearPlane = .1f; + + @InspectableField(group = "Time", label = "Elapsed time") + public float elapsedTime = .5f; + + @InspectableField(group = "Time", label = "Increment time") + public boolean incrementTime = false; + + @InspectableField(group = "Time", label = "Time of day speed") + public float elapsedTimeSpeed = 1; + + @InspectableField(group = "Wind", label = "Frequency", min = 1) + public float windFrequency = 20; + + @InspectableField(group = "Wind", label = "Strength", min = 0, max = 1) + public float windStrength = .5f; + + @InspectableField(group = "Wind", label = "Amplitude", min = 0) + public float windAmplitude = .15f; + + @InspectableField(group = "Sun", label = "Sun distance") + public float sunDistance = 100_000; + + @InspectableField(group = "Sun", label = "Light intensity") + public float sunLightIntensity = 2; + + @InspectableField(group = "Sun", label = "Dawn color") + public Color dawnColor = new Color(1, .39f, .19f); + + @InspectableField(group = "Sun", label = "Night color") + public Color nightColor = new Color(.1f, .1f, .1f); + + @InspectableField(group = "Sun", label = "Midday color") + public Color middayColor = new Color(.9f, .9f, .9f); + + @InspectableField(label = "Screen space shadows") + public boolean screenSpaceShadows = false; + + @InspectableField(group = "Clouds", label = "Layer height", min = 1) + public int cloudsHeight = 500; + @InspectableField(group = "Clouds", label = "Layer width and depth", min = 1) + public int cloudsSize = 100_000; + @InspectableField(group = "Clouds", label = "Layer altitude") + public int cloudsAltitude = 1000; + + @InspectableField(group = "Clouds", label = "Detail noise scale", min = 0) + public float detailNoiseScale = 2; + @InspectableField(group = "Clouds", label = "Detail scroll speed", min = 0) + public float detailScrollSpeed = 1; + @InspectableField(group = "Clouds", label = "Shape scroll speed", min = 0) + public float shapeScrollSpeed = 1; + @InspectableField(group = "Clouds", label = "Erosion strength", min = 1) + public float cloudErosionStrength = 52; + + + @InspectableField(group = "Clouds", label = "Density multiplier", min = 0) + public float densityMultiplier = 1; + @InspectableField(group = "Clouds", label = "Cloud coverage", min = 0) + public float cloudCoverage = 0; + @InspectableField(group = "Clouds", label = "Scale", min = 1) + public float scale = 3; + + @InspectableField(group = "Clouds", label = "Light step count", max = 10, min = 0) + public int numStepsLight = 5; + @InspectableField(group = "Clouds", label = "Ray offset strength", min = 0) + public float rayOffsetStrength = 10; + + @InspectableField(group = "Clouds", label = "Light absorption toward sun", min = 0, max = 1) + public float lightAbsorptionTowardSun = .5f; + @InspectableField(group = "Clouds", label = "Light absorption through cloud", min = 0, max = 1) + public float lightAbsorptionThroughCloud = .175f; + + public final Matrix4f lightSpaceMatrix = new Matrix4f(); + public final Matrix4f lightViewMatrix = new Matrix4f(); + public final Matrix4f lightProjectionMatrix = new Matrix4f(); + + @Override + public String getTitle() { + return "Atmosphere Settings"; + } + + @Override + public String getIcon() { + return Icons.cloud_sync; + } +} \ No newline at end of file diff --git a/engine/src/main/java/com/pine/repository/CameraRepository.java b/src/main/java/com/pine/engine/repository/CameraRepository.java similarity index 92% rename from engine/src/main/java/com/pine/repository/CameraRepository.java rename to src/main/java/com/pine/engine/repository/CameraRepository.java index b8503e30..9af17726 100644 --- a/engine/src/main/java/com/pine/repository/CameraRepository.java +++ b/src/main/java/com/pine/engine/repository/CameraRepository.java @@ -1,12 +1,12 @@ -package com.pine.repository; - -import com.pine.SerializableRepository; -import com.pine.injection.PBean; -import com.pine.inspection.Inspectable; -import com.pine.inspection.InspectableField; -import com.pine.service.camera.Camera; -import com.pine.service.camera.Frustum; -import com.pine.theme.Icons; +package com.pine.engine.repository; + +import com.pine.common.Icons; +import com.pine.common.SerializableRepository; +import com.pine.common.injection.PBean; +import com.pine.common.inspection.Inspectable; +import com.pine.common.inspection.InspectableField; +import com.pine.engine.service.camera.Camera; +import com.pine.engine.service.camera.Frustum; import org.joml.Matrix4f; @PBean diff --git a/engine/src/main/java/com/pine/repository/ClockRepository.java b/src/main/java/com/pine/engine/repository/ClockRepository.java similarity index 79% rename from engine/src/main/java/com/pine/repository/ClockRepository.java rename to src/main/java/com/pine/engine/repository/ClockRepository.java index fee78135..b8c33b22 100644 --- a/engine/src/main/java/com/pine/repository/ClockRepository.java +++ b/src/main/java/com/pine/engine/repository/ClockRepository.java @@ -1,7 +1,7 @@ -package com.pine.repository; +package com.pine.engine.repository; -import com.pine.injection.PBean; -import com.pine.tasks.SyncTask; +import com.pine.common.injection.PBean; +import com.pine.engine.tasks.SyncTask; @PBean public class ClockRepository implements SyncTask { diff --git a/engine/src/main/java/com/pine/repository/EngineRepository.java b/src/main/java/com/pine/engine/repository/EngineRepository.java similarity index 82% rename from engine/src/main/java/com/pine/repository/EngineRepository.java rename to src/main/java/com/pine/engine/repository/EngineRepository.java index c27c45bc..04f64ef3 100644 --- a/engine/src/main/java/com/pine/repository/EngineRepository.java +++ b/src/main/java/com/pine/engine/repository/EngineRepository.java @@ -1,26 +1,16 @@ -package com.pine.repository; +package com.pine.engine.repository; -import com.pine.SerializableRepository; -import com.pine.injection.PBean; -import com.pine.inspection.Color; -import com.pine.inspection.Inspectable; -import com.pine.inspection.InspectableField; -import com.pine.service.grid.WorldGrid; -import com.pine.theme.Icons; - -import java.util.HashMap; -import java.util.Map; - -import static com.pine.service.grid.WorldGrid.TILE_SIZE; +import com.pine.common.Icons; +import com.pine.common.SerializableRepository; +import com.pine.common.injection.PBean; +import com.pine.common.inspection.Color; +import com.pine.common.inspection.Inspectable; +import com.pine.common.inspection.InspectableField; @PBean public class EngineRepository extends Inspectable implements SerializableRepository { - - @InspectableField(label = "Background color") - public Color backgroundColor = new Color(0.23f, 0.23f, 0.23f); - @InspectableField(group = "World", label = "Number of tiles (X by X)") - public int numberOfTiles = 10; + public int numberOfTiles = 24; @InspectableField(group = "World", label = "Disable culling") public boolean disableCullingGlobally = false; @@ -88,7 +78,13 @@ public class EngineRepository extends Inspectable implements SerializableReposit @InspectableField(group = "Ambient occlusion", label = "Max Samples") public int ssaoMaxSamples = 64; - public DebugShadingModel debugShadingModel = DebugShadingModel.LIT; + @InspectableField(group = "Shadows", label = "Update every X(ms)") + public long updateSunShadowsEvery = 16; + + @InspectableField(group = "Shadows", label = "Resolution") + public int sunShadowsResolution = 512; + + public ShadingMode shadingMode = ShadingMode.LIT; public transient boolean isBakingEnvironmentMaps; public int meshesDrawn; diff --git a/engine/src/main/java/com/pine/repository/RuntimeRepository.java b/src/main/java/com/pine/engine/repository/RuntimeRepository.java similarity index 94% rename from engine/src/main/java/com/pine/repository/RuntimeRepository.java rename to src/main/java/com/pine/engine/repository/RuntimeRepository.java index ba787545..a2f3552b 100644 --- a/engine/src/main/java/com/pine/repository/RuntimeRepository.java +++ b/src/main/java/com/pine/engine/repository/RuntimeRepository.java @@ -1,7 +1,7 @@ -package com.pine.repository; +package com.pine.engine.repository; -import com.pine.injection.PBean; +import com.pine.common.injection.PBean; import org.joml.Vector2f; @PBean diff --git a/engine/src/main/java/com/pine/repository/DebugShadingModel.java b/src/main/java/com/pine/engine/repository/ShadingMode.java similarity index 79% rename from engine/src/main/java/com/pine/repository/DebugShadingModel.java rename to src/main/java/com/pine/engine/repository/ShadingMode.java index 0894ede0..80b1009b 100644 --- a/engine/src/main/java/com/pine/repository/DebugShadingModel.java +++ b/src/main/java/com/pine/engine/repository/ShadingMode.java @@ -1,10 +1,10 @@ -package com.pine.repository; +package com.pine.engine.repository; -import com.pine.inspection.SelectableEnum; +import com.pine.common.inspection.SelectableEnum; import java.io.Serializable; -public enum DebugShadingModel implements SelectableEnum, Serializable { +public enum ShadingMode implements SelectableEnum, Serializable { ALBEDO("Albedo", 0, 0), NORMAL("Normal", 1, 1), DEPTH("Depth", 3, 2), @@ -19,14 +19,15 @@ public enum DebugShadingModel implements SelectableEnum, Serializable { INDIRECT("Indirect illumination", 19, 11), TRIANGLE_ID("Triangle id", 20, 12), HEIGHT("Height", 21, 13), - LIT("Lit", -1, 14); + MATERIAL_MASK("Material mask", 22, 14), + LIT("Lit", -1, 15); private final int index; private final int id; private final String label; private static final String[] labels = new String[values().length]; - DebugShadingModel(String label, int id, int index) { + ShadingMode(String label, int id, int index) { this.id = id; this.label = label; this.index = index; @@ -42,7 +43,7 @@ public int getIndex() { public static String[] getLabels() { if (labels[0] == null) { - DebugShadingModel[] values = values(); + ShadingMode[] values = values(); for (int i = 0, valuesLength = values.length; i < valuesLength; i++) { var value = values[i]; labels[i] = value.label; diff --git a/engine/src/main/java/com/pine/repository/VoxelRepository.java b/src/main/java/com/pine/engine/repository/VoxelRepository.java similarity index 66% rename from engine/src/main/java/com/pine/repository/VoxelRepository.java rename to src/main/java/com/pine/engine/repository/VoxelRepository.java index 5fa94f54..9713fb79 100644 --- a/engine/src/main/java/com/pine/repository/VoxelRepository.java +++ b/src/main/java/com/pine/engine/repository/VoxelRepository.java @@ -1,25 +1,25 @@ -package com.pine.repository; +package com.pine.engine.repository; -import com.pine.SerializableRepository; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.inspection.ExecutableField; -import com.pine.inspection.Inspectable; -import com.pine.inspection.InspectableField; -import com.pine.service.voxelization.VoxelizationService; -import com.pine.theme.Icons; +import com.pine.common.Icons; +import com.pine.common.SerializableRepository; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.common.inspection.ExecutableField; +import com.pine.common.inspection.Inspectable; +import com.pine.common.inspection.InspectableField; +import com.pine.engine.service.voxelization.VoxelizationService; @PBean public class VoxelRepository extends Inspectable implements SerializableRepository { @PInject public transient VoxelizationService voxelizationService; - @ExecutableField(icon = Icons.apps, label = "Bake voxelized scene") + @ExecutableField(label = "Bake voxelized scene") public void process(){ if(!voxelizationService.bake()){ getLogger().error("Already voxelizing scene"); } } - @InspectableField(label = "Chunk grid size", min = 1) + @InspectableField(label = "Chunk world size", min = 1) public int chunkGridSize = 4; @InspectableField(label = "Max depth", min = 1, max = 10) diff --git a/engine/src/main/java/com/pine/repository/WorldRepository.java b/src/main/java/com/pine/engine/repository/WorldRepository.java similarity index 90% rename from engine/src/main/java/com/pine/repository/WorldRepository.java rename to src/main/java/com/pine/engine/repository/WorldRepository.java index 94dda523..e0de6925 100644 --- a/engine/src/main/java/com/pine/repository/WorldRepository.java +++ b/src/main/java/com/pine/engine/repository/WorldRepository.java @@ -1,12 +1,12 @@ -package com.pine.repository; +package com.pine.engine.repository; -import com.pine.SerializableRepository; -import com.pine.component.*; -import com.pine.component.light.PointLightComponent; -import com.pine.component.light.SphereLightComponent; -import com.pine.component.light.SpotLightComponent; -import com.pine.injection.PBean; -import com.pine.service.grid.WorldGrid; +import com.pine.common.SerializableRepository; +import com.pine.common.injection.PBean; +import com.pine.engine.component.*; +import com.pine.engine.component.light.PointLightComponent; +import com.pine.engine.component.light.SphereLightComponent; +import com.pine.engine.component.light.SpotLightComponent; +import com.pine.engine.service.world.WorldGrid; import java.util.HashMap; import java.util.LinkedList; @@ -29,7 +29,9 @@ public class WorldRepository implements SerializableRepository { public final Map bagTransformationComponent = new HashMap<>(); public final Map entityMap = new HashMap<>() {{ - put(ROOT_ID, new Entity(ROOT_ID, "World")); + var entity = new Entity(ROOT_ID, "World"); + put(ROOT_ID, entity); + entity.setContainer(true); }}; public final Map> parentChildren = new HashMap<>() {{ put(ROOT_ID, new LinkedList<>()); diff --git a/src/main/java/com/pine/engine/repository/core/CoreBufferRepository.java b/src/main/java/com/pine/engine/repository/core/CoreBufferRepository.java new file mode 100644 index 00000000..08160283 --- /dev/null +++ b/src/main/java/com/pine/engine/repository/core/CoreBufferRepository.java @@ -0,0 +1,228 @@ +package com.pine.engine.repository.core; + +import com.pine.common.Initializable; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.engine.Engine; +import com.pine.engine.repository.RuntimeRepository; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.fbo.FBOCreationData; +import com.pine.engine.service.resource.fbo.FBOService; +import com.pine.engine.service.resource.shader.GLSLType; +import com.pine.engine.service.resource.shader.ShaderService; +import com.pine.engine.service.resource.ssbo.SSBO; +import com.pine.engine.service.resource.ssbo.SSBOCreationData; +import com.pine.engine.service.resource.ubo.UBO; +import com.pine.engine.service.resource.ubo.UBOCreationData; +import com.pine.engine.service.resource.ubo.UBOData; +import com.pine.engine.service.resource.ubo.UBOService; +import com.pine.engine.service.streaming.ref.TextureResourceRef; +import com.pine.engine.service.voxelization.util.TextureUtil; +import org.lwjgl.opengl.GL46; +import org.lwjgl.system.MemoryUtil; + +import java.nio.FloatBuffer; +import java.util.ArrayList; +import java.util.List; + +import static com.pine.engine.Engine.MAX_LIGHTS; + +@PBean +public class CoreBufferRepository implements Initializable { + public static final int[] ZERO = new int[]{0}; + public static final int MAX_INFO_PER_LIGHT = 16; + private static final int LIGHT_BUFFER_SIZE = MAX_LIGHTS * MAX_INFO_PER_LIGHT; + + @PInject + public Engine engine; + @PInject + public ShaderService shaderService; + @PInject + public RuntimeRepository runtimeRepository; + @PInject + public UBOService uboService; + @PInject + public FBOService fboService; + + public final FloatBuffer lightSSBOState = MemoryUtil.memAllocFloat(LIGHT_BUFFER_SIZE); + public SSBO lightMetadataSSBO; + + public FBO gBufferTarget; + public FBO postProcessingBuffer; + public FBO ssao; + public FBO ssaoBlurred; + public FBO gBuffer; + public FBO auxBufferQuaterRes; + public FBO sceneDepthCopy; + public final List upscaleBloom = new ArrayList<>(); + public final List downscaleBloom = new ArrayList<>(); + public final List all = new ArrayList<>(); + public FBO brdfFBO; + public FBO compositingBuffer; + public FBO windNoiseBuffer; + public FBO shadowsBuffer; + + public TextureResourceRef cloudNoiseTexture; + public TextureResourceRef cloudShapeTexture; + + public int shadowsSampler; + public int auxBufferQuaterResSampler; + public int windNoiseSampler; + public int sceneDepthCopySampler; + public int gBufferAlbedoSampler; + public int gBufferNormalSampler; + public int gBufferRMAOSampler; + public int gBufferMaterialSampler; + public int gBufferDepthIndexSampler; + public int gBufferIndirectSampler; + public int gBufferTargetSampler; + public int postProcessingSampler; + public int ssaoSampler; + public int ssaoBlurredSampler; + public int brdfSampler; + public int compositingSampler; + + public UBO globalDataUBO; + public final FloatBuffer globalDataBuffer = MemoryUtil.memAllocFloat(112); + + // TOOLS + public FBO outlineBuffer; + public int outlineSampler; + public TextureResourceRef icons; + // TOOLS + + @Override + public void onInitialize() { + cloudShapeTexture = TextureUtil.create3DTexture(128, 128, 128, GL46.GL_RGBA16F, GL46.GL_RGBA, GL46.GL_HALF_FLOAT); + cloudNoiseTexture = TextureUtil.create3DTexture(32, 32, 32, GL46.GL_RGBA16F, GL46.GL_RGBA, GL46.GL_HALF_FLOAT); + + globalDataUBO = uboService.create(new UBOCreationData( + "GlobalData", + new UBOData("viewProjection", GLSLType.MAT_4), // Offset: 0 + new UBOData("viewMatrix", GLSLType.MAT_4), // Offset: 16 + new UBOData("invViewMatrix", GLSLType.MAT_4), // Offset: 32 + new UBOData("cameraWorldPosition", GLSLType.VEC_4), // Offset: 48 + new UBOData("projectionMatrix", GLSLType.MAT_4), // Offset: 52 + new UBOData("invProjectionMatrix", GLSLType.MAT_4), // Offset: 68 + new UBOData("bufferResolution", GLSLType.VEC_2), // Offset: 84, 85 + new UBOData("logDepthFC", GLSLType.FLOAT), // Offset: 86 + new UBOData("timeOfDay", GLSLType.FLOAT), // Offset: 88 + + new UBOData("sunLightDirection", GLSLType.VEC_3), // Offset: 89, 90, 91 + new UBOData("sunLightIntensity", GLSLType.FLOAT), + new UBOData("sunLightColor", GLSLType.VEC_3), + new UBOData("sunShadowsResolution", GLSLType.FLOAT), + new UBOData("lightSpaceMatrix", GLSLType.MAT_4) + )); + + createFrameBuffers(); + } + + private void createFrameBuffers() { + + final int displayW = runtimeRepository.getDisplayW(); + final int displayH = runtimeRepository.getDisplayH(); + + final int halfResW = runtimeRepository.getDisplayW() / 2; + final int halfResH = runtimeRepository.getDisplayH() / 2; + + // TOOLS + outlineBuffer = fboService.create(new FBOCreationData(displayW, displayH, false) + .addSampler("Tool outline", 0, GL46.GL_R16F, GL46.GL_RED, GL46.GL_FLOAT, false, false)); + outlineSampler = outlineBuffer.getSamplers().getFirst(); + icons = TextureUtil.loadTextureFromResource("/textures/icons.png"); + // TOOLS + + windNoiseBuffer = fboService.create(new FBOCreationData(256, 256, false) + .addSampler("Wind noise", 0, GL46.GL_RG16F, GL46.GL_RG, GL46.GL_FLOAT, false, true)); + windNoiseSampler = windNoiseBuffer.getSamplers().getFirst(); + + brdfFBO = fboService.create(new FBOCreationData(512, 512, false) + .addSampler("BRDF LUT", 0, GL46.GL_RG16F, GL46.GL_RG, GL46.GL_FLOAT, false, false)); + brdfSampler = brdfFBO.getSamplers().getFirst(); + + createGBuffer(displayW, displayH); + createMainBuffers(displayW, displayH); + + ssao = fboService.create(new FBOCreationData(halfResW, halfResH, false) + .addSampler("SSAO raw", 0, GL46.GL_R8, GL46.GL_RED, GL46.GL_UNSIGNED_BYTE, true, false)); + ssaoBlurred = fboService.create(new FBOCreationData(halfResW, halfResH, false) + .addSampler("SSAO final", 0, GL46.GL_R8, GL46.GL_RED, GL46.GL_UNSIGNED_BYTE, true, false)); + + int Q = 7; + int w = runtimeRepository.getDisplayW(); + int h = runtimeRepository.getDisplayH(); + for (int i = 0; i < Q; i++) { + w /= 2; + h /= 2; + downscaleBloom.add(fboService.create(new FBOCreationData(w, h, false) + .addSampler("Bloom downscale " + i * 2, 0, GL46.GL_RGBA, GL46.GL_RGBA, GL46.GL_UNSIGNED_BYTE, false, false))); + } + for (int i = 0; i < (Q / 2 - 1); i++) { + w *= 4; + h *= 4; + upscaleBloom.add(fboService.create(new FBOCreationData(w, h, false) + .addSampler("Bloom upscale " + i * 4, 0, GL46.GL_RGBA, GL46.GL_RGBA, GL46.GL_UNSIGNED_BYTE, false, false))); + } + + ssaoBlurredSampler = ssaoBlurred.getSamplers().getFirst(); + ssaoSampler = ssao.getSamplers().getFirst(); + + all.add(postProcessingBuffer); + all.add(gBuffer); + all.add(gBufferTarget); + all.add(ssao); + all.add(ssaoBlurred); + all.addAll(upscaleBloom); + all.addAll(downscaleBloom); + all.add(auxBufferQuaterRes); + all.add(compositingBuffer); + + lightMetadataSSBO = new SSBO(new SSBOCreationData( + 11, + (long) LIGHT_BUFFER_SIZE * GLSLType.FLOAT.getSize() + )); + } + + private void createGBuffer(int displayW, int displayH) { + gBuffer = fboService.create(new FBOCreationData(displayW, displayH, true) + .addSampler("G-Buffer albedo", 0, GL46.GL_RGBA8, GL46.GL_RGBA, GL46.GL_UNSIGNED_BYTE, false, false) // Albedo + Emissive flag + .addSampler("G-Buffer normal", 1, GL46.GL_RGB16F, GL46.GL_RGB, GL46.GL_FLOAT, false, false) // Normal + .addSampler("G-Buffer roughness | metallic | AO", 2, GL46.GL_RGB16F, GL46.GL_RGB, GL46.GL_FLOAT, false, false) // Roughness + Metallic + AO + + // X channel: 16 bits for anisotropicRotation + 16 bits for anisotropy + // Y channel: 16 bits for clearCoat + 16 bits for sheen + // Z channel: 16 bits for sheenTint + 15 bits for renderingMode + 1 bit for ssrEnabled + .addSampler("G-Buffer material info", 3, GL46.GL_RGB32F, GL46.GL_RGB, GL46.GL_FLOAT, false, false) + .addSampler("G-Buffer depth | render index | uv", 4, GL46.GL_RGBA32F, GL46.GL_RED, GL46.GL_FLOAT, false, false) // Log depth + render index + UV + .addSampler("G-Buffer indirect illumination", 5, GL46.GL_RGB16F, GL46.GL_RGB, GL46.GL_FLOAT, false, false)); + gBufferAlbedoSampler = gBuffer.getSamplers().get(0); + gBufferNormalSampler = gBuffer.getSamplers().get(1); + gBufferRMAOSampler = gBuffer.getSamplers().get(2); + gBufferMaterialSampler = gBuffer.getSamplers().get(3); + gBufferDepthIndexSampler = gBuffer.getSamplers().get(4); + gBufferIndirectSampler = gBuffer.getSamplers().get(5); + } + + private void createMainBuffers(int displayW, int displayH) { + gBufferTarget = fboService.create(new FBOCreationData(displayW, displayH, true) + .addSampler("Shaded G-Buffer", 0, GL46.GL_RGBA16F, GL46.GL_RGBA, GL46.GL_FLOAT, false, false)); + gBufferTargetSampler = gBufferTarget.getSamplers().getFirst(); + + compositingBuffer = fboService.create(new FBOCreationData(displayW, displayH, false) + .addSampler("Compositing", 0, GL46.GL_RGB16F, GL46.GL_RGB, GL46.GL_FLOAT, false, false)); + compositingSampler = compositingBuffer.getSamplers().getFirst(); + + auxBufferQuaterRes = fboService.create(new FBOCreationData(displayW / 4, displayH / 4, false) + .addSampler("Aux compositing", 0, GL46.GL_RGB16F, GL46.GL_RGB, GL46.GL_FLOAT, true, false)); + auxBufferQuaterResSampler = auxBufferQuaterRes.getMainSampler(); + + postProcessingBuffer = fboService.create(new FBOCreationData(displayW, displayH, false) + .addSampler("Post processing", 0, GL46.GL_RGB, GL46.GL_RGB, GL46.GL_UNSIGNED_BYTE, false, false)); + postProcessingSampler = postProcessingBuffer.getSamplers().getFirst(); + + sceneDepthCopy = fboService.create(new FBOCreationData(displayW, displayH, false) + .addSampler("Scene depth copy", 0, GL46.GL_RG32F, GL46.GL_RG, GL46.GL_FLOAT, false, false)); + sceneDepthCopySampler = sceneDepthCopy.getSamplers().getFirst(); + } +} diff --git a/engine/src/main/java/com/pine/repository/core/CoreMeshRepository.java b/src/main/java/com/pine/engine/repository/core/CoreMeshRepository.java similarity index 65% rename from engine/src/main/java/com/pine/repository/core/CoreMeshRepository.java rename to src/main/java/com/pine/engine/repository/core/CoreMeshRepository.java index 9e3a9048..2ec120c2 100644 --- a/engine/src/main/java/com/pine/repository/core/CoreMeshRepository.java +++ b/src/main/java/com/pine/engine/repository/core/CoreMeshRepository.java @@ -1,31 +1,22 @@ -package com.pine.repository.core; +package com.pine.engine.repository.core; -import com.pine.Engine; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.service.importer.data.MeshImportData; -import com.pine.service.streaming.ref.MeshResourceRef; +import com.pine.common.Initializable; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.engine.Engine; +import com.pine.engine.service.importer.data.MeshImportData; +import com.pine.engine.service.streaming.ref.MeshResourceRef; @PBean -public class CoreMeshRepository implements CoreRepository { +public class CoreMeshRepository implements Initializable { @PInject public Engine engine; - public MeshResourceRef planeMesh; public MeshResourceRef quadMesh; public MeshResourceRef cubeMesh; @Override - public void initialize() { - planeMesh = new MeshResourceRef(""); - planeMesh.load(new MeshImportData( - null, - new float[]{-1, 0, 1, 1, 0, 1, -1, 0, -1, 1, 0, -1}, - new int[]{0, 1, 3, 0, 3, 2}, - null, - null - )); - + public void onInitialize() { cubeMesh = new MeshResourceRef(""); cubeMesh.load(new MeshImportData( null, @@ -44,11 +35,4 @@ public void initialize() { null )); } - - @Override - public void dispose() { - quadMesh.dispose(); - planeMesh.dispose(); - cubeMesh.dispose(); - } } diff --git a/src/main/java/com/pine/engine/repository/core/CoreShaderRepository.java b/src/main/java/com/pine/engine/repository/core/CoreShaderRepository.java new file mode 100644 index 00000000..ce73ab62 --- /dev/null +++ b/src/main/java/com/pine/engine/repository/core/CoreShaderRepository.java @@ -0,0 +1,109 @@ +package com.pine.engine.repository.core; + +import com.pine.common.Initializable; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.ShaderCreationData; +import com.pine.engine.service.resource.shader.ShaderService; + +@PBean +public class CoreShaderRepository implements Initializable { + // TOOLS + public Shader outlineShader; + public Shader gridShader; + public Shader outlineBoxGenShader; + public Shader paintGizmoCompute; + public Shader paintGizmoRenderingShader; + public Shader outlineGenShader; + public Shader iconShader; + // TOOLS + + public Shader spriteShader; + public Shader gBufferShader; + public Shader gBufferTerrainShader; + public Shader gBufferDecalShader; + public Shader copyQuadShader; + public Shader gBufferFoliageShader; + public Shader foliageCullingCompute; + public Shader toScreenShader; + public Shader downscaleShader; + public Shader bilateralBlurShader; + public Shader bokehShader; + public Shader irradianceShader; + public Shader prefilteredShader; + public Shader ssgiShader; + public Shader mbShader; + public Shader ssaoShader; + public Shader boxBlurShader; + public Shader directShadowsShader; + public Shader omniDirectShadowsShader; + public Shader frameComposition; + public Shader bloomShader; + public Shader postProcessing; + public Shader gaussianShader; + public Shader upSamplingShader; + public Shader gBufferShading; + public Shader brdfShader; + public Shader voxelRaymarchingCompute; + public Shader cloudDetailCompute; + public Shader cloudShapeCompute; + public Shader cloudsRaymarcher; + public Shader compositingShader; + public Shader noiseShader; + public Shader shadowsTerrainShader; + public Shader shadowsPrimitiveShader; + public Shader terrainMaterialMaskGenShader; + + @PInject + public ShaderService shaderService; + + @Override + public void onInitialize() { + // TOOLS + outlineShader = shaderService.create(new ShaderCreationData("QUAD.vert", "tool/OUTLINE.frag")); + paintGizmoRenderingShader = shaderService.create(new ShaderCreationData("QUAD.vert", "tool/PAINT_GIZMO.frag")); + outlineGenShader = shaderService.create(new ShaderCreationData("tool/OUTLINE_GEN.vert", "tool/OUTLINE_GEN.frag")); + outlineBoxGenShader = shaderService.create(new ShaderCreationData("tool/OUTLINE_GEN.vert", "tool/OUTLINE_GEN_BOX.frag")); + gridShader = shaderService.create(new ShaderCreationData("QUAD.vert", "tool/GRID.frag")); + iconShader = shaderService.create(new ShaderCreationData("tool/ICON.vert", "tool/ICON.frag")); + paintGizmoCompute = shaderService.create(new ShaderCreationData("compute/PAINT_GIZMO_COMPUTE.glsl")); + + + terrainMaterialMaskGenShader = shaderService.create(new ShaderCreationData("QUAD.vert", "TERRAIN_MATERIAL_MASK_GEN.frag")); + compositingShader = shaderService.create(new ShaderCreationData("QUAD.vert", "COMPOSITE.frag")); + noiseShader = shaderService.create(new ShaderCreationData("QUAD.vert", "NOISE.frag")); + gBufferShading = shaderService.create(new ShaderCreationData("QUAD.vert", "uber/G_BUFFER_SHADING.frag")); + brdfShader = shaderService.create(new ShaderCreationData("QUAD.vert", "BRDF_GEN.frag")); + spriteShader = shaderService.create(new ShaderCreationData("SPRITE.vert", "SPRITE.frag")); + gBufferShader = shaderService.create(new ShaderCreationData("uber/G_BUFFER.vert", "uber/G_BUFFER.frag")); + shadowsPrimitiveShader = shaderService.create(new ShaderCreationData("shadows/PRIMITIVE.vert", "shadows/EMPTY.frag")); + gBufferTerrainShader = shaderService.create(new ShaderCreationData("uber/G_BUFFER_TERRAIN.vert", "uber/G_BUFFER_TERRAIN.frag")); + shadowsTerrainShader = shaderService.create(new ShaderCreationData("shadows/TERRAIN.vert", "shadows/EMPTY.frag")); + gBufferFoliageShader = shaderService.create(new ShaderCreationData("uber/G_BUFFER_FOLIAGE.vert", "uber/G_BUFFER.frag")); + foliageCullingCompute = shaderService.create(new ShaderCreationData("compute/FOLIAGE_CULLING_COMPUTE.glsl")); + toScreenShader = shaderService.create(new ShaderCreationData("QUAD.vert", "TO_SCREEN.frag")); + downscaleShader = shaderService.create(new ShaderCreationData("QUAD.vert", "BILINEAR_DOWNSCALE.glsl")); + bilateralBlurShader = shaderService.create(new ShaderCreationData("QUAD.vert", "BILATERAL_BLUR.glsl")); + bokehShader = shaderService.create(new ShaderCreationData("QUAD.vert", "BOKEH.frag")); + irradianceShader = shaderService.create(new ShaderCreationData("CUBEMAP.vert", "IRRADIANCE_MAP.frag")); + prefilteredShader = shaderService.create(new ShaderCreationData("CUBEMAP.vert", "PREFILTERED_MAP.frag")); + ssgiShader = shaderService.create(new ShaderCreationData("QUAD.vert", "SSGI.frag")); + mbShader = shaderService.create(new ShaderCreationData("QUAD.vert", "MOTION_BLUR.frag")); + ssaoShader = shaderService.create(new ShaderCreationData("QUAD.vert", "SSAO.frag")); + boxBlurShader = shaderService.create(new ShaderCreationData("QUAD.vert", "BOX-BLUR.frag")); + directShadowsShader = shaderService.create(new ShaderCreationData("SHADOWS.vert", "DIRECTIONAL_SHADOWS.frag")); + omniDirectShadowsShader = shaderService.create(new ShaderCreationData("SHADOWS.vert", "OMNIDIRECTIONAL_SHADOWS.frag")); + frameComposition = shaderService.create(new ShaderCreationData("QUAD.vert", "FRAME_COMPOSITION.frag")); + bloomShader = shaderService.create(new ShaderCreationData("QUAD.vert", "BRIGHTNESS_FILTER.frag")); + postProcessing = shaderService.create(new ShaderCreationData("QUAD.vert", "LENS_POST_PROCESSING.frag")); + gaussianShader = shaderService.create(new ShaderCreationData("QUAD.vert", "GAUSSIAN.frag")); + upSamplingShader = shaderService.create(new ShaderCreationData("QUAD.vert", "UPSAMPLE_TENT.glsl")); + voxelRaymarchingCompute = shaderService.create(new ShaderCreationData("compute/VOXEL_RAY_MARCHING_COMPUTE.glsl")); + cloudDetailCompute = shaderService.create(new ShaderCreationData("compute/CLOUD_DETAIL_COMPUTE.glsl")); + cloudShapeCompute = shaderService.create(new ShaderCreationData("compute/CLOUD_SHAPE_COMPUTE.glsl")); + cloudsRaymarcher = shaderService.create(new ShaderCreationData("QUAD.vert", "ATMOSPHERE.frag")); + gBufferDecalShader = shaderService.create(new ShaderCreationData("uber/G_BUFFER_DECAL.vert", "uber/G_BUFFER.frag")); + copyQuadShader = shaderService.create(new ShaderCreationData("QUAD.vert", "QUAD_COPY.frag")); + } +} diff --git a/engine/src/main/java/com/pine/repository/rendering/RenderingMode.java b/src/main/java/com/pine/engine/repository/rendering/RenderingMode.java similarity index 72% rename from engine/src/main/java/com/pine/repository/rendering/RenderingMode.java rename to src/main/java/com/pine/engine/repository/rendering/RenderingMode.java index 24d27164..3f77c8b6 100644 --- a/engine/src/main/java/com/pine/repository/rendering/RenderingMode.java +++ b/src/main/java/com/pine/engine/repository/rendering/RenderingMode.java @@ -1,4 +1,4 @@ -package com.pine.repository.rendering; +package com.pine.engine.repository.rendering; public enum RenderingMode { LINES, diff --git a/engine/src/main/java/com/pine/repository/rendering/RenderingRepository.java b/src/main/java/com/pine/engine/repository/rendering/RenderingRepository.java similarity index 62% rename from engine/src/main/java/com/pine/repository/rendering/RenderingRepository.java rename to src/main/java/com/pine/engine/repository/rendering/RenderingRepository.java index 903e89de..8f67fd98 100644 --- a/engine/src/main/java/com/pine/repository/rendering/RenderingRepository.java +++ b/src/main/java/com/pine/engine/repository/rendering/RenderingRepository.java @@ -1,12 +1,12 @@ -package com.pine.repository.rendering; +package com.pine.engine.repository.rendering; -import com.pine.injection.PBean; -import com.pine.service.streaming.ref.EnvironmentMapResourceRef; +import com.pine.common.injection.PBean; +import com.pine.engine.service.streaming.ref.EnvironmentMapResourceRef; import java.util.HashMap; import java.util.Map; -import static com.pine.service.system.impl.AbstractGBufferPass.MAX_CUBE_MAPS; +import static com.pine.engine.service.system.impl.gbuffer.AbstractGBufferPass.MAX_CUBE_MAPS; @PBean public class RenderingRepository { diff --git a/engine/src/main/java/com/pine/repository/rendering/RenderingRequest.java b/src/main/java/com/pine/engine/repository/rendering/RenderingRequest.java similarity index 63% rename from engine/src/main/java/com/pine/repository/rendering/RenderingRequest.java rename to src/main/java/com/pine/engine/repository/rendering/RenderingRequest.java index c35c6980..2850d582 100644 --- a/engine/src/main/java/com/pine/repository/rendering/RenderingRequest.java +++ b/src/main/java/com/pine/engine/repository/rendering/RenderingRequest.java @@ -1,7 +1,7 @@ -package com.pine.repository.rendering; +package com.pine.engine.repository.rendering; -import com.pine.service.streaming.ref.MaterialResourceRef; -import com.pine.service.streaming.ref.MeshResourceRef; +import com.pine.engine.service.streaming.ref.MaterialResourceRef; +import com.pine.engine.service.streaming.ref.MeshResourceRef; import org.joml.Matrix4f; import java.io.Serializable; diff --git a/engine/src/main/java/com/pine/repository/streaming/AbstractResourceRef.java b/src/main/java/com/pine/engine/repository/streaming/AbstractResourceRef.java similarity index 82% rename from engine/src/main/java/com/pine/repository/streaming/AbstractResourceRef.java rename to src/main/java/com/pine/engine/repository/streaming/AbstractResourceRef.java index 3b37e82d..4cef668e 100644 --- a/engine/src/main/java/com/pine/repository/streaming/AbstractResourceRef.java +++ b/src/main/java/com/pine/engine/repository/streaming/AbstractResourceRef.java @@ -1,8 +1,8 @@ -package com.pine.repository.streaming; +package com.pine.engine.repository.streaming; -import com.pine.injection.Disposable; -import com.pine.messaging.Loggable; -import com.pine.service.streaming.data.StreamData; +import com.pine.common.injection.Disposable; +import com.pine.common.messaging.Loggable; +import com.pine.engine.service.streaming.data.StreamData; public abstract class AbstractResourceRef implements Disposable, Loggable { public transient boolean loaded = false; diff --git a/engine/src/main/java/com/pine/repository/streaming/StreamableResourceType.java b/src/main/java/com/pine/engine/repository/streaming/StreamableResourceType.java similarity index 95% rename from engine/src/main/java/com/pine/repository/streaming/StreamableResourceType.java rename to src/main/java/com/pine/engine/repository/streaming/StreamableResourceType.java index 31a9216a..0240bd3a 100644 --- a/engine/src/main/java/com/pine/repository/streaming/StreamableResourceType.java +++ b/src/main/java/com/pine/engine/repository/streaming/StreamableResourceType.java @@ -1,6 +1,6 @@ -package com.pine.repository.streaming; +package com.pine.engine.repository.streaming; -import com.pine.theme.Icons; +import com.pine.common.Icons; import java.io.Serializable; import java.util.Collections; diff --git a/engine/src/main/java/com/pine/repository/streaming/StreamingRepository.java b/src/main/java/com/pine/engine/repository/streaming/StreamingRepository.java similarity index 77% rename from engine/src/main/java/com/pine/repository/streaming/StreamingRepository.java rename to src/main/java/com/pine/engine/repository/streaming/StreamingRepository.java index d5576f6b..5054ade0 100644 --- a/engine/src/main/java/com/pine/repository/streaming/StreamingRepository.java +++ b/src/main/java/com/pine/engine/repository/streaming/StreamingRepository.java @@ -1,7 +1,7 @@ -package com.pine.repository.streaming; +package com.pine.engine.repository.streaming; -import com.pine.injection.PBean; -import com.pine.service.streaming.data.StreamData; +import com.pine.common.injection.PBean; +import com.pine.engine.service.streaming.data.StreamData; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/src/main/java/com/pine/engine/repository/terrain/AbstractDataInstance.java b/src/main/java/com/pine/engine/repository/terrain/AbstractDataInstance.java new file mode 100644 index 00000000..6b1a44a3 --- /dev/null +++ b/src/main/java/com/pine/engine/repository/terrain/AbstractDataInstance.java @@ -0,0 +1,34 @@ +package com.pine.engine.repository.terrain; + +import com.pine.common.injection.Disposable; +import com.pine.common.inspection.Color; +import com.pine.common.inspection.Inspectable; +import com.pine.common.inspection.InspectableField; + +import java.util.UUID; + +public abstract class AbstractDataInstance extends Inspectable implements Disposable { + + @InspectableField(label = "id", disabled = true) + public final String id = UUID.randomUUID().toString(); + + @InspectableField(label = "Name") + public String name; + @InspectableField(label = "Color ID") + public final Color color = new Color(); + + public AbstractDataInstance(int i) { + color.x = ((i >> 16) & 0xFF )/255f; + color.y = ((i >> 8) & 0xFF)/255f; + color.z = (i & 0xFF)/255f; + } + + @Override + public String getTitle() { + return name; + } + + @Override + public void dispose() { + } +} diff --git a/src/main/java/com/pine/engine/repository/terrain/FoliageInstance.java b/src/main/java/com/pine/engine/repository/terrain/FoliageInstance.java new file mode 100644 index 00000000..510b3227 --- /dev/null +++ b/src/main/java/com/pine/engine/repository/terrain/FoliageInstance.java @@ -0,0 +1,63 @@ +package com.pine.engine.repository.terrain; + +import com.pine.common.Icons; +import com.pine.common.injection.Disposable; +import com.pine.common.inspection.Inspectable; +import com.pine.common.inspection.InspectableField; +import com.pine.engine.inspection.ResourceTypeField; +import com.pine.engine.repository.streaming.StreamableResourceType; +import org.joml.Vector3f; +import org.lwjgl.opengl.GL46; + +public class FoliageInstance extends Inspectable implements Disposable { + @InspectableField(label = "Terrain material index", min = 0, max = 3) + public int materialMaskIndex = 0; + + @InspectableField(label = "Name") + public String name; + + @ResourceTypeField(type = StreamableResourceType.MATERIAL) + @InspectableField(label = "Material") + public String material; + + @ResourceTypeField(type = StreamableResourceType.MESH) + @InspectableField(label = "Mesh") + public String mesh; + + @InspectableField(label = "Max instances", min = 10) + public int maximumNumberOfInstances = 10_000; + public int prevMaximumNumberOfInstances = -1; + + @InspectableField(label = "Max distance from camera", min = 1) + public int maxDistanceFromCamera = 100; + + @InspectableField(label = "Object Scale") + public Vector3f objectScale = new Vector3f(1); + + public transient Integer indirectDrawBuffer; + public transient Integer atomicCounterBuffer; + public transient Integer transformationsBuffer; + + public FoliageInstance() { + name = "New foliage instance"; + } + + @Override + public String getTitle() { + return name; + } + + @Override + public String getIcon() { + return Icons.forest; + } + + @Override + public void dispose() { + if (transformationsBuffer != null) { + GL46.glDeleteBuffers(indirectDrawBuffer); + GL46.glDeleteBuffers(atomicCounterBuffer); + GL46.glDeleteBuffers(transformationsBuffer); + } + } +} diff --git a/src/main/java/com/pine/engine/repository/terrain/MaterialLayer.java b/src/main/java/com/pine/engine/repository/terrain/MaterialLayer.java new file mode 100644 index 00000000..653afee1 --- /dev/null +++ b/src/main/java/com/pine/engine/repository/terrain/MaterialLayer.java @@ -0,0 +1,53 @@ +package com.pine.engine.repository.terrain; + +import com.pine.common.Icons; +import com.pine.common.inspection.Inspectable; +import com.pine.common.inspection.InspectableField; +import com.pine.engine.inspection.ResourceTypeField; +import com.pine.engine.repository.streaming.StreamableResourceType; +import org.joml.Vector3f; +import org.joml.Vector4f; + +public class MaterialLayer extends Inspectable { + + public final Vector4f channel; + + @InspectableField(label = "Layer name") + public String name; + + @ResourceTypeField(type = StreamableResourceType.MATERIAL) + @InspectableField(label = "Material") + public String material; + + @InspectableField(label = "Weight") + public float weight = 1; + + public int channelFlag; + + public MaterialLayer(int channel) { + channelFlag = channel; + if (channel == 0) { + this.channel = new Vector4f(1, 0, 0, 0); + } else if (channel == 1) { + this.channel = new Vector4f(0, 1, 0, 0); + } else if (channel == 2) { + this.channel = new Vector4f(0, 0, 1, 0); + } else if (channel == 3) { + this.channel = new Vector4f(0, 0, 0, 1); + } else { + this.channel = new Vector4f(0, 0, 0, 0); + } + + name = "Material layer (" + channel + ")"; + } + + @Override + public String getTitle() { + return name; + } + + @Override + public String getIcon() { + return Icons.format_paint; + } +} diff --git a/src/main/java/com/pine/engine/repository/terrain/MaterialLayers.java b/src/main/java/com/pine/engine/repository/terrain/MaterialLayers.java new file mode 100644 index 00000000..6797fbe4 --- /dev/null +++ b/src/main/java/com/pine/engine/repository/terrain/MaterialLayers.java @@ -0,0 +1,43 @@ +package com.pine.engine.repository.terrain; + +import com.pine.common.Icons; +import com.pine.common.inspection.Inspectable; +import com.pine.common.inspection.InspectableField; +import com.pine.common.inspection.ListInspection; + +import java.util.ArrayList; +import java.util.List; + +public class MaterialLayers extends Inspectable { + + public static final int MAX_LAYERS = 4; + @InspectableField(group = "Materials", label = "Material A") + public final MaterialLayer materialLayerA = new MaterialLayer(0); + + @InspectableField(group = "Materials", label = "Material B") + public final MaterialLayer materialLayerB = new MaterialLayer(1); + + @InspectableField(group = "Materials", label = "Material C") + public final MaterialLayer materialLayerC = new MaterialLayer(2); + + @InspectableField(group = "Materials", label = "Material D") + public final MaterialLayer materialLayerD = new MaterialLayer(3); + + @Override + public String getTitle() { + return "Materials"; + } + + @Override + public String getIcon() { + return Icons.layers; + } + + public MaterialLayer getLayer(int i) { + if (i == 0) return materialLayerA; + else if (i == 1) return materialLayerB; + else if (i == 2) return materialLayerC; + else if (i == 3) return materialLayerD; + return null; + } +} diff --git a/engine/src/main/java/com/pine/repository/terrain/TerrainChunk.java b/src/main/java/com/pine/engine/repository/terrain/TerrainChunk.java similarity index 96% rename from engine/src/main/java/com/pine/repository/terrain/TerrainChunk.java rename to src/main/java/com/pine/engine/repository/terrain/TerrainChunk.java index f81038d3..c2eb0ee3 100644 --- a/engine/src/main/java/com/pine/repository/terrain/TerrainChunk.java +++ b/src/main/java/com/pine/engine/repository/terrain/TerrainChunk.java @@ -1,4 +1,4 @@ -package com.pine.repository.terrain; +package com.pine.engine.repository.terrain; public class TerrainChunk { public final float locationX; diff --git a/src/main/java/com/pine/engine/repository/terrain/TerrainRepository.java b/src/main/java/com/pine/engine/repository/terrain/TerrainRepository.java new file mode 100644 index 00000000..51a612bc --- /dev/null +++ b/src/main/java/com/pine/engine/repository/terrain/TerrainRepository.java @@ -0,0 +1,179 @@ +package com.pine.engine.repository.terrain; + +import com.pine.common.Icons; +import com.pine.common.SerializableRepository; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.common.inspection.ExecutableField; +import com.pine.common.inspection.Inspectable; +import com.pine.common.inspection.InspectableField; +import com.pine.common.inspection.ListInspection; +import com.pine.engine.inspection.ResourceTypeField; +import com.pine.engine.repository.core.CoreBufferRepository; +import com.pine.engine.repository.core.CoreMeshRepository; +import com.pine.engine.repository.core.CoreShaderRepository; +import com.pine.engine.repository.rendering.RenderingMode; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.importer.ImporterService; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.fbo.FBOCreationData; +import com.pine.engine.service.resource.fbo.FBOService; +import com.pine.engine.service.resource.shader.ShaderService; +import com.pine.engine.service.streaming.StreamingService; +import com.pine.engine.service.streaming.impl.MeshService; +import com.pine.engine.service.streaming.impl.TextureService; +import com.pine.engine.util.ImageUtil; +import org.joml.Vector2f; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL46; + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.*; + +@PBean +public class TerrainRepository extends Inspectable implements SerializableRepository { + public String materialMask = UUID.randomUUID().toString(); + public String heightMapTexture = UUID.randomUUID().toString(); + public TerrainChunk[] chunks = null; + + @PInject + public transient ImporterService importer; + @PInject + public transient ShaderService shaderService; + @PInject + public transient StreamingService streamingService; + @PInject + public transient FBOService fboService; + @PInject + public transient CoreShaderRepository coreShaderRepository; + @PInject + public transient CoreMeshRepository coreMeshRepository; + @PInject + public transient MeshService meshService; + @PInject + public transient TextureService textureService; + + @ExecutableField(label = "Re-Gen material mask") + public void genMaterialMask() { + String path = importer.getPathToFile(materialMask, StreamableResourceType.TEXTURE); + String pathToHeightMap = importer.getPathToFile(heightMapTexture, StreamableResourceType.TEXTURE); + var materialMask = streamingService.streamTextureSync(path); + var heightMap = streamingService.streamTextureSync(pathToHeightMap); + + if(heightMap != null && materialMask != null) { + FBO fbo = fboService.create(new FBOCreationData(materialMask.width, materialMask.height, false).addSampler("TESTTTTTTTTTTTTTT")); + + shaderService.bind(coreShaderRepository.terrainMaterialMaskGenShader); + fbo.startMapping(true); + + shaderService.bindVec4(materialLayers.materialLayerA.channel, coreShaderRepository.terrainMaterialMaskGenShader.addUniformDeclaration("color1")); + shaderService.bindVec4(materialLayers.materialLayerB.channel, coreShaderRepository.terrainMaterialMaskGenShader.addUniformDeclaration("color2")); + shaderService.bindVec4(materialLayers.materialLayerC.channel, coreShaderRepository.terrainMaterialMaskGenShader.addUniformDeclaration("color3")); + shaderService.bindVec4(materialLayers.materialLayerD.channel, coreShaderRepository.terrainMaterialMaskGenShader.addUniformDeclaration("color4")); + + shaderService.bindSampler2dDirect(heightMap.texture, 0); + + meshService.bind(coreMeshRepository.quadMesh); + meshService.setRenderingMode(RenderingMode.TRIANGLES); + GL46.glDisable(GL11.GL_DEPTH_TEST); + GL46.glDisable(GL11.GL_BLEND); + meshService.draw(); + shaderService.unbind(); + fbo.stop(); + GL46.glBindTexture(GL46.GL_TEXTURE_2D, 0); + + textureService.writeTexture(path, materialMask.width, materialMask.height, fbo.getMainSampler()); + fboService.dispose(fbo); + materialMask.dispose(); + streamingService.repository.streamed.remove(this.materialMask); + } + } + + @ExecutableField(label = "Import data") + public void importTerrain() { + new Thread(() -> { + tryDelete(materialMask); + tryDelete(heightMapTexture); + + int width = cellsX * quads; + int height = cellsZ * quads; + + String heightMapTextureLocal = UUID.randomUUID().toString(); + String materialMaskLocal = UUID.randomUUID().toString(); + + ImageUtil.generateTexture(width, height, importer.getPathToFile(heightMapTextureLocal, StreamableResourceType.TEXTURE)); + ImageUtil.generateTexture(width, height, importer.getPathToFile(materialMaskLocal, StreamableResourceType.TEXTURE)); + + if (heightMapTextureToImport != null) { + var targetPath = importer.getPathToFile(heightMapTextureLocal, StreamableResourceType.TEXTURE); + var originPath = importer.getPathToFile(heightMapTextureToImport, StreamableResourceType.TEXTURE); + ImageUtil.copyInto(originPath, targetPath, 1); + } + + var newChunks = new TerrainChunk[cellsX * cellsZ]; + int index = 0; + for (int x = 0; x < cellsX; x++) { + for (int z = 0; z < cellsZ; z++) { + float locationX = x * quads + offset.x; + float locationZ = z * quads + offset.y; + newChunks[index] = new TerrainChunk(locationX, locationZ, (float) Math.floor(locationX / quads), (float) Math.floor(locationZ / quads), x, z); + index++; + } + } + heightMapTexture = heightMapTextureLocal; + materialMask = materialMaskLocal; + chunks = newChunks; + }).start(); + } + + private void tryDelete(String id) { + try { + Files.delete(Paths.get(importer.getPathToFile(id, StreamableResourceType.TEXTURE))); + } catch (Exception ignored) { + } + } + + @InspectableField(label = "Render terrain") + public boolean enabled = false; + + @ResourceTypeField(type = StreamableResourceType.TEXTURE) + @InspectableField(label = "Height map to import") + public String heightMapTextureToImport; + + @InspectableField(group = "Terrain", label = "Casts shadows") + public boolean castsShadows = true; + + @InspectableField(group = "Terrain", label = "Cells X axis", min = 1) + public int cellsX = 2; + + @InspectableField(group = "Terrain", label = "Cells Z axis", min = 1) + public int cellsZ = 2; + + @InspectableField(group = "Terrain", label = "Quads per cell (X by X)", min = 1) + public int quads = 150; + + @InspectableField(group = "Terrain", label = "Height scale") + public float heightScale = 1; + + @InspectableField(group = "Terrain", label = "Offset") + public Vector2f offset = new Vector2f(0); + + @InspectableField(label = "Materials") + public MaterialLayers materialLayers = new MaterialLayers(); + + + @ListInspection(clazzType = FoliageInstance.class) + @InspectableField(label = "Foliage") + public final List foliage = new ArrayList<>(); + + @Override + public String getTitle() { + return "Terrain & Foliage"; + } + + @Override + public String getIcon() { + return Icons.terrain; + } +} diff --git a/engine/src/main/java/com/pine/service/camera/Camera.java b/src/main/java/com/pine/engine/service/camera/Camera.java similarity index 94% rename from engine/src/main/java/com/pine/service/camera/Camera.java rename to src/main/java/com/pine/engine/service/camera/Camera.java index 1dc87c9d..5b7e19c0 100644 --- a/engine/src/main/java/com/pine/service/camera/Camera.java +++ b/src/main/java/com/pine/engine/service/camera/Camera.java @@ -1,7 +1,7 @@ -package com.pine.service.camera; +package com.pine.engine.service.camera; -import com.pine.Mutable; +import com.pine.common.Mutable; import org.joml.Vector3f; import java.io.Serializable; diff --git a/engine/src/main/java/com/pine/service/camera/CameraMovementService.java b/src/main/java/com/pine/engine/service/camera/CameraMovementService.java similarity index 85% rename from engine/src/main/java/com/pine/service/camera/CameraMovementService.java rename to src/main/java/com/pine/engine/service/camera/CameraMovementService.java index 9f91a93f..a168969d 100644 --- a/engine/src/main/java/com/pine/service/camera/CameraMovementService.java +++ b/src/main/java/com/pine/engine/service/camera/CameraMovementService.java @@ -1,15 +1,16 @@ -package com.pine.service.camera; +package com.pine.engine.service.camera; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.repository.CameraRepository; -import com.pine.repository.ClockRepository; -import com.pine.repository.RuntimeRepository; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.engine.repository.CameraRepository; +import com.pine.engine.repository.ClockRepository; +import com.pine.engine.repository.RuntimeRepository; import org.joml.Vector3f; @PBean public class CameraMovementService { - public static final float PI_2 = (float) ((float) Math.PI / 2.0); + public static final float PI_OVER_2 = (float) ((float) Math.PI / 2.0); + public static final float PI_2 = (float) ((float) Math.PI * 2.0); private static final float MIN_MAX_PITCH = (float) Math.toRadians(89.0f); private final Vector3f toApplyTranslation = new Vector3f(0); private final Vector3f xAxis = new Vector3f(); @@ -32,9 +33,9 @@ private void handleInputInternal(Camera camera) { (float) -Math.cos(camera.yaw) * (float) Math.cos(camera.pitch) // -cos(yaw) ); Vector3f right = new Vector3f( - (float) Math.sin(camera.yaw - PI_2), + (float) Math.sin(camera.yaw - PI_OVER_2), 0, - (float) Math.cos(camera.yaw - PI_2) + (float) Math.cos(camera.yaw - PI_OVER_2) ); forward.normalize(); right.normalize(); @@ -93,6 +94,10 @@ final protected void handleMouse(Camera camera, boolean isFirstMovement) { updateDelta(isFirstMovement); camera.yaw -= (float) Math.toRadians(cameraRepository.deltaX); + if (Math.abs(camera.yaw) >= PI_2) { + float mapped = Math.abs(camera.yaw) - PI_2; + camera.yaw = camera.yaw < 0 ? -1 * mapped : mapped; + } camera.pitch += (float) Math.toRadians(cameraRepository.deltaY); camera.pitch = Math.max(-MIN_MAX_PITCH, Math.min(MIN_MAX_PITCH, camera.pitch)); diff --git a/engine/src/main/java/com/pine/service/camera/CameraService.java b/src/main/java/com/pine/engine/service/camera/CameraService.java similarity index 88% rename from engine/src/main/java/com/pine/service/camera/CameraService.java rename to src/main/java/com/pine/engine/service/camera/CameraService.java index 2d21f8de..6e1c8081 100644 --- a/engine/src/main/java/com/pine/service/camera/CameraService.java +++ b/src/main/java/com/pine/engine/service/camera/CameraService.java @@ -1,12 +1,12 @@ -package com.pine.service.camera; +package com.pine.engine.service.camera; -import com.pine.EngineUtils; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.repository.CameraRepository; -import com.pine.repository.RuntimeRepository; -import com.pine.repository.core.CoreBufferRepository; -import com.pine.tasks.SyncTask; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.engine.repository.CameraRepository; +import com.pine.engine.repository.RuntimeRepository; +import com.pine.engine.repository.core.CoreBufferRepository; +import com.pine.engine.tasks.SyncTask; +import com.pine.engine.util.EngineUtils; @PBean public class CameraService implements SyncTask { diff --git a/engine/src/main/java/com/pine/service/camera/Frustum.java b/src/main/java/com/pine/engine/service/camera/Frustum.java similarity index 95% rename from engine/src/main/java/com/pine/service/camera/Frustum.java rename to src/main/java/com/pine/engine/service/camera/Frustum.java index 1913412c..4afde171 100644 --- a/engine/src/main/java/com/pine/service/camera/Frustum.java +++ b/src/main/java/com/pine/engine/service/camera/Frustum.java @@ -1,4 +1,4 @@ -package com.pine.service.camera; +package com.pine.engine.service.camera; import org.joml.Matrix4f; import org.joml.Vector3f; diff --git a/engine/src/main/java/com/pine/service/camera/Plane.java b/src/main/java/com/pine/engine/service/camera/Plane.java similarity index 90% rename from engine/src/main/java/com/pine/service/camera/Plane.java rename to src/main/java/com/pine/engine/service/camera/Plane.java index 0d3aa9ef..c996b3fc 100644 --- a/engine/src/main/java/com/pine/service/camera/Plane.java +++ b/src/main/java/com/pine/engine/service/camera/Plane.java @@ -1,4 +1,4 @@ -package com.pine.service.camera; +package com.pine.engine.service.camera; import org.joml.Vector3f; diff --git a/engine/src/main/java/com/pine/service/environment/CubeMapUtil.java b/src/main/java/com/pine/engine/service/environment/CubeMapUtil.java similarity index 91% rename from engine/src/main/java/com/pine/service/environment/CubeMapUtil.java rename to src/main/java/com/pine/engine/service/environment/CubeMapUtil.java index 447ede0b..995f3ae5 100644 --- a/engine/src/main/java/com/pine/service/environment/CubeMapUtil.java +++ b/src/main/java/com/pine/engine/service/environment/CubeMapUtil.java @@ -1,6 +1,6 @@ -package com.pine.service.environment; +package com.pine.engine.service.environment; -import com.pine.service.streaming.impl.CubeMapFace; +import com.pine.engine.service.streaming.impl.CubeMapFace; import org.lwjgl.opengl.GL46; import java.nio.ByteBuffer; diff --git a/engine/src/main/java/com/pine/service/environment/EnvironmentMapGenService.java b/src/main/java/com/pine/engine/service/environment/EnvironmentMapGenService.java similarity index 74% rename from engine/src/main/java/com/pine/service/environment/EnvironmentMapGenService.java rename to src/main/java/com/pine/engine/service/environment/EnvironmentMapGenService.java index 15190fb2..f1eed6f0 100644 --- a/engine/src/main/java/com/pine/service/environment/EnvironmentMapGenService.java +++ b/src/main/java/com/pine/engine/service/environment/EnvironmentMapGenService.java @@ -1,22 +1,23 @@ -package com.pine.service.environment; - -import com.pine.Engine; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.messaging.Loggable; -import com.pine.repository.CameraRepository; -import com.pine.repository.EngineRepository; -import com.pine.repository.RuntimeRepository; -import com.pine.repository.WorldRepository; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.repository.streaming.StreamingRepository; -import com.pine.service.camera.Camera; -import com.pine.service.grid.WorldService; -import com.pine.service.importer.ImporterService; -import com.pine.service.resource.ShaderService; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.streaming.impl.CubeMapFace; -import com.pine.service.streaming.impl.TextureService; +package com.pine.engine.service.environment; + +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.common.messaging.Loggable; +import com.pine.engine.Engine; +import com.pine.engine.repository.CameraRepository; +import com.pine.engine.repository.EngineRepository; +import com.pine.engine.repository.RuntimeRepository; +import com.pine.engine.repository.WorldRepository; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.streaming.StreamingRepository; +import com.pine.engine.service.camera.Camera; +import com.pine.engine.service.importer.ImporterService; +import com.pine.engine.service.resource.fbo.FBOCreationData; +import com.pine.engine.service.resource.fbo.FBOService; +import com.pine.engine.service.resource.shader.ShaderService; +import com.pine.engine.service.streaming.impl.CubeMapFace; +import com.pine.engine.service.streaming.impl.TextureService; +import com.pine.engine.service.world.WorldService; import org.joml.Vector3f; @@ -31,6 +32,9 @@ public class EnvironmentMapGenService implements Loggable { @PInject public EngineRepository engineRepository; + @PInject + public FBOService fboService; + @PInject public ImporterService importerService; @@ -83,12 +87,12 @@ public void bake() { private void capture(String resourceId, Vector3f cameraPosition) { getLogger().warn("Baking probe {} at position X{} Y{} Z{}", resourceId, cameraPosition.x, cameraPosition.y, cameraPosition.z); int baseResolution = engineRepository.probeCaptureResolution; - var fbo = new FrameBufferObject(baseResolution, baseResolution).addSampler(); + var fbo = fboService.create(new FBOCreationData(baseResolution, baseResolution, false).addSampler("Environment map")); engine.setTargetFBO(fbo); for (int i = 0; i < CubeMapFace.values().length; i++) { generate(i, resourceId, cameraPosition); } - fbo.dispose(); + fboService.dispose(fbo); } private void generate(int index, String resourceId, Vector3f cameraPosition) { diff --git a/engine/src/main/java/com/pine/service/importer/AbstractImporter.java b/src/main/java/com/pine/engine/service/importer/AbstractImporter.java similarity index 71% rename from engine/src/main/java/com/pine/service/importer/AbstractImporter.java rename to src/main/java/com/pine/engine/service/importer/AbstractImporter.java index 4b5e983a..2b7318ed 100644 --- a/engine/src/main/java/com/pine/service/importer/AbstractImporter.java +++ b/src/main/java/com/pine/engine/service/importer/AbstractImporter.java @@ -1,12 +1,12 @@ -package com.pine.service.importer; +package com.pine.engine.service.importer; -import com.pine.Engine; import com.pine.FSUtil; -import com.pine.injection.PInject; -import com.pine.messaging.Loggable; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.importer.data.AbstractImportData; -import com.pine.service.importer.metadata.AbstractResourceMetadata; +import com.pine.common.injection.PInject; +import com.pine.common.messaging.Loggable; +import com.pine.engine.Engine; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.importer.data.AbstractImportData; +import com.pine.engine.service.importer.metadata.AbstractResourceMetadata; import java.io.File; import java.util.List; diff --git a/engine/src/main/java/com/pine/service/importer/ImporterService.java b/src/main/java/com/pine/engine/service/importer/ImporterService.java similarity index 90% rename from engine/src/main/java/com/pine/service/importer/ImporterService.java rename to src/main/java/com/pine/engine/service/importer/ImporterService.java index 1229d6d0..603ff15f 100644 --- a/engine/src/main/java/com/pine/service/importer/ImporterService.java +++ b/src/main/java/com/pine/engine/service/importer/ImporterService.java @@ -1,14 +1,14 @@ -package com.pine.service.importer; +package com.pine.engine.service.importer; -import com.pine.Engine; import com.pine.FSUtil; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.injection.PostCreation; -import com.pine.messaging.Loggable; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.importer.data.AbstractImportData; -import com.pine.service.importer.metadata.AbstractResourceMetadata; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.common.injection.PostCreation; +import com.pine.common.messaging.Loggable; +import com.pine.engine.Engine; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.importer.data.AbstractImportData; +import com.pine.engine.service.importer.metadata.AbstractResourceMetadata; import java.io.File; import java.util.ArrayList; diff --git a/engine/src/main/java/com/pine/service/importer/data/AbstractImportData.java b/src/main/java/com/pine/engine/service/importer/data/AbstractImportData.java similarity index 77% rename from engine/src/main/java/com/pine/service/importer/data/AbstractImportData.java rename to src/main/java/com/pine/engine/service/importer/data/AbstractImportData.java index a9c57ff9..3b20805a 100644 --- a/engine/src/main/java/com/pine/service/importer/data/AbstractImportData.java +++ b/src/main/java/com/pine/engine/service/importer/data/AbstractImportData.java @@ -1,7 +1,7 @@ -package com.pine.service.importer.data; +package com.pine.engine.service.importer.data; -import com.pine.inspection.Inspectable; -import com.pine.repository.streaming.StreamableResourceType; +import com.pine.common.inspection.Inspectable; +import com.pine.engine.repository.streaming.StreamableResourceType; import java.io.Serializable; import java.util.UUID; diff --git a/engine/src/main/java/com/pine/service/importer/data/AudioImportData.java b/src/main/java/com/pine/engine/service/importer/data/AudioImportData.java similarity index 68% rename from engine/src/main/java/com/pine/service/importer/data/AudioImportData.java rename to src/main/java/com/pine/engine/service/importer/data/AudioImportData.java index a15c430f..9dac5966 100644 --- a/engine/src/main/java/com/pine/service/importer/data/AudioImportData.java +++ b/src/main/java/com/pine/engine/service/importer/data/AudioImportData.java @@ -1,6 +1,6 @@ -package com.pine.service.importer.data; +package com.pine.engine.service.importer.data; -import com.pine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.streaming.StreamableResourceType; public class AudioImportData extends AbstractImportData{ public AudioImportData(String name) { diff --git a/engine/src/main/java/com/pine/service/importer/data/MaterialImportData.java b/src/main/java/com/pine/engine/service/importer/data/MaterialImportData.java similarity index 89% rename from engine/src/main/java/com/pine/service/importer/data/MaterialImportData.java rename to src/main/java/com/pine/engine/service/importer/data/MaterialImportData.java index 34f6ab11..a8246202 100644 --- a/engine/src/main/java/com/pine/service/importer/data/MaterialImportData.java +++ b/src/main/java/com/pine/engine/service/importer/data/MaterialImportData.java @@ -1,10 +1,10 @@ -package com.pine.service.importer.data; +package com.pine.engine.service.importer.data; -import com.pine.inspection.Color; -import com.pine.inspection.InspectableField; -import com.pine.inspection.ResourceTypeField; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.type.MaterialRenderingMode; +import com.pine.common.inspection.Color; +import com.pine.common.inspection.InspectableField; +import com.pine.engine.inspection.ResourceTypeField; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.type.MaterialRenderingMode; public class MaterialImportData extends AbstractImportData { @InspectableField(group = "Fallback values", label = "Roughness", max = 1, min = 0) diff --git a/engine/src/main/java/com/pine/service/importer/data/MeshImportData.java b/src/main/java/com/pine/engine/service/importer/data/MeshImportData.java similarity index 77% rename from engine/src/main/java/com/pine/service/importer/data/MeshImportData.java rename to src/main/java/com/pine/engine/service/importer/data/MeshImportData.java index ca584ba4..b081edba 100644 --- a/engine/src/main/java/com/pine/service/importer/data/MeshImportData.java +++ b/src/main/java/com/pine/engine/service/importer/data/MeshImportData.java @@ -1,7 +1,7 @@ -package com.pine.service.importer.data; +package com.pine.engine.service.importer.data; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.streaming.data.StreamData; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.streaming.data.StreamData; public class MeshImportData extends AbstractImportData implements StreamData { public final float[] vertices; diff --git a/engine/src/main/java/com/pine/service/importer/data/SceneImportData.java b/src/main/java/com/pine/engine/service/importer/data/SceneImportData.java similarity index 72% rename from engine/src/main/java/com/pine/service/importer/data/SceneImportData.java rename to src/main/java/com/pine/engine/service/importer/data/SceneImportData.java index 85e3b221..f6ee181c 100644 --- a/engine/src/main/java/com/pine/service/importer/data/SceneImportData.java +++ b/src/main/java/com/pine/engine/service/importer/data/SceneImportData.java @@ -1,7 +1,7 @@ -package com.pine.service.importer.data; +package com.pine.engine.service.importer.data; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.streaming.data.StreamData; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.streaming.data.StreamData; import java.util.ArrayList; import java.util.List; diff --git a/engine/src/main/java/com/pine/service/importer/data/TextureImportData.java b/src/main/java/com/pine/engine/service/importer/data/TextureImportData.java similarity index 75% rename from engine/src/main/java/com/pine/service/importer/data/TextureImportData.java rename to src/main/java/com/pine/engine/service/importer/data/TextureImportData.java index 127ee82e..b3a6e0da 100644 --- a/engine/src/main/java/com/pine/service/importer/data/TextureImportData.java +++ b/src/main/java/com/pine/engine/service/importer/data/TextureImportData.java @@ -1,7 +1,7 @@ -package com.pine.service.importer.data; +package com.pine.engine.service.importer.data; import com.pine.FSUtil; -import com.pine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.streaming.StreamableResourceType; public class TextureImportData extends AbstractImportData{ public final String path; diff --git a/src/main/java/com/pine/engine/service/importer/impl/AudioImporter.java b/src/main/java/com/pine/engine/service/importer/impl/AudioImporter.java new file mode 100644 index 00000000..0970f77a --- /dev/null +++ b/src/main/java/com/pine/engine/service/importer/impl/AudioImporter.java @@ -0,0 +1,25 @@ +package com.pine.engine.service.importer.impl; + +import com.pine.common.injection.PBean; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.importer.AbstractImporter; +import com.pine.engine.service.importer.data.AbstractImportData; +import com.pine.engine.service.importer.data.AudioImportData; +import com.pine.engine.service.importer.metadata.AbstractResourceMetadata; +import com.pine.engine.service.importer.metadata.AudioResourceMetadata; + +@PBean +public class AudioImporter extends AbstractImporter { + + @Override + public StreamableResourceType getResourceType() { + return StreamableResourceType.AUDIO; + } + + @Override + public AbstractResourceMetadata persist(AbstractImportData data) { + var cast = (AudioImportData) data; + var file = persistInternal(data); + return new AudioResourceMetadata(data.name, data.id); + } +} diff --git a/engine/src/main/java/com/pine/service/importer/impl/MaterialImporter.java b/src/main/java/com/pine/engine/service/importer/impl/MaterialImporter.java similarity index 50% rename from engine/src/main/java/com/pine/service/importer/impl/MaterialImporter.java rename to src/main/java/com/pine/engine/service/importer/impl/MaterialImporter.java index 321febc7..ee09c032 100644 --- a/engine/src/main/java/com/pine/service/importer/impl/MaterialImporter.java +++ b/src/main/java/com/pine/engine/service/importer/impl/MaterialImporter.java @@ -1,12 +1,12 @@ -package com.pine.service.importer.impl; +package com.pine.engine.service.importer.impl; -import com.pine.injection.PBean; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.importer.AbstractImporter; -import com.pine.service.importer.data.AbstractImportData; -import com.pine.service.importer.data.MaterialImportData; -import com.pine.service.importer.metadata.AbstractResourceMetadata; -import com.pine.service.importer.metadata.MaterialResourceMetadata; +import com.pine.common.injection.PBean; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.importer.AbstractImporter; +import com.pine.engine.service.importer.data.AbstractImportData; +import com.pine.engine.service.importer.data.MaterialImportData; +import com.pine.engine.service.importer.metadata.AbstractResourceMetadata; +import com.pine.engine.service.importer.metadata.MaterialResourceMetadata; @PBean public class MaterialImporter extends AbstractImporter { diff --git a/engine/src/main/java/com/pine/service/importer/impl/MeshImporter.java b/src/main/java/com/pine/engine/service/importer/impl/MeshImporter.java similarity index 88% rename from engine/src/main/java/com/pine/service/importer/impl/MeshImporter.java rename to src/main/java/com/pine/engine/service/importer/impl/MeshImporter.java index 4571d0e4..fd93f48c 100644 --- a/engine/src/main/java/com/pine/service/importer/impl/MeshImporter.java +++ b/src/main/java/com/pine/engine/service/importer/impl/MeshImporter.java @@ -1,19 +1,19 @@ -package com.pine.service.importer.impl; +package com.pine.engine.service.importer.impl; import com.pine.FSUtil; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.importer.AbstractImporter; -import com.pine.service.importer.data.AbstractImportData; -import com.pine.service.importer.data.MaterialImportData; -import com.pine.service.importer.data.MeshImportData; -import com.pine.service.importer.data.SceneImportData; -import com.pine.service.importer.impl.mesh.AssimpMeshRepresentation; -import com.pine.service.importer.impl.mesh.MaterialTextureData; -import com.pine.service.importer.impl.mesh.MeshImporterUtil; -import com.pine.service.importer.metadata.AbstractResourceMetadata; -import com.pine.service.importer.metadata.MeshResourceMetadata; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.importer.AbstractImporter; +import com.pine.engine.service.importer.data.AbstractImportData; +import com.pine.engine.service.importer.data.MaterialImportData; +import com.pine.engine.service.importer.data.MeshImportData; +import com.pine.engine.service.importer.data.SceneImportData; +import com.pine.engine.service.importer.impl.mesh.AssimpMeshRepresentation; +import com.pine.engine.service.importer.impl.mesh.MaterialTextureData; +import com.pine.engine.service.importer.impl.mesh.MeshImporterUtil; +import com.pine.engine.service.importer.metadata.AbstractResourceMetadata; +import com.pine.engine.service.importer.metadata.MeshResourceMetadata; import org.lwjgl.PointerBuffer; import org.lwjgl.assimp.*; diff --git a/engine/src/main/java/com/pine/service/importer/impl/SceneImporter.java b/src/main/java/com/pine/engine/service/importer/impl/SceneImporter.java similarity index 56% rename from engine/src/main/java/com/pine/service/importer/impl/SceneImporter.java rename to src/main/java/com/pine/engine/service/importer/impl/SceneImporter.java index 6c649710..81265d64 100644 --- a/engine/src/main/java/com/pine/service/importer/impl/SceneImporter.java +++ b/src/main/java/com/pine/engine/service/importer/impl/SceneImporter.java @@ -1,12 +1,12 @@ -package com.pine.service.importer.impl; +package com.pine.engine.service.importer.impl; -import com.pine.injection.PBean; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.importer.AbstractImporter; -import com.pine.service.importer.data.AbstractImportData; -import com.pine.service.importer.data.SceneImportData; -import com.pine.service.importer.metadata.AbstractResourceMetadata; -import com.pine.service.importer.metadata.SceneResourceMetadata; +import com.pine.common.injection.PBean; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.importer.AbstractImporter; +import com.pine.engine.service.importer.data.AbstractImportData; +import com.pine.engine.service.importer.data.SceneImportData; +import com.pine.engine.service.importer.metadata.AbstractResourceMetadata; +import com.pine.engine.service.importer.metadata.SceneResourceMetadata; @PBean public class SceneImporter extends AbstractImporter { diff --git a/engine/src/main/java/com/pine/service/importer/impl/TextureImporter.java b/src/main/java/com/pine/engine/service/importer/impl/TextureImporter.java similarity index 81% rename from engine/src/main/java/com/pine/service/importer/impl/TextureImporter.java rename to src/main/java/com/pine/engine/service/importer/impl/TextureImporter.java index 773fcb13..d6837ef4 100644 --- a/engine/src/main/java/com/pine/service/importer/impl/TextureImporter.java +++ b/src/main/java/com/pine/engine/service/importer/impl/TextureImporter.java @@ -1,12 +1,12 @@ -package com.pine.service.importer.impl; +package com.pine.engine.service.importer.impl; -import com.pine.injection.PBean; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.importer.AbstractImporter; -import com.pine.service.importer.data.AbstractImportData; -import com.pine.service.importer.data.TextureImportData; -import com.pine.service.importer.metadata.AbstractResourceMetadata; -import com.pine.service.importer.metadata.TextureResourceMetadata; +import com.pine.common.injection.PBean; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.importer.AbstractImporter; +import com.pine.engine.service.importer.data.AbstractImportData; +import com.pine.engine.service.importer.data.TextureImportData; +import com.pine.engine.service.importer.metadata.AbstractResourceMetadata; +import com.pine.engine.service.importer.metadata.TextureResourceMetadata; import javax.imageio.ImageIO; import java.awt.*; diff --git a/engine/src/main/java/com/pine/service/importer/impl/mesh/AssimpMeshRepresentation.java b/src/main/java/com/pine/engine/service/importer/impl/mesh/AssimpMeshRepresentation.java similarity index 88% rename from engine/src/main/java/com/pine/service/importer/impl/mesh/AssimpMeshRepresentation.java rename to src/main/java/com/pine/engine/service/importer/impl/mesh/AssimpMeshRepresentation.java index 4ce86195..7c4203dd 100644 --- a/engine/src/main/java/com/pine/service/importer/impl/mesh/AssimpMeshRepresentation.java +++ b/src/main/java/com/pine/engine/service/importer/impl/mesh/AssimpMeshRepresentation.java @@ -1,4 +1,4 @@ -package com.pine.service.importer.impl.mesh; +package com.pine.engine.service.importer.impl.mesh; import java.util.ArrayList; import java.util.List; diff --git a/engine/src/main/java/com/pine/service/importer/impl/mesh/MaterialTextureData.java b/src/main/java/com/pine/engine/service/importer/impl/mesh/MaterialTextureData.java similarity index 59% rename from engine/src/main/java/com/pine/service/importer/impl/mesh/MaterialTextureData.java rename to src/main/java/com/pine/engine/service/importer/impl/mesh/MaterialTextureData.java index 181f1253..dc798eed 100644 --- a/engine/src/main/java/com/pine/service/importer/impl/mesh/MaterialTextureData.java +++ b/src/main/java/com/pine/engine/service/importer/impl/mesh/MaterialTextureData.java @@ -1,4 +1,4 @@ -package com.pine.service.importer.impl.mesh; +package com.pine.engine.service.importer.impl.mesh; public record MaterialTextureData(String path, String name, int type) { } diff --git a/engine/src/main/java/com/pine/service/importer/impl/mesh/MeshImporterUtil.java b/src/main/java/com/pine/engine/service/importer/impl/mesh/MeshImporterUtil.java similarity index 97% rename from engine/src/main/java/com/pine/service/importer/impl/mesh/MeshImporterUtil.java rename to src/main/java/com/pine/engine/service/importer/impl/mesh/MeshImporterUtil.java index 10fe2cf6..36886e74 100644 --- a/engine/src/main/java/com/pine/service/importer/impl/mesh/MeshImporterUtil.java +++ b/src/main/java/com/pine/engine/service/importer/impl/mesh/MeshImporterUtil.java @@ -1,6 +1,6 @@ -package com.pine.service.importer.impl.mesh; +package com.pine.engine.service.importer.impl.mesh; -import com.pine.service.importer.data.MeshImportData; +import com.pine.engine.service.importer.data.MeshImportData; import org.lwjgl.assimp.*; import java.nio.IntBuffer; diff --git a/engine/src/main/java/com/pine/service/importer/metadata/AbstractResourceMetadata.java b/src/main/java/com/pine/engine/service/importer/metadata/AbstractResourceMetadata.java similarity index 77% rename from engine/src/main/java/com/pine/service/importer/metadata/AbstractResourceMetadata.java rename to src/main/java/com/pine/engine/service/importer/metadata/AbstractResourceMetadata.java index 0efdd15b..fe8ae88b 100644 --- a/engine/src/main/java/com/pine/service/importer/metadata/AbstractResourceMetadata.java +++ b/src/main/java/com/pine/engine/service/importer/metadata/AbstractResourceMetadata.java @@ -1,9 +1,9 @@ -package com.pine.service.importer.metadata; +package com.pine.engine.service.importer.metadata; -import com.pine.inspection.Inspectable; -import com.pine.inspection.InspectableField; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.importer.ImporterService; +import com.pine.common.inspection.Inspectable; +import com.pine.common.inspection.InspectableField; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.importer.ImporterService; import java.io.Serializable; diff --git a/engine/src/main/java/com/pine/service/importer/metadata/AudioResourceMetadata.java b/src/main/java/com/pine/engine/service/importer/metadata/AudioResourceMetadata.java similarity index 70% rename from engine/src/main/java/com/pine/service/importer/metadata/AudioResourceMetadata.java rename to src/main/java/com/pine/engine/service/importer/metadata/AudioResourceMetadata.java index 8463ce7a..15d2d097 100644 --- a/engine/src/main/java/com/pine/service/importer/metadata/AudioResourceMetadata.java +++ b/src/main/java/com/pine/engine/service/importer/metadata/AudioResourceMetadata.java @@ -1,6 +1,6 @@ -package com.pine.service.importer.metadata; +package com.pine.engine.service.importer.metadata; -import com.pine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.streaming.StreamableResourceType; public class AudioResourceMetadata extends AbstractResourceMetadata { public AudioResourceMetadata(String name, String id) { diff --git a/engine/src/main/java/com/pine/service/importer/metadata/MaterialResourceMetadata.java b/src/main/java/com/pine/engine/service/importer/metadata/MaterialResourceMetadata.java similarity index 71% rename from engine/src/main/java/com/pine/service/importer/metadata/MaterialResourceMetadata.java rename to src/main/java/com/pine/engine/service/importer/metadata/MaterialResourceMetadata.java index ee0de378..9c29d8bc 100644 --- a/engine/src/main/java/com/pine/service/importer/metadata/MaterialResourceMetadata.java +++ b/src/main/java/com/pine/engine/service/importer/metadata/MaterialResourceMetadata.java @@ -1,6 +1,6 @@ -package com.pine.service.importer.metadata; +package com.pine.engine.service.importer.metadata; -import com.pine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.streaming.StreamableResourceType; public class MaterialResourceMetadata extends AbstractResourceMetadata { public MaterialResourceMetadata(String name, String id) { diff --git a/engine/src/main/java/com/pine/service/importer/metadata/MeshResourceMetadata.java b/src/main/java/com/pine/engine/service/importer/metadata/MeshResourceMetadata.java similarity index 84% rename from engine/src/main/java/com/pine/service/importer/metadata/MeshResourceMetadata.java rename to src/main/java/com/pine/engine/service/importer/metadata/MeshResourceMetadata.java index 524e1fad..92516f7b 100644 --- a/engine/src/main/java/com/pine/service/importer/metadata/MeshResourceMetadata.java +++ b/src/main/java/com/pine/engine/service/importer/metadata/MeshResourceMetadata.java @@ -1,7 +1,7 @@ -package com.pine.service.importer.metadata; +package com.pine.engine.service.importer.metadata; -import com.pine.inspection.InspectableField; -import com.pine.repository.streaming.StreamableResourceType; +import com.pine.common.inspection.InspectableField; +import com.pine.engine.repository.streaming.StreamableResourceType; public class MeshResourceMetadata extends AbstractResourceMetadata { @InspectableField(label = "Number of vertices", disabled = true) diff --git a/engine/src/main/java/com/pine/service/importer/metadata/SceneResourceMetadata.java b/src/main/java/com/pine/engine/service/importer/metadata/SceneResourceMetadata.java similarity index 72% rename from engine/src/main/java/com/pine/service/importer/metadata/SceneResourceMetadata.java rename to src/main/java/com/pine/engine/service/importer/metadata/SceneResourceMetadata.java index 9b3770f0..71e6ef37 100644 --- a/engine/src/main/java/com/pine/service/importer/metadata/SceneResourceMetadata.java +++ b/src/main/java/com/pine/engine/service/importer/metadata/SceneResourceMetadata.java @@ -1,7 +1,7 @@ -package com.pine.service.importer.metadata; +package com.pine.engine.service.importer.metadata; -import com.pine.inspection.InspectableField; -import com.pine.repository.streaming.StreamableResourceType; +import com.pine.common.inspection.InspectableField; +import com.pine.engine.repository.streaming.StreamableResourceType; public class SceneResourceMetadata extends AbstractResourceMetadata { diff --git a/engine/src/main/java/com/pine/service/importer/metadata/TextureResourceMetadata.java b/src/main/java/com/pine/engine/service/importer/metadata/TextureResourceMetadata.java similarity index 76% rename from engine/src/main/java/com/pine/service/importer/metadata/TextureResourceMetadata.java rename to src/main/java/com/pine/engine/service/importer/metadata/TextureResourceMetadata.java index 0e45ac89..8ff81dbe 100644 --- a/engine/src/main/java/com/pine/service/importer/metadata/TextureResourceMetadata.java +++ b/src/main/java/com/pine/engine/service/importer/metadata/TextureResourceMetadata.java @@ -1,8 +1,8 @@ -package com.pine.service.importer.metadata; +package com.pine.engine.service.importer.metadata; -import com.pine.inspection.InspectableField; -import com.pine.inspection.TypePreviewField; -import com.pine.repository.streaming.StreamableResourceType; +import com.pine.common.inspection.InspectableField; +import com.pine.engine.inspection.TypePreviewField; +import com.pine.engine.repository.streaming.StreamableResourceType; public class TextureResourceMetadata extends AbstractResourceMetadata { diff --git a/engine/src/main/java/com/pine/service/rendering/LightService.java b/src/main/java/com/pine/engine/service/rendering/LightService.java similarity index 84% rename from engine/src/main/java/com/pine/service/rendering/LightService.java rename to src/main/java/com/pine/engine/service/rendering/LightService.java index 97ca287c..fb1da4be 100644 --- a/engine/src/main/java/com/pine/service/rendering/LightService.java +++ b/src/main/java/com/pine/engine/service/rendering/LightService.java @@ -1,17 +1,17 @@ -package com.pine.service.rendering; - -import com.pine.component.TransformationComponent; -import com.pine.component.light.AbstractLightComponent; -import com.pine.component.light.PointLightComponent; -import com.pine.component.light.SphereLightComponent; -import com.pine.component.light.SpotLightComponent; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.repository.CameraRepository; -import com.pine.repository.WorldRepository; -import com.pine.repository.core.CoreBufferRepository; -import com.pine.repository.rendering.RenderingRepository; -import com.pine.service.grid.WorldService; +package com.pine.engine.service.rendering; + +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.engine.component.TransformationComponent; +import com.pine.engine.component.light.AbstractLightComponent; +import com.pine.engine.component.light.PointLightComponent; +import com.pine.engine.component.light.SphereLightComponent; +import com.pine.engine.component.light.SpotLightComponent; +import com.pine.engine.repository.CameraRepository; +import com.pine.engine.repository.WorldRepository; +import com.pine.engine.repository.core.CoreBufferRepository; +import com.pine.engine.repository.rendering.RenderingRepository; +import com.pine.engine.service.world.WorldService; import org.joml.Matrix4f; import org.joml.Vector3f; diff --git a/engine/src/main/java/com/pine/service/rendering/RenderingRequestService.java b/src/main/java/com/pine/engine/service/rendering/RenderingRequestService.java similarity index 79% rename from engine/src/main/java/com/pine/service/rendering/RenderingRequestService.java rename to src/main/java/com/pine/engine/service/rendering/RenderingRequestService.java index d4d0cc7e..7eaac220 100644 --- a/engine/src/main/java/com/pine/service/rendering/RenderingRequestService.java +++ b/src/main/java/com/pine/engine/service/rendering/RenderingRequestService.java @@ -1,17 +1,18 @@ -package com.pine.service.rendering; - -import com.pine.component.CullingComponent; -import com.pine.component.MeshComponent; -import com.pine.component.TransformationComponent; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.repository.WorldRepository; -import com.pine.repository.rendering.RenderingRepository; -import com.pine.repository.rendering.RenderingRequest; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.streaming.StreamingService; -import com.pine.service.streaming.ref.MaterialResourceRef; -import com.pine.service.streaming.ref.MeshResourceRef; +package com.pine.engine.service.rendering; + +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.engine.component.CullingComponent; +import com.pine.engine.component.MeshComponent; +import com.pine.engine.component.TransformationComponent; +import com.pine.engine.repository.EngineRepository; +import com.pine.engine.repository.WorldRepository; +import com.pine.engine.repository.rendering.RenderingRepository; +import com.pine.engine.repository.rendering.RenderingRequest; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.streaming.StreamingService; +import com.pine.engine.service.streaming.ref.MaterialResourceRef; +import com.pine.engine.service.streaming.ref.MeshResourceRef; import org.jetbrains.annotations.Nullable; @PBean @@ -28,9 +29,12 @@ public class RenderingRequestService { @PInject public RenderingRepository renderingRepository; + @PInject + public EngineRepository engineRepository; + public void updateCullingStatus(CullingComponent component, TransformationComponent transform) { if (component != null) { - if (transformationService.isCulled(transform, component)) { + if (component.isCullingEnabled && !engineRepository.disableCullingGlobally && transformationService.isCulled(transform, component)) { worldRepository.culled.put(component.getEntityId(), true); } else { worldRepository.culled.remove(component.getEntityId()); diff --git a/src/main/java/com/pine/engine/service/rendering/RequestProcessingService.java b/src/main/java/com/pine/engine/service/rendering/RequestProcessingService.java new file mode 100644 index 00000000..7288010b --- /dev/null +++ b/src/main/java/com/pine/engine/service/rendering/RequestProcessingService.java @@ -0,0 +1,37 @@ +package com.pine.engine.service.rendering; + +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.common.inspection.FieldDTO; +import com.pine.common.messaging.Loggable; +import com.pine.engine.repository.WorldRepository; +import com.pine.engine.repository.streaming.StreamingRepository; +import com.pine.engine.service.request.AbstractRequest; +import com.pine.engine.service.request.UpdateFieldRequest; +import com.pine.engine.service.world.WorldService; + + +@PBean +public class RequestProcessingService implements Loggable { + @PInject + public WorldRepository world; + + @PInject + public WorldService worldService; + + @PInject + public StreamingRepository streamingRepository; + + public void addRequest(AbstractRequest request) { + try { + request.setup(world, streamingRepository, worldService); + request.run(); + } catch (Exception e) { + getLogger().error(e.getMessage(), e); + } + } + + public void defaultChangeHandler(FieldDTO field, Object value) { + addRequest(new UpdateFieldRequest(field, value)); + } +} diff --git a/engine/src/main/java/com/pine/service/rendering/TransformationService.java b/src/main/java/com/pine/engine/service/rendering/TransformationService.java similarity index 87% rename from engine/src/main/java/com/pine/service/rendering/TransformationService.java rename to src/main/java/com/pine/engine/service/rendering/TransformationService.java index 2704b845..b65747d9 100644 --- a/engine/src/main/java/com/pine/service/rendering/TransformationService.java +++ b/src/main/java/com/pine/engine/service/rendering/TransformationService.java @@ -1,14 +1,14 @@ -package com.pine.service.rendering; - -import com.pine.component.CullingComponent; -import com.pine.component.TransformationComponent; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.repository.CameraRepository; -import com.pine.repository.WorldRepository; -import com.pine.repository.rendering.RenderingRepository; -import com.pine.service.grid.WorldService; -import com.pine.tasks.AbstractTask; +package com.pine.engine.service.rendering; + +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.engine.component.CullingComponent; +import com.pine.engine.component.TransformationComponent; +import com.pine.engine.repository.CameraRepository; +import com.pine.engine.repository.WorldRepository; +import com.pine.engine.repository.rendering.RenderingRepository; +import com.pine.engine.service.world.WorldService; +import com.pine.engine.tasks.AbstractTask; import org.joml.Matrix4f; import org.joml.Vector3f; diff --git a/engine/src/main/java/com/pine/service/rendering/VertexBuffer.java b/src/main/java/com/pine/engine/service/rendering/VertexBuffer.java similarity index 96% rename from engine/src/main/java/com/pine/service/rendering/VertexBuffer.java rename to src/main/java/com/pine/engine/service/rendering/VertexBuffer.java index 16d38cc2..7f3dd7f4 100644 --- a/engine/src/main/java/com/pine/service/rendering/VertexBuffer.java +++ b/src/main/java/com/pine/engine/service/rendering/VertexBuffer.java @@ -1,4 +1,4 @@ -package com.pine.service.rendering; +package com.pine.engine.service.rendering; import org.lwjgl.opengl.GL46; diff --git a/engine/src/main/java/com/pine/service/request/AbstractRequest.java b/src/main/java/com/pine/engine/service/request/AbstractRequest.java similarity index 65% rename from engine/src/main/java/com/pine/service/request/AbstractRequest.java rename to src/main/java/com/pine/engine/service/request/AbstractRequest.java index 6f7b4e56..a4004779 100644 --- a/engine/src/main/java/com/pine/service/request/AbstractRequest.java +++ b/src/main/java/com/pine/engine/service/request/AbstractRequest.java @@ -1,9 +1,9 @@ -package com.pine.service.request; +package com.pine.engine.service.request; -import com.pine.messaging.Loggable; -import com.pine.repository.WorldRepository; -import com.pine.repository.streaming.StreamingRepository; -import com.pine.service.grid.WorldService; +import com.pine.common.messaging.Loggable; +import com.pine.engine.repository.WorldRepository; +import com.pine.engine.repository.streaming.StreamingRepository; +import com.pine.engine.service.world.WorldService; public abstract class AbstractRequest implements Loggable { public WorldRepository world; diff --git a/engine/src/main/java/com/pine/service/request/AddComponentRequest.java b/src/main/java/com/pine/engine/service/request/AddComponentRequest.java similarity index 88% rename from engine/src/main/java/com/pine/service/request/AddComponentRequest.java rename to src/main/java/com/pine/engine/service/request/AddComponentRequest.java index 960b3e14..b9ef10fe 100644 --- a/engine/src/main/java/com/pine/service/request/AddComponentRequest.java +++ b/src/main/java/com/pine/engine/service/request/AddComponentRequest.java @@ -1,8 +1,8 @@ -package com.pine.service.request; +package com.pine.engine.service.request; -import com.pine.component.ComponentType; -import com.pine.component.Entity; -import com.pine.repository.WorldRepository; +import com.pine.engine.component.ComponentType; +import com.pine.engine.component.Entity; +import com.pine.engine.repository.WorldRepository; import java.util.List; diff --git a/engine/src/main/java/com/pine/service/request/AddEntityRequest.java b/src/main/java/com/pine/engine/service/request/AddEntityRequest.java similarity index 82% rename from engine/src/main/java/com/pine/service/request/AddEntityRequest.java rename to src/main/java/com/pine/engine/service/request/AddEntityRequest.java index 11b215e5..37073aed 100644 --- a/engine/src/main/java/com/pine/service/request/AddEntityRequest.java +++ b/src/main/java/com/pine/engine/service/request/AddEntityRequest.java @@ -1,8 +1,8 @@ -package com.pine.service.request; +package com.pine.engine.service.request; -import com.pine.component.ComponentType; -import com.pine.component.Entity; -import com.pine.repository.WorldRepository; +import com.pine.engine.component.ComponentType; +import com.pine.engine.component.Entity; +import com.pine.engine.repository.WorldRepository; import java.util.Collections; import java.util.LinkedList; @@ -28,6 +28,7 @@ public Entity getResponse() { @Override public void run() { entity = new Entity(); + entity.setContainer(components.isEmpty()); world.entityMap.put(entity.id(), entity); world.parentChildren.putIfAbsent(WorldRepository.ROOT_ID, new LinkedList<>()); diff --git a/engine/src/main/java/com/pine/service/request/CopyEntitiesRequest.java b/src/main/java/com/pine/engine/service/request/CopyEntitiesRequest.java similarity index 92% rename from engine/src/main/java/com/pine/service/request/CopyEntitiesRequest.java rename to src/main/java/com/pine/engine/service/request/CopyEntitiesRequest.java index 0be57821..aa554e69 100644 --- a/engine/src/main/java/com/pine/service/request/CopyEntitiesRequest.java +++ b/src/main/java/com/pine/engine/service/request/CopyEntitiesRequest.java @@ -1,8 +1,8 @@ -package com.pine.service.request; +package com.pine.engine.service.request; -import com.pine.component.Entity; -import com.pine.messaging.Loggable; -import com.pine.repository.WorldRepository; +import com.pine.common.messaging.Loggable; +import com.pine.engine.component.Entity; +import com.pine.engine.repository.WorldRepository; import java.util.*; diff --git a/engine/src/main/java/com/pine/service/request/DeleteEntityRequest.java b/src/main/java/com/pine/engine/service/request/DeleteEntityRequest.java similarity index 91% rename from engine/src/main/java/com/pine/service/request/DeleteEntityRequest.java rename to src/main/java/com/pine/engine/service/request/DeleteEntityRequest.java index 787fb47c..d0d3198d 100644 --- a/engine/src/main/java/com/pine/service/request/DeleteEntityRequest.java +++ b/src/main/java/com/pine/engine/service/request/DeleteEntityRequest.java @@ -1,8 +1,7 @@ -package com.pine.service.request; +package com.pine.engine.service.request; -import com.pine.messaging.Loggable; -import com.pine.repository.WorldRepository; -import org.joml.Vector3f; +import com.pine.common.messaging.Loggable; +import com.pine.engine.repository.WorldRepository; import java.util.ArrayList; import java.util.Collection; diff --git a/engine/src/main/java/com/pine/service/request/HierarchyRequest.java b/src/main/java/com/pine/engine/service/request/HierarchyRequest.java similarity index 86% rename from engine/src/main/java/com/pine/service/request/HierarchyRequest.java rename to src/main/java/com/pine/engine/service/request/HierarchyRequest.java index 0785fb9a..5c5f94c8 100644 --- a/engine/src/main/java/com/pine/service/request/HierarchyRequest.java +++ b/src/main/java/com/pine/engine/service/request/HierarchyRequest.java @@ -1,7 +1,7 @@ -package com.pine.service.request; +package com.pine.engine.service.request; -import com.pine.component.Entity; -import com.pine.repository.WorldRepository; +import com.pine.engine.component.Entity; +import com.pine.engine.repository.WorldRepository; import javax.annotation.Nullable; import java.util.LinkedList; diff --git a/engine/src/main/java/com/pine/service/request/LoadSceneRequest.java b/src/main/java/com/pine/engine/service/request/LoadSceneRequest.java similarity index 84% rename from engine/src/main/java/com/pine/service/request/LoadSceneRequest.java rename to src/main/java/com/pine/engine/service/request/LoadSceneRequest.java index 274d2ed4..b2c78e85 100644 --- a/engine/src/main/java/com/pine/service/request/LoadSceneRequest.java +++ b/src/main/java/com/pine/engine/service/request/LoadSceneRequest.java @@ -1,9 +1,9 @@ -package com.pine.service.request; +package com.pine.engine.service.request; -import com.pine.component.ComponentType; -import com.pine.component.Entity; -import com.pine.component.MeshComponent; -import com.pine.service.importer.data.SceneImportData; +import com.pine.engine.component.ComponentType; +import com.pine.engine.component.Entity; +import com.pine.engine.component.MeshComponent; +import com.pine.engine.service.importer.data.SceneImportData; import java.util.Collections; import java.util.List; diff --git a/engine/src/main/java/com/pine/service/request/UpdateFieldRequest.java b/src/main/java/com/pine/engine/service/request/UpdateFieldRequest.java similarity index 92% rename from engine/src/main/java/com/pine/service/request/UpdateFieldRequest.java rename to src/main/java/com/pine/engine/service/request/UpdateFieldRequest.java index 4d36a1d5..528a060d 100644 --- a/engine/src/main/java/com/pine/service/request/UpdateFieldRequest.java +++ b/src/main/java/com/pine/engine/service/request/UpdateFieldRequest.java @@ -1,8 +1,8 @@ -package com.pine.service.request; +package com.pine.engine.service.request; -import com.pine.Mutable; -import com.pine.inspection.Color; -import com.pine.inspection.FieldDTO; +import com.pine.common.Mutable; +import com.pine.common.inspection.Color; +import com.pine.common.inspection.FieldDTO; import org.joml.Quaternionf; import org.joml.Vector2f; import org.joml.Vector3f; diff --git a/src/main/java/com/pine/engine/service/resource/AbstractEngineResource.java b/src/main/java/com/pine/engine/service/resource/AbstractEngineResource.java new file mode 100644 index 00000000..87c6813f --- /dev/null +++ b/src/main/java/com/pine/engine/service/resource/AbstractEngineResource.java @@ -0,0 +1,10 @@ +package com.pine.engine.service.resource; + +import com.pine.common.injection.Disposable; +import com.pine.common.messaging.Loggable; + +import java.util.UUID; + +public abstract class AbstractEngineResource implements Loggable, Disposable { + public final String id = UUID.randomUUID().toString(); +} diff --git a/src/main/java/com/pine/engine/service/resource/AbstractResourceService.java b/src/main/java/com/pine/engine/service/resource/AbstractResourceService.java new file mode 100644 index 00000000..1c8f3384 --- /dev/null +++ b/src/main/java/com/pine/engine/service/resource/AbstractResourceService.java @@ -0,0 +1,45 @@ +package com.pine.engine.service.resource; + +import com.pine.common.injection.Disposable; +import com.pine.common.injection.PInject; +import com.pine.common.messaging.Loggable; +import com.pine.engine.Engine; +import com.pine.engine.repository.RuntimeRepository; + +import java.util.HashMap; +import java.util.Map; + +public abstract class AbstractResourceService implements Loggable, Disposable { + protected final Map resources = new HashMap<>(); + + @PInject + public Engine engine; + + @PInject + public RuntimeRepository runtimeRepository; + + public T create(C data) { + T n = createInternal(data); + resources.put(n.id, n); + return n; + } + + protected abstract T createInternal(C data); + + protected abstract void unbind(); + + public abstract void bind(T instance); + + public void dispose(T instance) { + resources.remove(instance.id); + instance.dispose(); + } + + @Override + public void dispose() { + for(T resource : resources.values()) { + resource.dispose(); + } + resources.clear(); + } +} diff --git a/src/main/java/com/pine/engine/service/resource/IResourceCreationData.java b/src/main/java/com/pine/engine/service/resource/IResourceCreationData.java new file mode 100644 index 00000000..650cd391 --- /dev/null +++ b/src/main/java/com/pine/engine/service/resource/IResourceCreationData.java @@ -0,0 +1,4 @@ +package com.pine.engine.service.resource; + +public interface IResourceCreationData { +} diff --git a/engine/src/main/java/com/pine/service/resource/fbo/FrameBufferObject.java b/src/main/java/com/pine/engine/service/resource/fbo/FBO.java similarity index 87% rename from engine/src/main/java/com/pine/service/resource/fbo/FrameBufferObject.java rename to src/main/java/com/pine/engine/service/resource/fbo/FBO.java index 7abf7ba4..610b7ce1 100644 --- a/engine/src/main/java/com/pine/service/resource/fbo/FrameBufferObject.java +++ b/src/main/java/com/pine/engine/service/resource/fbo/FBO.java @@ -1,14 +1,14 @@ -package com.pine.service.resource.fbo; +package com.pine.engine.service.resource.fbo; -import com.pine.EngineUtils; -import com.pine.service.resource.IResource; +import com.pine.engine.service.resource.AbstractEngineResource; +import com.pine.engine.util.EngineUtils; import org.lwjgl.opengl.GL46; import java.nio.FloatBuffer; import java.util.ArrayList; import java.util.List; -public class FrameBufferObject implements IResource { +public class FBO extends AbstractEngineResource { public final int width; public final int height; private final int FBO; @@ -21,7 +21,7 @@ public class FrameBufferObject implements IResource { private int mainSampler; private int mainSamplerPrecision; - public FrameBufferObject(int width, int height) { + public FBO(int width, int height) { this.width = width; this.height = height; this.resolution[0] = width; @@ -81,33 +81,27 @@ public void depthTexture() { this.depthSampler, 0 ); + + stop(); } - public FrameBufferObject depthTest() { + public void depthTest() { use(); this.RBO = GL46.glGenRenderbuffers(); GL46.glBindRenderbuffer(GL46.GL_RENDERBUFFER, this.RBO); GL46.glRenderbufferStorage(GL46.GL_RENDERBUFFER, GL46.GL_DEPTH_COMPONENT24, this.width, this.height); GL46.glFramebufferRenderbuffer(GL46.GL_FRAMEBUFFER, GL46.GL_DEPTH_ATTACHMENT, GL46.GL_RENDERBUFFER, this.RBO); clearFlag = GL46.GL_COLOR_BUFFER_BIT | GL46.GL_DEPTH_BUFFER_BIT; - return this; - } - - public FrameBufferObject addSampler() { - addSampler(this.width, this.height, 0, GL46.GL_RGBA8, GL46.GL_RGBA, GL46.GL_UNSIGNED_BYTE, false, false); - return this; } - public FrameBufferObject addSampler(int attachment, int precision, int format, int type, boolean linear, boolean repeat) { + public void addSampler(int attachment, int precision, int format, int type, boolean linear, boolean repeat) { addSampler(this.width, this.height, attachment, precision, format, type, linear, repeat); - return this; } - private FrameBufferObject addSampler(int w, int h, int attachment, int precision, int format, int type, boolean linear, boolean repeat) { + private void addSampler(int w, int h, int attachment, int precision, int format, int type, boolean linear, boolean repeat) { use(); int texture = getTexture(w, h, precision, format, type, linear, repeat); registerTexture(attachment, precision, texture); - return this; } public void registerTexture(int attachment, int precision, int texture) { diff --git a/src/main/java/com/pine/engine/service/resource/fbo/FBOCreationData.java b/src/main/java/com/pine/engine/service/resource/fbo/FBOCreationData.java new file mode 100644 index 00000000..fbd14c7e --- /dev/null +++ b/src/main/java/com/pine/engine/service/resource/fbo/FBOCreationData.java @@ -0,0 +1,56 @@ +package com.pine.engine.service.resource.fbo; + +import com.pine.engine.service.resource.IResourceCreationData; +import org.lwjgl.opengl.GL46; + +import java.util.ArrayList; +import java.util.List; + +public class FBOCreationData implements IResourceCreationData { + private final List colors = new ArrayList<>(); + private boolean depthTexture; + private boolean depthTest; + private final Integer w; + private final Integer h; + + public FBOCreationData(int w, int h, boolean depthTest) { + this.depthTest = depthTest; + this.w = w; + this.h = h; + } + + public Integer getW() { + return w; + } + + public Integer getH() { + return h; + } + + public List getSamplers() { + return colors; + } + + public boolean isDepthTexture() { + return depthTexture; + } + + public FBOCreationData addSampler(String name, int attachment, int precision, int format, int type, boolean linear, boolean repeat) { + colors.add(new FBOTextureData(name, attachment, precision, format, type, linear, repeat)); + return this; + } + + public FBOCreationData addSampler(String name) { + addSampler(name, 0, GL46.GL_RGBA8, GL46.GL_RGBA, GL46.GL_UNSIGNED_BYTE, false, false); + return this; + } + + public FBOCreationData addDepthSampler(String name) { + colors.add(new FBOTextureData(name)); + return this; + } + + public boolean isDepthTest() { + return depthTest; + } +} diff --git a/src/main/java/com/pine/engine/service/resource/fbo/FBOService.java b/src/main/java/com/pine/engine/service/resource/fbo/FBOService.java new file mode 100644 index 00000000..92118d27 --- /dev/null +++ b/src/main/java/com/pine/engine/service/resource/fbo/FBOService.java @@ -0,0 +1,63 @@ +package com.pine.engine.service.resource.fbo; + +import com.pine.common.injection.PBean; +import com.pine.engine.service.resource.AbstractResourceService; + +import java.util.HashMap; +import java.util.Map; + +@PBean +public class FBOService extends AbstractResourceService { + public final Map data = new HashMap<>(); + private FBO current; + + @Override + protected FBO createInternal(FBOCreationData data) { + int w = runtimeRepository.getDisplayW(); + int h = runtimeRepository.getDisplayH(); + if (data.getW() != null) { + w = data.getW(); + } + if (data.getH() != null) { + h = data.getH(); + } + var fbo = new FBO(w, h); + this.data.put(fbo.id, data); + data.getSamplers().forEach(color -> { + if (color.isDepth()) { + fbo.depthTexture(); + color.setId(fbo.getDepthSampler()); + } else { + fbo.addSampler(color.attachment(), color.precision(), color.format(), color.type(), color.linear(), color.repeat()); + color.setId(fbo.getSamplers().getLast()); + } + }); + + if (data.isDepthTest()) { + fbo.depthTest(); + } + return fbo; + } + + @Override + protected void unbind() { + if (current != null) { + current.stop(); + } + } + + @Override + public void bind(FBO instance) { + if (current == instance) { + return; + } + current = instance; + current.use(); + } + + @Override + public void dispose(FBO instance) { + super.dispose(instance); + this.data.remove(instance.id); + } +} diff --git a/src/main/java/com/pine/engine/service/resource/fbo/FBOTextureData.java b/src/main/java/com/pine/engine/service/resource/fbo/FBOTextureData.java new file mode 100644 index 00000000..c143a354 --- /dev/null +++ b/src/main/java/com/pine/engine/service/resource/fbo/FBOTextureData.java @@ -0,0 +1,79 @@ +package com.pine.engine.service.resource.fbo; + +import java.util.Objects; + +public final class FBOTextureData { + private final String name; + private final int attachment; + private final int precision; + private final int format; + private final int type; + private final boolean linear; + private final boolean repeat; + private final boolean isDepth; + private int id; + + public FBOTextureData(String name, int attachment, int precision, + int format, int type, + boolean linear, boolean repeat) { + this.name = name; + this.attachment = attachment; + this.precision = precision; + this.format = format; + this.type = type; + this.linear = linear; + this.repeat = repeat; + isDepth = false; + } + + public FBOTextureData(String name) { + this.name = name; + this.attachment = 0; + this.precision = 0; + this.format = 0; + this.type = 0; + this.linear = false; + this.repeat = false; + isDepth = true; + } + + public int id() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String name() { + return name; + } + + public int attachment() { + return attachment; + } + + public int precision() { + return precision; + } + + public int format() { + return format; + } + + public int type() { + return type; + } + + public boolean linear() { + return linear; + } + + public boolean repeat() { + return repeat; + } + + public boolean isDepth() { + return isDepth; + } +} diff --git a/engine/src/main/java/com/pine/service/resource/shader/ComputeRuntimeData.java b/src/main/java/com/pine/engine/service/resource/shader/ComputeRuntimeData.java similarity index 73% rename from engine/src/main/java/com/pine/service/resource/shader/ComputeRuntimeData.java rename to src/main/java/com/pine/engine/service/resource/shader/ComputeRuntimeData.java index 01dacb00..77c7134a 100644 --- a/engine/src/main/java/com/pine/service/resource/shader/ComputeRuntimeData.java +++ b/src/main/java/com/pine/engine/service/resource/shader/ComputeRuntimeData.java @@ -1,4 +1,4 @@ -package com.pine.service.resource.shader; +package com.pine.engine.service.resource.shader; public class ComputeRuntimeData { public int memoryBarrier; diff --git a/engine/src/main/java/com/pine/service/resource/shader/GLSLType.java b/src/main/java/com/pine/engine/service/resource/shader/GLSLType.java similarity index 93% rename from engine/src/main/java/com/pine/service/resource/shader/GLSLType.java rename to src/main/java/com/pine/engine/service/resource/shader/GLSLType.java index ae7c6b78..c565d94f 100644 --- a/engine/src/main/java/com/pine/service/resource/shader/GLSLType.java +++ b/src/main/java/com/pine/engine/service/resource/shader/GLSLType.java @@ -1,4 +1,4 @@ -package com.pine.service.resource.shader; +package com.pine.engine.service.resource.shader; public enum GLSLType { VEC_2(new int[]{8, 8}, 8), diff --git a/engine/src/main/java/com/pine/service/resource/shader/Shader.java b/src/main/java/com/pine/engine/service/resource/shader/Shader.java similarity index 92% rename from engine/src/main/java/com/pine/service/resource/shader/Shader.java rename to src/main/java/com/pine/engine/service/resource/shader/Shader.java index ec1ea06c..76d281f0 100644 --- a/engine/src/main/java/com/pine/service/resource/shader/Shader.java +++ b/src/main/java/com/pine/engine/service/resource/shader/Shader.java @@ -1,13 +1,13 @@ -package com.pine.service.resource.shader; +package com.pine.engine.service.resource.shader; -import com.pine.GLSLVersion; -import com.pine.service.resource.IResource; +import com.pine.common.GLSLVersion; +import com.pine.engine.service.resource.AbstractEngineResource; import org.lwjgl.opengl.GL46; import java.util.HashMap; import java.util.Map; -public class Shader implements IResource { +public class Shader extends AbstractEngineResource { private int program; private final Map uniforms = new HashMap<>(); private boolean valid = true; diff --git a/src/main/java/com/pine/engine/service/resource/shader/ShaderCreationData.java b/src/main/java/com/pine/engine/service/resource/shader/ShaderCreationData.java new file mode 100644 index 00000000..8df7b65f --- /dev/null +++ b/src/main/java/com/pine/engine/service/resource/shader/ShaderCreationData.java @@ -0,0 +1,21 @@ +package com.pine.engine.service.resource.shader; + +import com.pine.engine.service.resource.IResourceCreationData; + +public class ShaderCreationData implements IResourceCreationData { + public final String computePath; + public final String vertexPath; + public final String fragmentPath; + + public ShaderCreationData(String vertexPath, String fragmentPath) { + this.vertexPath = vertexPath; + this.fragmentPath = fragmentPath; + computePath = null; + } + + public ShaderCreationData(String computePath) { + this.vertexPath = null; + this.fragmentPath = null; + this.computePath = computePath; + } +} diff --git a/engine/src/main/java/com/pine/service/resource/ShaderService.java b/src/main/java/com/pine/engine/service/resource/shader/ShaderService.java similarity index 88% rename from engine/src/main/java/com/pine/service/resource/ShaderService.java rename to src/main/java/com/pine/engine/service/resource/shader/ShaderService.java index 184fabbc..4c1a2752 100644 --- a/engine/src/main/java/com/pine/service/resource/ShaderService.java +++ b/src/main/java/com/pine/engine/service/resource/shader/ShaderService.java @@ -1,15 +1,14 @@ -package com.pine.service.resource; +package com.pine.engine.service.resource.shader; import com.pine.FSUtil; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.repository.ClockRepository; -import com.pine.repository.core.CoreBufferRepository; -import com.pine.service.resource.shader.ComputeRuntimeData; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.streaming.ref.EnvironmentMapResourceRef; -import com.pine.service.streaming.ref.TextureResourceRef; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.engine.repository.ClockRepository; +import com.pine.engine.repository.core.CoreBufferRepository; +import com.pine.engine.service.resource.AbstractResourceService; +import com.pine.engine.service.resource.ubo.UBOService; +import com.pine.engine.service.streaming.ref.EnvironmentMapResourceRef; +import com.pine.engine.service.streaming.ref.TextureResourceRef; import org.jetbrains.annotations.Nullable; import org.joml.*; import org.lwjgl.opengl.GL46; @@ -21,7 +20,7 @@ import java.util.regex.Pattern; @PBean -public class ShaderService extends AbstractResourceService { +public class ShaderService extends AbstractResourceService { public static final ComputeRuntimeData COMPUTE_RUNTIME_DATA = new ComputeRuntimeData(); private int currentSamplerIndex = 0; @@ -57,6 +56,19 @@ public void bind(Shader instance) { } } + @Override + protected Shader createInternal(ShaderCreationData data) { + if (data.computePath != null) { + var compute = processShader(data.computePath); + var instance = new Shader(compute); + return bindWithUBO(compute, instance); + } + var vertex = processShader(data.vertexPath); + var fragment = processShader(data.fragmentPath); + var instance = new Shader(vertex, fragment); + return bindWithUBO(vertex + "\n" + fragment, instance); + } + @Override public void unbind() { GL46.glUseProgram(GL46.GL_NONE); @@ -215,17 +227,4 @@ public void bindSampler3dDirect(TextureResourceRef sampler, int bindingPoint) { GL46.glActiveTexture(GL46.GL_TEXTURE0 + bindingPoint); GL46.glBindTexture(GL46.GL_TEXTURE_3D, sampler.texture); } - - public Shader create(String compute) { - compute = processShader(compute); - var instance = new Shader(compute); - return bindWithUBO(compute, instance); - } - - public Shader create(String vertex, String fragment) { - vertex = processShader(vertex); - fragment = processShader(fragment); - var instance = new Shader(vertex, fragment); - return bindWithUBO(vertex + "\n" + fragment, instance); - } } diff --git a/engine/src/main/java/com/pine/service/resource/shader/UniformDTO.java b/src/main/java/com/pine/engine/service/resource/shader/UniformDTO.java similarity index 70% rename from engine/src/main/java/com/pine/service/resource/shader/UniformDTO.java rename to src/main/java/com/pine/engine/service/resource/shader/UniformDTO.java index a952d711..af91753a 100644 --- a/engine/src/main/java/com/pine/service/resource/shader/UniformDTO.java +++ b/src/main/java/com/pine/engine/service/resource/shader/UniformDTO.java @@ -1,7 +1,6 @@ -package com.pine.service.resource.shader; +package com.pine.engine.service.resource.shader; public class UniformDTO { - public static final UniformDTO EMPTY = new UniformDTO("empty", -1); private final String name; public final int location; diff --git a/engine/src/main/java/com/pine/service/resource/ssbo/ShaderStorageBufferObject.java b/src/main/java/com/pine/engine/service/resource/ssbo/SSBO.java similarity index 85% rename from engine/src/main/java/com/pine/service/resource/ssbo/ShaderStorageBufferObject.java rename to src/main/java/com/pine/engine/service/resource/ssbo/SSBO.java index 26c08c63..be50d5b2 100644 --- a/engine/src/main/java/com/pine/service/resource/ssbo/ShaderStorageBufferObject.java +++ b/src/main/java/com/pine/engine/service/resource/ssbo/SSBO.java @@ -1,18 +1,18 @@ -package com.pine.service.resource.ssbo; +package com.pine.engine.service.resource.ssbo; -import com.pine.service.resource.IResource; +import com.pine.engine.service.resource.AbstractEngineResource; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL46; import java.nio.FloatBuffer; import java.nio.IntBuffer; -public class ShaderStorageBufferObject implements IResource { +public class SSBO extends AbstractEngineResource { private int bindingPoint; private final int buffer; - public ShaderStorageBufferObject(SSBOCreationData dto) { + public SSBO(SSBOCreationData dto) { buffer = GL46.glCreateBuffers(); GL46.glBindBuffer(GL46.GL_SHADER_STORAGE_BUFFER, buffer); if (dto.getData() != null) { diff --git a/engine/src/main/java/com/pine/service/resource/ssbo/SSBOCreationData.java b/src/main/java/com/pine/engine/service/resource/ssbo/SSBOCreationData.java similarity index 76% rename from engine/src/main/java/com/pine/service/resource/ssbo/SSBOCreationData.java rename to src/main/java/com/pine/engine/service/resource/ssbo/SSBOCreationData.java index 535946e5..d40a86cd 100644 --- a/engine/src/main/java/com/pine/service/resource/ssbo/SSBOCreationData.java +++ b/src/main/java/com/pine/engine/service/resource/ssbo/SSBOCreationData.java @@ -1,8 +1,10 @@ -package com.pine.service.resource.ssbo; +package com.pine.engine.service.resource.ssbo; + +import com.pine.engine.service.resource.IResourceCreationData; import java.nio.Buffer; -public final class SSBOCreationData { +public final class SSBOCreationData implements IResourceCreationData { private final int bindingPoint; private Buffer data; private long expectedSize; diff --git a/src/main/java/com/pine/engine/service/resource/ssbo/SSBOService.java b/src/main/java/com/pine/engine/service/resource/ssbo/SSBOService.java new file mode 100644 index 00000000..72a6f01b --- /dev/null +++ b/src/main/java/com/pine/engine/service/resource/ssbo/SSBOService.java @@ -0,0 +1,32 @@ +package com.pine.engine.service.resource.ssbo; + +import com.pine.common.injection.PBean; +import com.pine.engine.service.resource.AbstractResourceService; +import org.lwjgl.opengl.GL46; + +import java.nio.FloatBuffer; + +@PBean +public class SSBOService extends AbstractResourceService { + + @Override + public void bind(SSBO instance) { + GL46.glBindBufferBase(GL46.GL_SHADER_STORAGE_BUFFER, instance.getBindingPoint(), instance.getBuffer()); + } + + @Override + protected SSBO createInternal(SSBOCreationData data) { + return new SSBO(data); + } + + @Override + public void unbind() { + GL46.glBindBuffer(GL46.GL_SHADER_STORAGE_BUFFER, GL46.GL_NONE); + } + + public void updateBuffer(SSBO ssbo, FloatBuffer data, int offset) { + bind(ssbo); + GL46.glBufferSubData(GL46.GL_SHADER_STORAGE_BUFFER, offset, data); + unbind(); + } +} diff --git a/engine/src/main/java/com/pine/service/resource/ubo/UniformBufferObject.java b/src/main/java/com/pine/engine/service/resource/ubo/UBO.java similarity index 52% rename from engine/src/main/java/com/pine/service/resource/ubo/UniformBufferObject.java rename to src/main/java/com/pine/engine/service/resource/ubo/UBO.java index bf70e747..581d4517 100644 --- a/engine/src/main/java/com/pine/service/resource/ubo/UniformBufferObject.java +++ b/src/main/java/com/pine/engine/service/resource/ubo/UBO.java @@ -1,28 +1,17 @@ -package com.pine.service.resource.ubo; +package com.pine.engine.service.resource.ubo; -import com.pine.service.resource.IResource; -import com.pine.service.resource.UBOService; +import com.pine.engine.service.resource.AbstractEngineResource; import org.lwjgl.opengl.GL46; -import java.util.ArrayList; -import java.util.List; - -public class UniformBufferObject implements IResource { +public class UBO extends AbstractEngineResource { private static int blockPointIncrement = 0; - private final List items = new ArrayList<>(); - private final List keys = new ArrayList<>(); private final int buffer; private final String blockName; private final int blockPoint; - public UniformBufferObject(UBOCreationData dto) { + public UBO(UBOCreationData dto) { int bufferSize = UBOService.calculateAllocation(dto.data()); - for (int i = 0; i < dto.data().size(); i++) { - UBOData data = dto.data().get(i); - items.add(new UBOItem(data.getOffset(), data.getDataSize(), data.getChunkSize())); - keys.add(data.getName()); - } this.blockName = dto.blockName(); this.blockPoint = blockPointIncrement++; @@ -37,18 +26,6 @@ public int getBuffer() { return buffer; } - public static int getBlockPointIncrement() { - return blockPointIncrement; - } - - public List getItems() { - return items; - } - - public List getKeys() { - return keys; - } - public String getBlockName() { return blockName; } diff --git a/engine/src/main/java/com/pine/service/resource/ubo/UBOCreationData.java b/src/main/java/com/pine/engine/service/resource/ubo/UBOCreationData.java similarity index 68% rename from engine/src/main/java/com/pine/service/resource/ubo/UBOCreationData.java rename to src/main/java/com/pine/engine/service/resource/ubo/UBOCreationData.java index 8175f8f1..157fd5ff 100644 --- a/engine/src/main/java/com/pine/service/resource/ubo/UBOCreationData.java +++ b/src/main/java/com/pine/engine/service/resource/ubo/UBOCreationData.java @@ -1,8 +1,10 @@ -package com.pine.service.resource.ubo; +package com.pine.engine.service.resource.ubo; + +import com.pine.engine.service.resource.IResourceCreationData; import java.util.List; -public class UBOCreationData { +public class UBOCreationData implements IResourceCreationData { private final List data; private final String blockName; diff --git a/engine/src/main/java/com/pine/service/resource/ubo/UBOData.java b/src/main/java/com/pine/engine/service/resource/ubo/UBOData.java similarity index 69% rename from engine/src/main/java/com/pine/service/resource/ubo/UBOData.java rename to src/main/java/com/pine/engine/service/resource/ubo/UBOData.java index e32c3180..4c52656f 100644 --- a/engine/src/main/java/com/pine/service/resource/ubo/UBOData.java +++ b/src/main/java/com/pine/engine/service/resource/ubo/UBOData.java @@ -1,14 +1,13 @@ -package com.pine.service.resource.ubo; +package com.pine.engine.service.resource.ubo; -import com.pine.service.resource.shader.GLSLType; +import com.pine.engine.service.resource.shader.GLSLType; public class UBOData { private final String name; private final GLSLType type; private Integer offset; - private Integer dataSize; private Integer chunkSize; - private Integer dataLength; + private final Integer dataLength; public UBOData(String name, GLSLType type) { this(name, type, null); @@ -36,14 +35,6 @@ public void setOffset(Integer offset) { this.offset = offset; } - public Integer getDataSize() { - return dataSize; - } - - public void setDataSize(Integer dataSize) { - this.dataSize = dataSize; - } - public Integer getChunkSize() { return chunkSize; } @@ -55,8 +46,4 @@ public void setChunkSize(Integer chunkSize) { public Integer getDataLength() { return dataLength; } - - public void setDataLength(Integer dataLength) { - this.dataLength = dataLength; - } } diff --git a/engine/src/main/java/com/pine/service/resource/UBOService.java b/src/main/java/com/pine/engine/service/resource/ubo/UBOService.java similarity index 78% rename from engine/src/main/java/com/pine/service/resource/UBOService.java rename to src/main/java/com/pine/engine/service/resource/ubo/UBOService.java index 7d5ccbd8..2d9e3c25 100644 --- a/engine/src/main/java/com/pine/service/resource/UBOService.java +++ b/src/main/java/com/pine/engine/service/resource/ubo/UBOService.java @@ -1,30 +1,34 @@ -package com.pine.service.resource; +package com.pine.engine.service.resource.ubo; -import com.pine.injection.PBean; -import com.pine.service.resource.shader.GLSLType; -import com.pine.service.resource.ubo.UBOData; -import com.pine.service.resource.ubo.UniformBufferObject; +import com.pine.common.injection.PBean; +import com.pine.engine.service.resource.AbstractResourceService; +import com.pine.engine.service.resource.shader.GLSLType; import org.lwjgl.opengl.GL46; import java.nio.FloatBuffer; import java.util.List; @PBean -public class UBOService extends AbstractResourceService { - private UniformBufferObject currentUBO; +public class UBOService extends AbstractResourceService { + private UBO currentUBO; @Override - public void bind(UniformBufferObject instance) { + public void bind(UBO instance) { currentUBO = instance; GL46.glBindBuffer(GL46.GL_UNIFORM_BUFFER, currentUBO.getBuffer()); } + @Override + protected UBO createInternal(UBOCreationData data) { + return new UBO(data); + } + @Override public void unbind() { GL46.glBindBuffer(GL46.GL_UNIFORM_BUFFER, GL46.GL_NONE); } - public void bindWithShader(UniformBufferObject ubo, int shaderProgram) { + public void bindWithShader(UBO ubo, int shaderProgram) { bind(ubo); GL46.glUseProgram(shaderProgram); int index = GL46.glGetUniformBlockIndex(shaderProgram, currentUBO.getBlockName()); @@ -32,7 +36,7 @@ public void bindWithShader(UniformBufferObject ubo, int shaderProgram) { unbind(); } - public void updateBuffer(UniformBufferObject ubo, FloatBuffer data, int offset) { + public void updateBuffer(UBO ubo, FloatBuffer data, int offset) { currentUBO = ubo; GL46.glBindBuffer(GL46.GL_UNIFORM_BUFFER, currentUBO.getBuffer()); GL46.glBufferSubData(GL46.GL_UNIFORM_BUFFER, offset, data); @@ -74,7 +78,6 @@ public static int calculateAllocation(List dataArray) { data.setOffset(offset); data.setChunkSize(size[1]); - data.setDataSize(size[1]); offset += size[1]; } diff --git a/engine/src/main/java/com/pine/service/streaming/LevelOfDetail.java b/src/main/java/com/pine/engine/service/streaming/LevelOfDetail.java similarity index 63% rename from engine/src/main/java/com/pine/service/streaming/LevelOfDetail.java rename to src/main/java/com/pine/engine/service/streaming/LevelOfDetail.java index 9bd0e893..ec33bcef 100644 --- a/engine/src/main/java/com/pine/service/streaming/LevelOfDetail.java +++ b/src/main/java/com/pine/engine/service/streaming/LevelOfDetail.java @@ -1,4 +1,4 @@ -package com.pine.service.streaming; +package com.pine.engine.service.streaming; public enum LevelOfDetail { LOD_0, diff --git a/engine/src/main/java/com/pine/service/streaming/StreamingService.java b/src/main/java/com/pine/engine/service/streaming/StreamingService.java similarity index 81% rename from engine/src/main/java/com/pine/service/streaming/StreamingService.java rename to src/main/java/com/pine/engine/service/streaming/StreamingService.java index ef7619e3..7f798d85 100644 --- a/engine/src/main/java/com/pine/service/streaming/StreamingService.java +++ b/src/main/java/com/pine/engine/service/streaming/StreamingService.java @@ -1,17 +1,17 @@ -package com.pine.service.streaming; +package com.pine.engine.service.streaming; -import com.pine.Engine; -import com.pine.injection.Disposable; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.messaging.Loggable; -import com.pine.repository.ClockRepository; -import com.pine.repository.streaming.AbstractResourceRef; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.repository.streaming.StreamingRepository; -import com.pine.service.streaming.impl.TextureService; -import com.pine.service.streaming.ref.TextureResourceRef; -import com.pine.tasks.SyncTask; +import com.pine.common.injection.Disposable; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.common.messaging.Loggable; +import com.pine.engine.Engine; +import com.pine.engine.repository.ClockRepository; +import com.pine.engine.repository.streaming.AbstractResourceRef; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.streaming.StreamingRepository; +import com.pine.engine.service.streaming.impl.TextureService; +import com.pine.engine.service.streaming.ref.TextureResourceRef; +import com.pine.engine.tasks.SyncTask; import java.util.Collections; import java.util.UUID; diff --git a/engine/src/main/java/com/pine/service/streaming/data/AudioStreamData.java b/src/main/java/com/pine/engine/service/streaming/data/AudioStreamData.java similarity index 60% rename from engine/src/main/java/com/pine/service/streaming/data/AudioStreamData.java rename to src/main/java/com/pine/engine/service/streaming/data/AudioStreamData.java index aa51f122..ccac273b 100644 --- a/engine/src/main/java/com/pine/service/streaming/data/AudioStreamData.java +++ b/src/main/java/com/pine/engine/service/streaming/data/AudioStreamData.java @@ -1,6 +1,6 @@ -package com.pine.service.streaming.data; +package com.pine.engine.service.streaming.data; -import com.pine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.streaming.StreamableResourceType; public class AudioStreamData implements StreamData { @Override diff --git a/engine/src/main/java/com/pine/service/streaming/data/EnvironmentMapStreamData.java b/src/main/java/com/pine/engine/service/streaming/data/EnvironmentMapStreamData.java similarity index 69% rename from engine/src/main/java/com/pine/service/streaming/data/EnvironmentMapStreamData.java rename to src/main/java/com/pine/engine/service/streaming/data/EnvironmentMapStreamData.java index be3f746b..44c6bec6 100644 --- a/engine/src/main/java/com/pine/service/streaming/data/EnvironmentMapStreamData.java +++ b/src/main/java/com/pine/engine/service/streaming/data/EnvironmentMapStreamData.java @@ -1,6 +1,6 @@ -package com.pine.service.streaming.data; +package com.pine.engine.service.streaming.data; -import com.pine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.streaming.StreamableResourceType; import java.nio.ByteBuffer; diff --git a/engine/src/main/java/com/pine/service/streaming/data/MaterialStreamData.java b/src/main/java/com/pine/engine/service/streaming/data/MaterialStreamData.java similarity index 76% rename from engine/src/main/java/com/pine/service/streaming/data/MaterialStreamData.java rename to src/main/java/com/pine/engine/service/streaming/data/MaterialStreamData.java index 795ba1c8..3f0f158e 100644 --- a/engine/src/main/java/com/pine/service/streaming/data/MaterialStreamData.java +++ b/src/main/java/com/pine/engine/service/streaming/data/MaterialStreamData.java @@ -1,9 +1,9 @@ -package com.pine.service.streaming.data; +package com.pine.engine.service.streaming.data; -import com.pine.inspection.Color; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.streaming.ref.TextureResourceRef; -import com.pine.type.MaterialRenderingMode; +import com.pine.common.inspection.Color; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.streaming.ref.TextureResourceRef; +import com.pine.engine.type.MaterialRenderingMode; public class MaterialStreamData implements StreamData { public TextureResourceRef heightMap; diff --git a/src/main/java/com/pine/engine/service/streaming/data/StreamData.java b/src/main/java/com/pine/engine/service/streaming/data/StreamData.java new file mode 100644 index 00000000..ed2b7c60 --- /dev/null +++ b/src/main/java/com/pine/engine/service/streaming/data/StreamData.java @@ -0,0 +1,7 @@ +package com.pine.engine.service.streaming.data; + +import com.pine.engine.repository.streaming.StreamableResourceType; + +public interface StreamData { + StreamableResourceType getResourceType(); +} diff --git a/engine/src/main/java/com/pine/service/streaming/data/TextureStreamData.java b/src/main/java/com/pine/engine/service/streaming/data/TextureStreamData.java similarity index 87% rename from engine/src/main/java/com/pine/service/streaming/data/TextureStreamData.java rename to src/main/java/com/pine/engine/service/streaming/data/TextureStreamData.java index 8d888c92..4730c5d2 100644 --- a/engine/src/main/java/com/pine/service/streaming/data/TextureStreamData.java +++ b/src/main/java/com/pine/engine/service/streaming/data/TextureStreamData.java @@ -1,6 +1,6 @@ -package com.pine.service.streaming.data; +package com.pine.engine.service.streaming.data; -import com.pine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.streaming.StreamableResourceType; import org.lwjgl.opengl.GL46; import java.nio.ByteBuffer; diff --git a/engine/src/main/java/com/pine/service/streaming/data/VoxelChunkStreamData.java b/src/main/java/com/pine/engine/service/streaming/data/VoxelChunkStreamData.java similarity index 66% rename from engine/src/main/java/com/pine/service/streaming/data/VoxelChunkStreamData.java rename to src/main/java/com/pine/engine/service/streaming/data/VoxelChunkStreamData.java index 73fed98a..9b1f180b 100644 --- a/engine/src/main/java/com/pine/service/streaming/data/VoxelChunkStreamData.java +++ b/src/main/java/com/pine/engine/service/streaming/data/VoxelChunkStreamData.java @@ -1,6 +1,6 @@ -package com.pine.service.streaming.data; +package com.pine.engine.service.streaming.data; -import com.pine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.streaming.StreamableResourceType; import java.nio.IntBuffer; diff --git a/engine/src/main/java/com/pine/service/streaming/impl/AbstractStreamableService.java b/src/main/java/com/pine/engine/service/streaming/impl/AbstractStreamableService.java similarity index 71% rename from engine/src/main/java/com/pine/service/streaming/impl/AbstractStreamableService.java rename to src/main/java/com/pine/engine/service/streaming/impl/AbstractStreamableService.java index 808279ac..2a651bca 100644 --- a/engine/src/main/java/com/pine/service/streaming/impl/AbstractStreamableService.java +++ b/src/main/java/com/pine/engine/service/streaming/impl/AbstractStreamableService.java @@ -1,11 +1,11 @@ -package com.pine.service.streaming.impl; - -import com.pine.Engine; -import com.pine.injection.PInject; -import com.pine.messaging.Loggable; -import com.pine.repository.streaming.AbstractResourceRef; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.streaming.data.StreamData; +package com.pine.engine.service.streaming.impl; + +import com.pine.common.injection.PInject; +import com.pine.common.messaging.Loggable; +import com.pine.engine.Engine; +import com.pine.engine.repository.streaming.AbstractResourceRef; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.streaming.data.StreamData; import java.util.Map; diff --git a/engine/src/main/java/com/pine/service/streaming/impl/AudioService.java b/src/main/java/com/pine/engine/service/streaming/impl/AudioService.java similarity index 61% rename from engine/src/main/java/com/pine/service/streaming/impl/AudioService.java rename to src/main/java/com/pine/engine/service/streaming/impl/AudioService.java index 4f617129..94bc5057 100644 --- a/engine/src/main/java/com/pine/service/streaming/impl/AudioService.java +++ b/src/main/java/com/pine/engine/service/streaming/impl/AudioService.java @@ -1,10 +1,10 @@ -package com.pine.service.streaming.impl; +package com.pine.engine.service.streaming.impl; -import com.pine.injection.PBean; -import com.pine.repository.streaming.AbstractResourceRef; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.streaming.data.StreamData; -import com.pine.service.streaming.ref.AudioResourceRef; +import com.pine.common.injection.PBean; +import com.pine.engine.repository.streaming.AbstractResourceRef; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.streaming.data.StreamData; +import com.pine.engine.service.streaming.ref.AudioResourceRef; import java.util.Map; diff --git a/engine/src/main/java/com/pine/service/streaming/impl/CubeMapFace.java b/src/main/java/com/pine/engine/service/streaming/impl/CubeMapFace.java similarity index 95% rename from engine/src/main/java/com/pine/service/streaming/impl/CubeMapFace.java rename to src/main/java/com/pine/engine/service/streaming/impl/CubeMapFace.java index d51eb327..0de9f1c0 100644 --- a/engine/src/main/java/com/pine/service/streaming/impl/CubeMapFace.java +++ b/src/main/java/com/pine/engine/service/streaming/impl/CubeMapFace.java @@ -1,10 +1,10 @@ -package com.pine.service.streaming.impl; +package com.pine.engine.service.streaming.impl; import org.joml.Matrix4f; import org.joml.Vector3f; import org.lwjgl.opengl.GL46; -import static com.pine.Engine.PI_OVER_2; +import static com.pine.engine.Engine.PI_OVER_2; public enum CubeMapFace { diff --git a/engine/src/main/java/com/pine/service/streaming/impl/EnvironmentMapService.java b/src/main/java/com/pine/engine/service/streaming/impl/EnvironmentMapService.java similarity index 66% rename from engine/src/main/java/com/pine/service/streaming/impl/EnvironmentMapService.java rename to src/main/java/com/pine/engine/service/streaming/impl/EnvironmentMapService.java index 3cc9a582..531caa59 100644 --- a/engine/src/main/java/com/pine/service/streaming/impl/EnvironmentMapService.java +++ b/src/main/java/com/pine/engine/service/streaming/impl/EnvironmentMapService.java @@ -1,15 +1,15 @@ -package com.pine.service.streaming.impl; - -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.repository.streaming.AbstractResourceRef; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.repository.streaming.StreamingRepository; -import com.pine.service.environment.EnvironmentMapGenService; -import com.pine.service.streaming.data.EnvironmentMapStreamData; -import com.pine.service.streaming.data.StreamData; -import com.pine.service.streaming.data.TextureStreamData; -import com.pine.service.streaming.ref.EnvironmentMapResourceRef; +package com.pine.engine.service.streaming.impl; + +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.engine.repository.streaming.AbstractResourceRef; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.streaming.StreamingRepository; +import com.pine.engine.service.environment.EnvironmentMapGenService; +import com.pine.engine.service.streaming.data.EnvironmentMapStreamData; +import com.pine.engine.service.streaming.data.StreamData; +import com.pine.engine.service.streaming.data.TextureStreamData; +import com.pine.engine.service.streaming.ref.EnvironmentMapResourceRef; import java.nio.ByteBuffer; import java.util.Collections; diff --git a/engine/src/main/java/com/pine/service/streaming/impl/MaterialService.java b/src/main/java/com/pine/engine/service/streaming/impl/MaterialService.java similarity index 69% rename from engine/src/main/java/com/pine/service/streaming/impl/MaterialService.java rename to src/main/java/com/pine/engine/service/streaming/impl/MaterialService.java index 0acadf8b..827b7027 100644 --- a/engine/src/main/java/com/pine/service/streaming/impl/MaterialService.java +++ b/src/main/java/com/pine/engine/service/streaming/impl/MaterialService.java @@ -1,20 +1,25 @@ -package com.pine.service.streaming.impl; +package com.pine.engine.service.streaming.impl; import com.pine.FSUtil; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.repository.ClockRepository; -import com.pine.repository.streaming.AbstractResourceRef; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.importer.data.MaterialImportData; -import com.pine.service.resource.ShaderService; -import com.pine.service.streaming.data.MaterialStreamData; -import com.pine.service.streaming.data.StreamData; -import com.pine.service.streaming.ref.MaterialResourceRef; -import com.pine.service.streaming.ref.TextureResourceRef; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.engine.repository.ClockRepository; +import com.pine.engine.repository.streaming.AbstractResourceRef; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.terrain.MaterialLayer; +import com.pine.engine.repository.terrain.MaterialLayers; +import com.pine.engine.service.importer.data.MaterialImportData; +import com.pine.engine.service.resource.shader.ShaderService; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.streaming.StreamingService; +import com.pine.engine.service.streaming.data.MaterialStreamData; +import com.pine.engine.service.streaming.data.StreamData; +import com.pine.engine.service.streaming.ref.MaterialResourceRef; +import com.pine.engine.service.streaming.ref.TextureResourceRef; import org.joml.Vector2f; import org.joml.Vector4f; +import java.util.List; import java.util.Map; @PBean @@ -26,6 +31,8 @@ public class MaterialService extends AbstractStreamableService materialUniforms) { + var materialMaskTexture = (TextureResourceRef) streamingService.streamIn(materialMask, StreamableResourceType.TEXTURE); + bindTexture(materialMaskTexture, 4); + + samplerIndex = 5; + matIndex = 0; + + bindLayer(layers.materialLayerA, materialUniforms); + bindLayer(layers.materialLayerB, materialUniforms); + bindLayer(layers.materialLayerC, materialUniforms); + bindLayer(layers.materialLayerD, materialUniforms); + } + + private void bindLayer(MaterialLayer layer, List materialUniforms) { + var material = (MaterialResourceRef) streamingService.streamIn(layer.material, StreamableResourceType.MATERIAL); + if (material != null) { + material.lastUse = clockRepository.totalTime; + + bindTexture(material.albedo, samplerIndex); + samplerIndex++; + bindTexture(material.roughness, samplerIndex); + samplerIndex++; + bindTexture(material.metallic, samplerIndex); + samplerIndex++; + bindTexture(material.normal, samplerIndex); + samplerIndex++; + + layer.channel.mul(layer.weight); + shaderService.bindVec4(layer.channel, materialUniforms.get(matIndex)); + matIndex++; + } + } + + private void bindTexture(TextureResourceRef texture, int index) { + if (texture != null) { + shaderService.bindSampler2dDirect(texture.texture, index); + texture.lastUse = clockRepository.totalTime; + } + } } diff --git a/engine/src/main/java/com/pine/service/streaming/impl/MeshService.java b/src/main/java/com/pine/engine/service/streaming/impl/MeshService.java similarity index 83% rename from engine/src/main/java/com/pine/service/streaming/impl/MeshService.java rename to src/main/java/com/pine/engine/service/streaming/impl/MeshService.java index 48ad311e..edb4078d 100644 --- a/engine/src/main/java/com/pine/service/streaming/impl/MeshService.java +++ b/src/main/java/com/pine/engine/service/streaming/impl/MeshService.java @@ -1,21 +1,21 @@ -package com.pine.service.streaming.impl; +package com.pine.engine.service.streaming.impl; import com.pine.FSUtil; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.repository.ClockRepository; -import com.pine.repository.terrain.TerrainChunk; -import com.pine.repository.terrain.TerrainRepository; -import com.pine.repository.rendering.RenderingMode; -import com.pine.repository.streaming.AbstractResourceRef; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.repository.streaming.StreamingRepository; -import com.pine.service.resource.ShaderService; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.streaming.StreamingService; -import com.pine.service.streaming.data.StreamData; -import com.pine.service.streaming.ref.MeshResourceRef; -import com.pine.service.streaming.ref.TextureResourceRef; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.engine.repository.ClockRepository; +import com.pine.engine.repository.rendering.RenderingMode; +import com.pine.engine.repository.streaming.AbstractResourceRef; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.streaming.StreamingRepository; +import com.pine.engine.repository.terrain.TerrainChunk; +import com.pine.engine.repository.terrain.TerrainRepository; +import com.pine.engine.service.resource.shader.ShaderService; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.streaming.StreamingService; +import com.pine.engine.service.streaming.data.StreamData; +import com.pine.engine.service.streaming.ref.MeshResourceRef; +import com.pine.engine.service.streaming.ref.TextureResourceRef; import org.joml.Vector4f; import org.lwjgl.opengl.GL46; @@ -154,7 +154,7 @@ public void renderTerrain(UniformDTO textureSize, UniformDTO terrainOffset, Unif shaderService.bindVec2(terrain.offset, terrainOffset); shaderService.bindInt(heightMap.width, textureSize); - shaderService.bindSampler2dDirect(heightMap, 8); + shaderService.bindSampler2dDirect(heightMap, 3); for (TerrainChunk chunk : terrain.chunks) { if (chunk.isCulled()) { diff --git a/engine/src/main/java/com/pine/service/streaming/impl/SceneService.java b/src/main/java/com/pine/engine/service/streaming/impl/SceneService.java similarity index 60% rename from engine/src/main/java/com/pine/service/streaming/impl/SceneService.java rename to src/main/java/com/pine/engine/service/streaming/impl/SceneService.java index d7971a77..4a3b481b 100644 --- a/engine/src/main/java/com/pine/service/streaming/impl/SceneService.java +++ b/src/main/java/com/pine/engine/service/streaming/impl/SceneService.java @@ -1,12 +1,12 @@ -package com.pine.service.streaming.impl; +package com.pine.engine.service.streaming.impl; import com.pine.FSUtil; -import com.pine.injection.PBean; -import com.pine.repository.streaming.AbstractResourceRef; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.importer.data.SceneImportData; -import com.pine.service.streaming.data.StreamData; -import com.pine.service.streaming.ref.SceneResourceRef; +import com.pine.common.injection.PBean; +import com.pine.engine.repository.streaming.AbstractResourceRef; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.importer.data.SceneImportData; +import com.pine.engine.service.streaming.data.StreamData; +import com.pine.engine.service.streaming.ref.SceneResourceRef; import java.util.Map; diff --git a/engine/src/main/java/com/pine/service/streaming/impl/TextureService.java b/src/main/java/com/pine/engine/service/streaming/impl/TextureService.java similarity index 72% rename from engine/src/main/java/com/pine/service/streaming/impl/TextureService.java rename to src/main/java/com/pine/engine/service/streaming/impl/TextureService.java index 7cbf191b..6436bb26 100644 --- a/engine/src/main/java/com/pine/service/streaming/impl/TextureService.java +++ b/src/main/java/com/pine/engine/service/streaming/impl/TextureService.java @@ -1,16 +1,17 @@ -package com.pine.service.streaming.impl; +package com.pine.engine.service.streaming.impl; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.repository.streaming.AbstractResourceRef; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.repository.streaming.StreamingRepository; -import com.pine.service.importer.ImporterService; -import com.pine.service.streaming.data.StreamData; -import com.pine.service.streaming.data.TextureStreamData; -import com.pine.service.streaming.ref.TextureResourceRef; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.engine.repository.streaming.AbstractResourceRef; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.streaming.StreamingRepository; +import com.pine.engine.service.importer.ImporterService; +import com.pine.engine.service.streaming.data.StreamData; +import com.pine.engine.service.streaming.data.TextureStreamData; +import com.pine.engine.service.streaming.ref.TextureResourceRef; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL46; import org.lwjgl.stb.STBImage; import org.lwjgl.stb.STBImageWrite; import org.lwjgl.system.MemoryStack; @@ -64,8 +65,8 @@ public AbstractResourceRef newInstance(String key) { public void writeTexture(String pathToFile, int width, int height, int textureId){ GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureId); ByteBuffer buffer = BufferUtils.createByteBuffer(width * height * 4); // 4 bytes per pixel for RGBA - GL11.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buffer); + GL11.glGetTexImage(GL11.GL_TEXTURE_2D, GL46.GL_NONE, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buffer); STBImageWrite.stbi_write_png(pathToFile, width, height, 4, buffer, width * 4); - GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, GL46.GL_NONE); } } diff --git a/engine/src/main/java/com/pine/service/streaming/impl/VoxelChunkService.java b/src/main/java/com/pine/engine/service/streaming/impl/VoxelChunkService.java similarity index 71% rename from engine/src/main/java/com/pine/service/streaming/impl/VoxelChunkService.java rename to src/main/java/com/pine/engine/service/streaming/impl/VoxelChunkService.java index 552700b0..56c7dbe8 100644 --- a/engine/src/main/java/com/pine/service/streaming/impl/VoxelChunkService.java +++ b/src/main/java/com/pine/engine/service/streaming/impl/VoxelChunkService.java @@ -1,12 +1,12 @@ -package com.pine.service.streaming.impl; +package com.pine.engine.service.streaming.impl; import com.pine.FSUtil; -import com.pine.injection.PBean; -import com.pine.repository.streaming.AbstractResourceRef; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.streaming.data.StreamData; -import com.pine.service.streaming.data.VoxelChunkStreamData; -import com.pine.service.streaming.ref.VoxelChunkResourceRef; +import com.pine.common.injection.PBean; +import com.pine.engine.repository.streaming.AbstractResourceRef; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.streaming.data.StreamData; +import com.pine.engine.service.streaming.data.VoxelChunkStreamData; +import com.pine.engine.service.streaming.ref.VoxelChunkResourceRef; import org.lwjgl.system.MemoryUtil; import java.nio.IntBuffer; diff --git a/engine/src/main/java/com/pine/service/streaming/ref/AudioResourceRef.java b/src/main/java/com/pine/engine/service/streaming/ref/AudioResourceRef.java similarity index 62% rename from engine/src/main/java/com/pine/service/streaming/ref/AudioResourceRef.java rename to src/main/java/com/pine/engine/service/streaming/ref/AudioResourceRef.java index f605f308..c9997515 100644 --- a/engine/src/main/java/com/pine/service/streaming/ref/AudioResourceRef.java +++ b/src/main/java/com/pine/engine/service/streaming/ref/AudioResourceRef.java @@ -1,8 +1,8 @@ -package com.pine.service.streaming.ref; +package com.pine.engine.service.streaming.ref; -import com.pine.repository.streaming.AbstractResourceRef; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.streaming.data.AudioStreamData; +import com.pine.engine.repository.streaming.AbstractResourceRef; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.streaming.data.AudioStreamData; public class AudioResourceRef extends AbstractResourceRef { diff --git a/engine/src/main/java/com/pine/service/streaming/ref/EnvironmentMapResourceRef.java b/src/main/java/com/pine/engine/service/streaming/ref/EnvironmentMapResourceRef.java similarity index 79% rename from engine/src/main/java/com/pine/service/streaming/ref/EnvironmentMapResourceRef.java rename to src/main/java/com/pine/engine/service/streaming/ref/EnvironmentMapResourceRef.java index e8d8a5c0..7e0a52f0 100644 --- a/engine/src/main/java/com/pine/service/streaming/ref/EnvironmentMapResourceRef.java +++ b/src/main/java/com/pine/engine/service/streaming/ref/EnvironmentMapResourceRef.java @@ -1,16 +1,16 @@ -package com.pine.service.streaming.ref; +package com.pine.engine.service.streaming.ref; -import com.pine.repository.streaming.AbstractResourceRef; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.streaming.data.EnvironmentMapStreamData; -import com.pine.service.streaming.impl.CubeMapFace; +import com.pine.engine.repository.streaming.AbstractResourceRef; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.streaming.data.EnvironmentMapStreamData; +import com.pine.engine.service.streaming.impl.CubeMapFace; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL46; import org.lwjgl.stb.STBImage; import java.nio.ByteBuffer; -import static com.pine.service.environment.CubeMapUtil.setUpCubeMapTexture; +import static com.pine.engine.service.environment.CubeMapUtil.setUpCubeMapTexture; public class EnvironmentMapResourceRef extends AbstractResourceRef { public int texture; diff --git a/engine/src/main/java/com/pine/service/streaming/ref/MaterialResourceRef.java b/src/main/java/com/pine/engine/service/streaming/ref/MaterialResourceRef.java similarity index 87% rename from engine/src/main/java/com/pine/service/streaming/ref/MaterialResourceRef.java rename to src/main/java/com/pine/engine/service/streaming/ref/MaterialResourceRef.java index 01ff129e..92c5bcff 100644 --- a/engine/src/main/java/com/pine/service/streaming/ref/MaterialResourceRef.java +++ b/src/main/java/com/pine/engine/service/streaming/ref/MaterialResourceRef.java @@ -1,11 +1,11 @@ -package com.pine.service.streaming.ref; +package com.pine.engine.service.streaming.ref; -import com.pine.inspection.Color; -import com.pine.repository.streaming.AbstractResourceRef; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.streaming.data.MaterialStreamData; -import com.pine.type.MaterialRenderingMode; +import com.pine.common.inspection.Color; +import com.pine.engine.repository.streaming.AbstractResourceRef; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.streaming.data.MaterialStreamData; +import com.pine.engine.type.MaterialRenderingMode; public class MaterialResourceRef extends AbstractResourceRef { diff --git a/engine/src/main/java/com/pine/service/streaming/ref/MeshResourceRef.java b/src/main/java/com/pine/engine/service/streaming/ref/MeshResourceRef.java similarity index 90% rename from engine/src/main/java/com/pine/service/streaming/ref/MeshResourceRef.java rename to src/main/java/com/pine/engine/service/streaming/ref/MeshResourceRef.java index 4bda3d54..6c9fc0e5 100644 --- a/engine/src/main/java/com/pine/service/streaming/ref/MeshResourceRef.java +++ b/src/main/java/com/pine/engine/service/streaming/ref/MeshResourceRef.java @@ -1,9 +1,9 @@ -package com.pine.service.streaming.ref; +package com.pine.engine.service.streaming.ref; -import com.pine.repository.streaming.AbstractResourceRef; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.importer.data.MeshImportData; -import com.pine.service.rendering.VertexBuffer; +import com.pine.engine.repository.streaming.AbstractResourceRef; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.importer.data.MeshImportData; +import com.pine.engine.service.rendering.VertexBuffer; import org.lwjgl.opengl.GL46; import org.lwjgl.system.MemoryUtil; diff --git a/engine/src/main/java/com/pine/service/streaming/ref/SceneResourceRef.java b/src/main/java/com/pine/engine/service/streaming/ref/SceneResourceRef.java similarity index 62% rename from engine/src/main/java/com/pine/service/streaming/ref/SceneResourceRef.java rename to src/main/java/com/pine/engine/service/streaming/ref/SceneResourceRef.java index 17728461..9db2e100 100644 --- a/engine/src/main/java/com/pine/service/streaming/ref/SceneResourceRef.java +++ b/src/main/java/com/pine/engine/service/streaming/ref/SceneResourceRef.java @@ -1,8 +1,8 @@ -package com.pine.service.streaming.ref; +package com.pine.engine.service.streaming.ref; -import com.pine.repository.streaming.AbstractResourceRef; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.importer.data.SceneImportData; +import com.pine.engine.repository.streaming.AbstractResourceRef; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.importer.data.SceneImportData; public class SceneResourceRef extends AbstractResourceRef { public SceneResourceRef(String id) { diff --git a/engine/src/main/java/com/pine/service/streaming/ref/TextureResourceRef.java b/src/main/java/com/pine/engine/service/streaming/ref/TextureResourceRef.java similarity index 82% rename from engine/src/main/java/com/pine/service/streaming/ref/TextureResourceRef.java rename to src/main/java/com/pine/engine/service/streaming/ref/TextureResourceRef.java index 20bb636a..681c8ca5 100644 --- a/engine/src/main/java/com/pine/service/streaming/ref/TextureResourceRef.java +++ b/src/main/java/com/pine/engine/service/streaming/ref/TextureResourceRef.java @@ -1,9 +1,9 @@ -package com.pine.service.streaming.ref; +package com.pine.engine.service.streaming.ref; -import com.pine.repository.streaming.AbstractResourceRef; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.streaming.data.TextureStreamData; +import com.pine.engine.repository.streaming.AbstractResourceRef; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.streaming.data.TextureStreamData; import org.lwjgl.opengl.GL46; import org.lwjgl.opengl.GL46C; import org.lwjgl.stb.STBImage; @@ -16,7 +16,7 @@ public class TextureResourceRef extends AbstractResourceRef { public int internalFormat; public int format; public int type; - public FrameBufferObject frameBuffer; + public FBO frameBuffer; public TextureResourceRef(String id) { super(id); @@ -34,14 +34,12 @@ protected void loadInternal(TextureStreamData data) { GL46.glTexParameteri(GL46.GL_TEXTURE_2D, GL46.GL_TEXTURE_WRAP_S, GL46.GL_REPEAT); GL46.glTexParameteri(GL46.GL_TEXTURE_2D, GL46.GL_TEXTURE_WRAP_T, GL46.GL_REPEAT); - GL46.glTexParameteri(GL46.GL_TEXTURE_2D, GL46.GL_TEXTURE_MIN_FILTER, GL46.GL_LINEAR); + GL46.glTexParameteri(GL46.GL_TEXTURE_2D, GL46.GL_TEXTURE_MIN_FILTER, GL46.GL_LINEAR_MIPMAP_LINEAR); GL46.glTexParameteri(GL46.GL_TEXTURE_2D, GL46.GL_TEXTURE_MAG_FILTER, GL46.GL_LINEAR); GL46.glTexImage2D(GL46.GL_TEXTURE_2D, 0, data.internalFormat, data.width, data.height, 0, data.format, data.type, data.imageBuffer); - if (data.mipmap) { - GL46.glGenerateMipmap(GL46.GL_TEXTURE_2D); - } + GL46.glGenerateMipmap(GL46.GL_TEXTURE_2D); GL46C.glBindTexture(GL46C.GL_TEXTURE_2D, GL46.GL_NONE); STBImage.stbi_image_free(data.imageBuffer); diff --git a/engine/src/main/java/com/pine/service/streaming/ref/VoxelChunkResourceRef.java b/src/main/java/com/pine/engine/service/streaming/ref/VoxelChunkResourceRef.java similarity index 61% rename from engine/src/main/java/com/pine/service/streaming/ref/VoxelChunkResourceRef.java rename to src/main/java/com/pine/engine/service/streaming/ref/VoxelChunkResourceRef.java index 5093bc0b..2d49649e 100644 --- a/engine/src/main/java/com/pine/service/streaming/ref/VoxelChunkResourceRef.java +++ b/src/main/java/com/pine/engine/service/streaming/ref/VoxelChunkResourceRef.java @@ -1,15 +1,15 @@ -package com.pine.service.streaming.ref; +package com.pine.engine.service.streaming.ref; -import com.pine.repository.streaming.AbstractResourceRef; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.resource.ssbo.SSBOCreationData; -import com.pine.service.resource.ssbo.ShaderStorageBufferObject; -import com.pine.service.streaming.data.VoxelChunkStreamData; +import com.pine.engine.repository.streaming.AbstractResourceRef; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.resource.ssbo.SSBO; +import com.pine.engine.service.resource.ssbo.SSBOCreationData; +import com.pine.engine.service.streaming.data.VoxelChunkStreamData; import org.joml.Vector3f; import org.lwjgl.system.MemoryUtil; public class VoxelChunkResourceRef extends AbstractResourceRef { - private ShaderStorageBufferObject buffer; + private SSBO buffer; private int quantity; public Vector3f center; public int size; @@ -27,7 +27,7 @@ public StreamableResourceType getResourceType() { @Override protected void loadInternal(VoxelChunkStreamData data) { this.quantity = data.buffer().limit(); - buffer = new ShaderStorageBufferObject(new SSBOCreationData(data.buffer())); + buffer = new SSBO(new SSBOCreationData(data.buffer())); MemoryUtil.memFree(data.buffer()); } @@ -35,7 +35,7 @@ public int getQuantity() { return quantity; } - public ShaderStorageBufferObject getBuffer() { + public SSBO getBuffer() { return buffer; } diff --git a/engine/src/main/java/com/pine/service/system/AbstractPass.java b/src/main/java/com/pine/engine/service/system/AbstractPass.java similarity index 61% rename from engine/src/main/java/com/pine/service/system/AbstractPass.java rename to src/main/java/com/pine/engine/service/system/AbstractPass.java index 083430b2..968ca137 100644 --- a/engine/src/main/java/com/pine/service/system/AbstractPass.java +++ b/src/main/java/com/pine/engine/service/system/AbstractPass.java @@ -1,35 +1,41 @@ -package com.pine.service.system; +package com.pine.engine.service.system; -import com.pine.Engine; -import com.pine.MetricCollector; -import com.pine.injection.PInject; -import com.pine.repository.*; -import com.pine.repository.core.CoreBufferRepository; -import com.pine.repository.core.CoreMeshRepository; -import com.pine.repository.core.CoreShaderRepository; -import com.pine.repository.rendering.RenderingRepository; -import com.pine.repository.terrain.TerrainRepository; -import com.pine.service.grid.WorldService; -import com.pine.service.importer.ImporterService; -import com.pine.service.resource.SSBOService; -import com.pine.service.resource.ShaderService; -import com.pine.service.resource.UBOService; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.streaming.StreamingService; -import com.pine.service.streaming.impl.MaterialService; -import com.pine.service.streaming.impl.MeshService; +import com.pine.common.MetricCollector; +import com.pine.common.injection.PInject; +import com.pine.engine.Engine; +import com.pine.engine.repository.*; +import com.pine.engine.repository.core.CoreBufferRepository; +import com.pine.engine.repository.core.CoreMeshRepository; +import com.pine.engine.repository.core.CoreShaderRepository; +import com.pine.engine.repository.rendering.RenderingRepository; +import com.pine.engine.repository.terrain.TerrainRepository; +import com.pine.engine.service.importer.ImporterService; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.fbo.FBOService; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.ShaderService; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.resource.ssbo.SSBOService; +import com.pine.engine.service.resource.ubo.UBOService; +import com.pine.engine.service.streaming.StreamingService; +import com.pine.engine.service.streaming.impl.MaterialService; +import com.pine.engine.service.streaming.impl.MeshService; +import com.pine.engine.service.streaming.impl.TextureService; +import com.pine.engine.service.world.WorldService; public abstract class AbstractPass extends MetricCollector { @PInject public AtmosphereRepository atmosphere; @PInject + public FBOService fboService; + @PInject public WorldRepository world; @PInject public Engine engine; @PInject + public TextureService textureService; + @PInject public StreamingService streamingService; @PInject public ImporterService importerService; @@ -77,7 +83,7 @@ final public void render() { endTracking(); return; } - FrameBufferObject fbo = getTargetFBO(); + FBO fbo = getTargetFBO(); shaderService.bind(getShader()); if (fbo != null) { fbo.startMapping(shouldClearFBO()); @@ -90,7 +96,7 @@ final public void render() { endTracking(); } - protected FrameBufferObject getTargetFBO() { + protected FBO getTargetFBO() { return null; } diff --git a/src/main/java/com/pine/engine/service/system/SystemService.java b/src/main/java/com/pine/engine/service/system/SystemService.java new file mode 100644 index 00000000..387382da --- /dev/null +++ b/src/main/java/com/pine/engine/service/system/SystemService.java @@ -0,0 +1,65 @@ +package com.pine.engine.service.system; + +import com.pine.common.Initializable; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.common.injection.PInjector; +import com.pine.engine.service.system.impl.*; +import com.pine.engine.service.system.impl.gbuffer.*; +import com.pine.engine.service.system.impl.tools.GridPass; +import com.pine.engine.service.system.impl.tools.IconsPass; +import com.pine.engine.service.system.impl.tools.PaintGizmoPass; +import com.pine.engine.service.system.impl.tools.PaintGizmoRenderingPass; +import com.pine.engine.service.system.impl.tools.outline.BoxOutlineGenPass; +import com.pine.engine.service.system.impl.tools.outline.OutlineGenPass; +import com.pine.engine.service.system.impl.tools.outline.OutlineRenderingPass; +import com.pine.engine.tasks.SyncTask; + +@PBean +public class SystemService implements SyncTask, Initializable { + @PInject + public PInjector pInjector; + + private final AbstractPass[] systems = new AbstractPass[]{ + new NoiseGenPass(), + new BRDFGenPass(), + new IrradianceGenPass(), + new EnvironmentMapFilteringGenPass(), + new ShaderDataSyncPass(), + new TerrainGBufferPass(), + new PaintGizmoPass(), + new FoliageCullingPass(), + new ShadowsPass(), + new FoliageGBufferPass(), + new PrimitiveGBufferPass(), + new CopyDepthPass(), + new DecalGBufferPass(), + new IconsPass(), + new GBufferShadingPass(), + new AtmospherePass(), + new CompositingPass(), + new PostProcessingPass(), + new GridPass(), + new OutlineGenPass(), + new BoxOutlineGenPass(), + new OutlineRenderingPass(), + new PaintGizmoRenderingPass(), + new VoxelVisualizerPass(), + new FrameCompositionPass() + }; + + @Override + public void sync() { + for (var system : systems) { + system.render(); + } + } + + @Override + public void onInitialize() { + for (var sys : systems) { + pInjector.inject(sys); + sys.onInitialize(); + } + } +} \ No newline at end of file diff --git a/engine/src/main/java/com/pine/service/system/impl/AbstractQuadPass.java b/src/main/java/com/pine/engine/service/system/impl/AbstractQuadPass.java similarity index 70% rename from engine/src/main/java/com/pine/service/system/impl/AbstractQuadPass.java rename to src/main/java/com/pine/engine/service/system/impl/AbstractQuadPass.java index e9cfd4c6..8abc1750 100644 --- a/engine/src/main/java/com/pine/service/system/impl/AbstractQuadPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/AbstractQuadPass.java @@ -1,8 +1,8 @@ -package com.pine.service.system.impl; +package com.pine.engine.service.system.impl; -import com.pine.messaging.Loggable; -import com.pine.repository.rendering.RenderingMode; -import com.pine.service.system.AbstractPass; +import com.pine.common.messaging.Loggable; +import com.pine.engine.repository.rendering.RenderingMode; +import com.pine.engine.service.system.AbstractPass; import org.lwjgl.opengl.GL46; public abstract class AbstractQuadPass extends AbstractPass implements Loggable { diff --git a/engine/src/main/java/com/pine/service/system/impl/AtmospherePass.java b/src/main/java/com/pine/engine/service/system/impl/AtmospherePass.java similarity index 53% rename from engine/src/main/java/com/pine/service/system/impl/AtmospherePass.java rename to src/main/java/com/pine/engine/service/system/impl/AtmospherePass.java index d9335fd4..2a7e8262 100644 --- a/engine/src/main/java/com/pine/service/system/impl/AtmospherePass.java +++ b/src/main/java/com/pine/engine/service/system/impl/AtmospherePass.java @@ -1,87 +1,54 @@ -package com.pine.service.system.impl; +package com.pine.engine.service.system.impl; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.streaming.ref.TextureResourceRef; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.streaming.ref.TextureResourceRef; import org.joml.Vector3f; import org.lwjgl.opengl.GL46; -import static com.pine.service.resource.ShaderService.COMPUTE_RUNTIME_DATA; +import static com.pine.engine.service.resource.shader.ShaderService.COMPUTE_RUNTIME_DATA; public class AtmospherePass extends AbstractQuadPass { private static final int NUM_THREADS = 8; private boolean hasSamplersComputed = false; private UniformDTO densityMultiplier; - private UniformDTO densityOffset; + private UniformDTO cloudCoverage; private UniformDTO scale; private UniformDTO detailNoiseScale; - private UniformDTO detailNoiseWeight; - private UniformDTO detailWeights; - private UniformDTO shapeNoiseWeights; - private UniformDTO phaseParams; + private UniformDTO cloudErosionStrength; private UniformDTO numStepsLight; private UniformDTO rayOffsetStrength; private UniformDTO boundsMin; private UniformDTO boundsMax; - private UniformDTO shapeOffset; - private UniformDTO detailOffset; private UniformDTO lightAbsorptionTowardSun; private UniformDTO lightAbsorptionThroughCloud; - private UniformDTO darknessThreshold; private UniformDTO baseSpeed; private UniformDTO detailSpeed; - private UniformDTO type; - private UniformDTO rayleighBeta; - private UniformDTO mieBeta; - private UniformDTO intensity; - private UniformDTO atmosphereRadius; - private UniformDTO planetRadius; - private UniformDTO rayleighHeight; - private UniformDTO mieHeight; - private UniformDTO threshold; - private UniformDTO samples; private final Vector3f boundsMinVal = new Vector3f(); private final Vector3f boundsMaxVal = new Vector3f(); @Override public void onInitialize() { - type = addUniformDeclaration("type"); - rayleighBeta = addUniformDeclaration("rayleighBeta"); - mieBeta = addUniformDeclaration("mieBeta"); - intensity = addUniformDeclaration("intensity"); - atmosphereRadius = addUniformDeclaration("atmosphereRadius"); - planetRadius = addUniformDeclaration("planetRadius"); - rayleighHeight = addUniformDeclaration("rayleighHeight"); - mieHeight = addUniformDeclaration("mieHeight"); - threshold = addUniformDeclaration("threshold"); - samples = addUniformDeclaration("samples"); - densityMultiplier = addUniformDeclaration("densityMultiplier"); - densityOffset = addUniformDeclaration("densityOffset"); + cloudCoverage = addUniformDeclaration("cloudCoverage"); scale = addUniformDeclaration("scale"); detailNoiseScale = addUniformDeclaration("detailNoiseScale"); - detailNoiseWeight = addUniformDeclaration("detailNoiseWeight"); - detailWeights = addUniformDeclaration("detailWeights"); - shapeNoiseWeights = addUniformDeclaration("shapeNoiseWeights"); - phaseParams = addUniformDeclaration("phaseParams"); + cloudErosionStrength = addUniformDeclaration("cloudErosionStrength"); numStepsLight = addUniformDeclaration("numStepsLight"); rayOffsetStrength = addUniformDeclaration("rayOffsetStrength"); boundsMin = addUniformDeclaration("boundsMin"); boundsMax = addUniformDeclaration("boundsMax"); - shapeOffset = addUniformDeclaration("shapeOffset"); - detailOffset = addUniformDeclaration("detailOffset"); lightAbsorptionTowardSun = addUniformDeclaration("lightAbsorptionTowardSun"); lightAbsorptionThroughCloud = addUniformDeclaration("lightAbsorptionThroughCloud"); - darknessThreshold = addUniformDeclaration("darknessThreshold"); baseSpeed = addUniformDeclaration("baseSpeed"); detailSpeed = addUniformDeclaration("detailSpeed"); } @Override - protected FrameBufferObject getTargetFBO() { + protected FBO getTargetFBO() { return bufferRepository.auxBufferQuaterRes; } @@ -124,14 +91,11 @@ protected Shader getShader() { protected void bindUniforms() { shaderService.bindSampler3dDirect(bufferRepository.cloudShapeTexture, 0); shaderService.bindSampler3dDirect(bufferRepository.cloudNoiseTexture, 1); - shaderService.bindFloat(atmosphere.densityMultiplier, densityMultiplier); - shaderService.bindFloat(atmosphere.densityOffset, densityOffset); - shaderService.bindFloat(atmosphere.scale, scale); + shaderService.bindFloat(atmosphere.densityMultiplier/10, densityMultiplier); + shaderService.bindFloat(atmosphere.cloudCoverage, cloudCoverage); + shaderService.bindFloat(atmosphere.scale/100, scale); shaderService.bindFloat(atmosphere.detailNoiseScale, detailNoiseScale); - shaderService.bindFloat(atmosphere.detailNoiseWeight, detailNoiseWeight); - shaderService.bindVec3(atmosphere.detailWeights, detailWeights); - shaderService.bindVec4(atmosphere.shapeNoiseWeights, shapeNoiseWeights); - shaderService.bindVec4(atmosphere.phaseParams, phaseParams); + shaderService.bindFloat(atmosphere.cloudErosionStrength, cloudErosionStrength); shaderService.bindInt(atmosphere.numStepsLight, numStepsLight); shaderService.bindFloat(atmosphere.rayOffsetStrength, rayOffsetStrength); @@ -144,25 +108,10 @@ protected void bindUniforms() { shaderService.bindVec3(boundsMinVal, boundsMin); shaderService.bindVec3(boundsMaxVal, boundsMax); - shaderService.bindVec3(atmosphere.shapeOffset, shapeOffset); - shaderService.bindVec3(atmosphere.detailOffset, detailOffset); shaderService.bindFloat(atmosphere.lightAbsorptionTowardSun, lightAbsorptionTowardSun); shaderService.bindFloat(atmosphere.lightAbsorptionThroughCloud, lightAbsorptionThroughCloud); - shaderService.bindFloat(atmosphere.darknessThreshold, darknessThreshold); shaderService.bindFloat(atmosphere.shapeScrollSpeed, baseSpeed); shaderService.bindFloat(atmosphere.detailScrollSpeed, detailSpeed); - - // ATMOSPHERE - shaderService.bindInt(atmosphere.renderingType.getId(), type); - shaderService.bindVec3(atmosphere.betaRayleigh, rayleighBeta); - shaderService.bindVec3(atmosphere.betaMie, mieBeta); - shaderService.bindFloat(atmosphere.intensity, intensity); - shaderService.bindFloat(atmosphere.atmosphereRadius, atmosphereRadius); - shaderService.bindFloat(atmosphere.planetRadius, planetRadius); - shaderService.bindFloat(atmosphere.rayleighHeight, rayleighHeight); - shaderService.bindFloat(atmosphere.mieHeight, mieHeight); - shaderService.bindFloat(atmosphere.threshold, threshold); - shaderService.bindInt(atmosphere.maxSamples, samples); } @Override diff --git a/engine/src/main/java/com/pine/service/system/impl/BRDFGenPass.java b/src/main/java/com/pine/engine/service/system/impl/BRDFGenPass.java similarity index 71% rename from engine/src/main/java/com/pine/service/system/impl/BRDFGenPass.java rename to src/main/java/com/pine/engine/service/system/impl/BRDFGenPass.java index d851f432..a015abd1 100644 --- a/engine/src/main/java/com/pine/service/system/impl/BRDFGenPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/BRDFGenPass.java @@ -1,8 +1,8 @@ -package com.pine.service.system.impl; +package com.pine.engine.service.system.impl; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.Shader; -import com.pine.service.system.AbstractPass; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.system.AbstractPass; public class BRDFGenPass extends AbstractPass { @@ -19,7 +19,7 @@ protected Shader getShader() { } @Override - protected FrameBufferObject getTargetFBO() { + protected FBO getTargetFBO() { return bufferRepository.brdfFBO; } diff --git a/engine/src/main/java/com/pine/service/system/impl/CompositingPass.java b/src/main/java/com/pine/engine/service/system/impl/CompositingPass.java similarity index 56% rename from engine/src/main/java/com/pine/service/system/impl/CompositingPass.java rename to src/main/java/com/pine/engine/service/system/impl/CompositingPass.java index 721c51b0..9070e2b5 100644 --- a/engine/src/main/java/com/pine/service/system/impl/CompositingPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/CompositingPass.java @@ -1,20 +1,12 @@ -package com.pine.service.system.impl; +package com.pine.engine.service.system.impl; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; public class CompositingPass extends AbstractQuadPass { - - private UniformDTO backgroundColor; - - @Override - public void onInitialize() { - backgroundColor = addUniformDeclaration("backgroundColor"); - } - @Override - protected FrameBufferObject getTargetFBO() { + protected FBO getTargetFBO() { return bufferRepository.compositingBuffer; } @@ -25,7 +17,6 @@ protected Shader getShader() { @Override protected void bindUniforms() { - shaderService.bindVec3(engineRepository.backgroundColor, backgroundColor); shaderService.bindSampler2dDirect(bufferRepository.gBufferTargetSampler, 0); shaderService.bindSampler2dDirect(bufferRepository.gBufferDepthIndexSampler, 1); shaderService.bindSampler2dDirect(bufferRepository.auxBufferQuaterResSampler, 2); diff --git a/engine/src/main/java/com/pine/service/system/impl/CopyDepthPass.java b/src/main/java/com/pine/engine/service/system/impl/CopyDepthPass.java similarity index 73% rename from engine/src/main/java/com/pine/service/system/impl/CopyDepthPass.java rename to src/main/java/com/pine/engine/service/system/impl/CopyDepthPass.java index 3d3078b6..90869874 100644 --- a/engine/src/main/java/com/pine/service/system/impl/CopyDepthPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/CopyDepthPass.java @@ -1,11 +1,11 @@ -package com.pine.service.system.impl; +package com.pine.engine.service.system.impl; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.Shader; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.shader.Shader; public class CopyDepthPass extends AbstractQuadPass { @Override - protected FrameBufferObject getTargetFBO() { + protected FBO getTargetFBO() { return bufferRepository.sceneDepthCopy; } diff --git a/engine/src/main/java/com/pine/service/system/impl/EnvironmentMapFilteringGenPass.java b/src/main/java/com/pine/engine/service/system/impl/EnvironmentMapFilteringGenPass.java similarity index 89% rename from engine/src/main/java/com/pine/service/system/impl/EnvironmentMapFilteringGenPass.java rename to src/main/java/com/pine/engine/service/system/impl/EnvironmentMapFilteringGenPass.java index e5bee394..47b93aca 100644 --- a/engine/src/main/java/com/pine/service/system/impl/EnvironmentMapFilteringGenPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/EnvironmentMapFilteringGenPass.java @@ -1,11 +1,11 @@ -package com.pine.service.system.impl; +package com.pine.engine.service.system.impl; -import com.pine.repository.rendering.RenderingMode; -import com.pine.service.environment.CubeMapUtil; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.streaming.impl.CubeMapFace; -import com.pine.service.system.AbstractPass; +import com.pine.engine.repository.rendering.RenderingMode; +import com.pine.engine.service.environment.CubeMapUtil; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.streaming.impl.CubeMapFace; +import com.pine.engine.service.system.AbstractPass; import org.joml.Vector3f; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL46; diff --git a/src/main/java/com/pine/engine/service/system/impl/FoliageCullingPass.java b/src/main/java/com/pine/engine/service/system/impl/FoliageCullingPass.java new file mode 100644 index 00000000..1fce2a7f --- /dev/null +++ b/src/main/java/com/pine/engine/service/system/impl/FoliageCullingPass.java @@ -0,0 +1,136 @@ +package com.pine.engine.service.system.impl; + +import com.pine.engine.repository.core.CoreBufferRepository; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.terrain.FoliageInstance; +import com.pine.engine.service.resource.shader.GLSLType; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.streaming.ref.MeshResourceRef; +import com.pine.engine.service.streaming.ref.TextureResourceRef; +import com.pine.engine.service.system.AbstractPass; +import org.joml.Vector2f; +import org.joml.Vector4f; +import org.lwjgl.opengl.GL46; + +import static com.pine.engine.service.resource.shader.ShaderService.COMPUTE_RUNTIME_DATA; + +public class FoliageCullingPass extends AbstractPass { + private TextureResourceRef heightMap; + private TextureResourceRef materialMask; + private UniformDTO imageSizeU; + private UniformDTO settingsU; + private UniformDTO terrainOffsetU; + private UniformDTO heightScale; + private UniformDTO colorToMatchU; + private final Vector2f imageSize = new Vector2f(); + private final Vector4f settings = new Vector4f(); + + @Override + public void onInitialize() { + imageSizeU = addUniformDeclaration("imageSize"); + settingsU = addUniformDeclaration("settings"); + heightScale = addUniformDeclaration("heightScale"); + colorToMatchU = addUniformDeclaration("colorToMatch"); + terrainOffsetU = addUniformDeclaration("terrainOffset"); + } + + @Override + protected boolean isRenderable() { + if (terrainRepository.enabled && terrainRepository.foliage.isEmpty()) { + return false; + } + heightMap = terrainRepository.heightMapTexture != null ? (TextureResourceRef) streamingService.streamIn(terrainRepository.heightMapTexture, StreamableResourceType.TEXTURE) : null; + materialMask = heightMap != null && terrainRepository.materialMask != null ? (TextureResourceRef) streamingService.streamIn(terrainRepository.materialMask, StreamableResourceType.TEXTURE) : null; + return heightMap != null && materialMask != null; + } + + @Override + protected Shader getShader() { + return shaderRepository.foliageCullingCompute; + } + + @Override + protected void renderInternal() { + COMPUTE_RUNTIME_DATA.groupX = 256; + COMPUTE_RUNTIME_DATA.groupY = 256; + COMPUTE_RUNTIME_DATA.groupZ = 1; + COMPUTE_RUNTIME_DATA.memoryBarrier = GL46.GL_COMMAND_BARRIER_BIT | GL46.GL_SHADER_STORAGE_BARRIER_BIT; + + shaderService.bindSampler2dDirect(materialMask, 0); + shaderService.bindSampler2dDirect(heightMap, 1); + shaderService.bindFloat(terrainRepository.heightScale, heightScale); + + shaderService.bindVec2(terrainRepository.offset, terrainOffsetU); + + imageSize.x = heightMap.width; + imageSize.y = heightMap.height; + shaderService.bindVec2(imageSize, imageSizeU); + + for (var foliage : terrainRepository.foliage) { + boolean isNotReady = isFoliageNotReady(foliage); + if (foliage.isNotFrozen() || isNotReady) { + if (foliage.prevMaximumNumberOfInstances != foliage.maximumNumberOfInstances) { + initializeTransformationBuffer(foliage); + } + if (isNotReady) { + initializeBuffers(foliage); + } + foliage.freezeVersion(); + } + if (isFoliageNotReady(foliage)) { + continue; + } + var mesh = streamingService.streamIn(foliage.mesh, StreamableResourceType.MESH); + if (mesh != null) { + mesh.lastUse = clockRepository.totalTime; + + GL46.glBindBufferBase(GL46.GL_ATOMIC_COUNTER_BUFFER, 2, foliage.atomicCounterBuffer); + GL46.glBufferSubData(GL46.GL_ATOMIC_COUNTER_BUFFER, 0, CoreBufferRepository.ZERO); + GL46.glBindBufferBase(GL46.GL_SHADER_STORAGE_BUFFER, 3, foliage.transformationsBuffer); + GL46.glBindBufferBase(GL46.GL_SHADER_STORAGE_BUFFER, 4, foliage.indirectDrawBuffer); + + settings.x = foliage.maxDistanceFromCamera; + settings.y = foliage.maximumNumberOfInstances; + settings.z = ((MeshResourceRef) mesh).indicesCount; + shaderService.bindVec4(settings, settingsU); + shaderService.bindVec4(terrainRepository.materialLayers.getLayer(foliage.materialMaskIndex).channel, colorToMatchU); + + shaderService.dispatch(COMPUTE_RUNTIME_DATA); + } + } + } + + public static boolean isFoliageNotReady(FoliageInstance foliage) { + return foliage.indirectDrawBuffer == null || foliage.transformationsBuffer == null || foliage.atomicCounterBuffer == null; + } + + private void initializeTransformationBuffer(FoliageInstance foliage) { + if (foliage.transformationsBuffer != null) { + GL46.glDeleteBuffers(foliage.transformationsBuffer); + } + foliage.transformationsBuffer = GL46.glGenBuffers(); + GL46.glBindBuffer(GL46.GL_SHADER_STORAGE_BUFFER, foliage.transformationsBuffer); + GL46.glBufferData(GL46.GL_SHADER_STORAGE_BUFFER, (long) foliage.maximumNumberOfInstances * GLSLType.FLOAT.getSize() * 3, GL46.GL_DYNAMIC_DRAW); + } + + private void initializeBuffers(FoliageInstance foliage) { + // ATOMIC COUNTER + foliage.atomicCounterBuffer = GL46.glGenBuffers(); + GL46.glBindBuffer(GL46.GL_ATOMIC_COUNTER_BUFFER, foliage.atomicCounterBuffer); + GL46.glBufferData(GL46.GL_ATOMIC_COUNTER_BUFFER, Integer.BYTES, GL46.GL_DYNAMIC_DRAW); + GL46.glBindBufferBase(GL46.GL_ATOMIC_COUNTER_BUFFER, 0, foliage.atomicCounterBuffer); + + // DRAW INDIRECT BUFFER + foliage.indirectDrawBuffer = GL46.glGenBuffers(); + GL46.glBindBuffer(GL46.GL_DRAW_INDIRECT_BUFFER, foliage.indirectDrawBuffer); + GL46.glBufferData(GL46.GL_DRAW_INDIRECT_BUFFER, 5 * Integer.BYTES, GL46.GL_DYNAMIC_DRAW); + + initializeTransformationBuffer(foliage); + } + + @Override + public String getTitle() { + return "Foliage culling"; + } +} diff --git a/engine/src/main/java/com/pine/service/system/impl/FrameCompositionPass.java b/src/main/java/com/pine/engine/service/system/impl/FrameCompositionPass.java similarity index 90% rename from engine/src/main/java/com/pine/service/system/impl/FrameCompositionPass.java rename to src/main/java/com/pine/engine/service/system/impl/FrameCompositionPass.java index ab82fabe..7702de94 100644 --- a/engine/src/main/java/com/pine/service/system/impl/FrameCompositionPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/FrameCompositionPass.java @@ -1,8 +1,8 @@ -package com.pine.service.system.impl; +package com.pine.engine.service.system.impl; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; public class FrameCompositionPass extends AbstractQuadPass { private UniformDTO inverseFilterTextureSize; @@ -35,7 +35,7 @@ public void onInitialize() { } @Override - protected FrameBufferObject getTargetFBO() { + protected FBO getTargetFBO() { return engine.getTargetFBO(); } diff --git a/engine/src/main/java/com/pine/service/system/impl/IrradianceGenPass.java b/src/main/java/com/pine/engine/service/system/impl/IrradianceGenPass.java similarity index 87% rename from engine/src/main/java/com/pine/service/system/impl/IrradianceGenPass.java rename to src/main/java/com/pine/engine/service/system/impl/IrradianceGenPass.java index 85eefd20..0102c660 100644 --- a/engine/src/main/java/com/pine/service/system/impl/IrradianceGenPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/IrradianceGenPass.java @@ -1,11 +1,11 @@ -package com.pine.service.system.impl; +package com.pine.engine.service.system.impl; -import com.pine.repository.rendering.RenderingMode; -import com.pine.service.environment.CubeMapUtil; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.streaming.impl.CubeMapFace; -import com.pine.service.system.AbstractPass; +import com.pine.engine.repository.rendering.RenderingMode; +import com.pine.engine.service.environment.CubeMapUtil; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.streaming.impl.CubeMapFace; +import com.pine.engine.service.system.AbstractPass; import org.joml.Vector3f; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL46; diff --git a/engine/src/main/java/com/pine/service/system/impl/NoiseGenPass.java b/src/main/java/com/pine/engine/service/system/impl/NoiseGenPass.java similarity index 57% rename from engine/src/main/java/com/pine/service/system/impl/NoiseGenPass.java rename to src/main/java/com/pine/engine/service/system/impl/NoiseGenPass.java index 03c3ba4c..19a98b70 100644 --- a/engine/src/main/java/com/pine/service/system/impl/NoiseGenPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/NoiseGenPass.java @@ -1,8 +1,8 @@ -package com.pine.service.system.impl; +package com.pine.engine.service.system.impl; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; import org.joml.Vector3f; public class NoiseGenPass extends AbstractQuadPass { @@ -16,8 +16,8 @@ public void onInitialize() { } @Override - protected FrameBufferObject getTargetFBO() { - return bufferRepository.noiseBuffer; + protected FBO getTargetFBO() { + return bufferRepository.windNoiseBuffer; } @Override @@ -27,9 +27,9 @@ protected Shader getShader() { @Override protected void bindUniforms() { - settings.x = terrainRepository.windAmplitude; - settings.y = terrainRepository.windFrequency; - settings.z = terrainRepository.windStrength; + settings.x = atmosphere.windAmplitude; + settings.y = atmosphere.windFrequency; + settings.z = atmosphere.windStrength; shaderService.bindVec3(settings, settingsU); } diff --git a/engine/src/main/java/com/pine/service/system/impl/PostProcessingPass.java b/src/main/java/com/pine/engine/service/system/impl/PostProcessingPass.java similarity index 92% rename from engine/src/main/java/com/pine/service/system/impl/PostProcessingPass.java rename to src/main/java/com/pine/engine/service/system/impl/PostProcessingPass.java index 4a9ae605..1dbb9e73 100644 --- a/engine/src/main/java/com/pine/service/system/impl/PostProcessingPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/PostProcessingPass.java @@ -1,8 +1,8 @@ -package com.pine.service.system.impl; +package com.pine.engine.service.system.impl; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; public class PostProcessingPass extends AbstractQuadPass { private UniformDTO distortionIntensity; @@ -33,7 +33,7 @@ public void onInitialize() { } @Override - protected FrameBufferObject getTargetFBO() { + protected FBO getTargetFBO() { return engine.bufferRepository.postProcessingBuffer; } diff --git a/engine/src/main/java/com/pine/service/system/impl/ShaderDataSyncPass.java b/src/main/java/com/pine/engine/service/system/impl/ShaderDataSyncPass.java similarity index 80% rename from engine/src/main/java/com/pine/service/system/impl/ShaderDataSyncPass.java rename to src/main/java/com/pine/engine/service/system/impl/ShaderDataSyncPass.java index 7c73a4b2..a609ecaa 100644 --- a/engine/src/main/java/com/pine/service/system/impl/ShaderDataSyncPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/ShaderDataSyncPass.java @@ -1,7 +1,7 @@ -package com.pine.service.system.impl; +package com.pine.engine.service.system.impl; -import com.pine.messaging.Loggable; -import com.pine.service.system.AbstractPass; +import com.pine.common.messaging.Loggable; +import com.pine.engine.service.system.AbstractPass; public class ShaderDataSyncPass extends AbstractPass implements Loggable { @Override diff --git a/src/main/java/com/pine/engine/service/system/impl/ShadowsPass.java b/src/main/java/com/pine/engine/service/system/impl/ShadowsPass.java new file mode 100644 index 00000000..adec77ad --- /dev/null +++ b/src/main/java/com/pine/engine/service/system/impl/ShadowsPass.java @@ -0,0 +1,56 @@ +package com.pine.engine.service.system.impl; + +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.fbo.FBOCreationData; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.system.AbstractPass; + +public class ShadowsPass extends AbstractPass { + private long sinceLastRun; + private UniformDTO modelMatrix; + private UniformDTO textureSize; + private UniformDTO tilesScaleTranslation; + private UniformDTO heightScale; + private UniformDTO terrainOffset; + + @Override + public void onInitialize() { + modelMatrix = shaderRepository.shadowsPrimitiveShader.addUniformDeclaration("modelMatrix"); + textureSize = shaderRepository.shadowsTerrainShader.addUniformDeclaration("textureSize"); + terrainOffset = shaderRepository.shadowsTerrainShader.addUniformDeclaration("terrainOffset"); + tilesScaleTranslation = shaderRepository.shadowsTerrainShader.addUniformDeclaration("tilesScaleTranslation"); + heightScale = shaderRepository.shadowsTerrainShader.addUniformDeclaration("heightScale"); + } + + @Override + protected boolean isRenderable() { + if (bufferRepository.shadowsBuffer == null || bufferRepository.shadowsBuffer.width != engineRepository.sunShadowsResolution) { + if (bufferRepository.shadowsBuffer != null) { + fboService.dispose(bufferRepository.shadowsBuffer); + } + + bufferRepository.shadowsBuffer = fboService.create(new FBOCreationData(engineRepository.sunShadowsResolution, engineRepository.sunShadowsResolution, true).addDepthSampler("Sun Shadows")); + bufferRepository.shadowsSampler = bufferRepository.shadowsBuffer.getDepthSampler(); + } + return (clockRepository.totalTime - sinceLastRun) >= engineRepository.updateSunShadowsEvery && atmosphere.shadows; + } + + @Override + protected FBO getTargetFBO() { + return bufferRepository.shadowsBuffer; + } + + @Override + protected void renderInternal() { + sinceLastRun = clockRepository.totalTime; + if (terrainRepository.castsShadows) { + shaderService.bind(shaderRepository.shadowsTerrainShader); + meshService.renderTerrain(textureSize, terrainOffset, heightScale, tilesScaleTranslation); + } + } + + @Override + public String getTitle() { + return "Shadows"; + } +} diff --git a/engine/src/main/java/com/pine/service/system/impl/VoxelVisualizerPass.java b/src/main/java/com/pine/engine/service/system/impl/VoxelVisualizerPass.java similarity index 82% rename from engine/src/main/java/com/pine/service/system/impl/VoxelVisualizerPass.java rename to src/main/java/com/pine/engine/service/system/impl/VoxelVisualizerPass.java index 27cfeda7..a8085870 100644 --- a/engine/src/main/java/com/pine/service/system/impl/VoxelVisualizerPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/VoxelVisualizerPass.java @@ -1,16 +1,16 @@ -package com.pine.service.system.impl; - -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.streaming.ref.VoxelChunkResourceRef; -import com.pine.service.system.AbstractPass; +package com.pine.engine.service.system.impl; + +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.streaming.ref.VoxelChunkResourceRef; +import com.pine.engine.service.system.AbstractPass; import org.joml.Vector3i; import org.joml.Vector4f; import org.lwjgl.opengl.GL46; -import static com.pine.service.resource.ShaderService.COMPUTE_RUNTIME_DATA; +import static com.pine.engine.service.resource.shader.ShaderService.COMPUTE_RUNTIME_DATA; public class VoxelVisualizerPass extends AbstractPass { private static final int LOCAL_SIZE_X = 8; @@ -66,7 +66,7 @@ protected void renderInternal() { } private void bindGlobal() { - FrameBufferObject fbo = bufferRepository.postProcessingBuffer; + FBO fbo = bufferRepository.postProcessingBuffer; fbo.bindForWriting(); COMPUTE_RUNTIME_DATA.groupX = (fbo.width + LOCAL_SIZE_X - 1) / LOCAL_SIZE_X; diff --git a/engine/src/main/java/com/pine/service/system/impl/AbstractGBufferPass.java b/src/main/java/com/pine/engine/service/system/impl/gbuffer/AbstractGBufferPass.java similarity index 87% rename from engine/src/main/java/com/pine/service/system/impl/AbstractGBufferPass.java rename to src/main/java/com/pine/engine/service/system/impl/gbuffer/AbstractGBufferPass.java index 27b9e88a..bd2061d7 100644 --- a/engine/src/main/java/com/pine/service/system/impl/AbstractGBufferPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/gbuffer/AbstractGBufferPass.java @@ -1,12 +1,11 @@ -package com.pine.service.system.impl; +package com.pine.engine.service.system.impl.gbuffer; -import com.pine.repository.DebugShadingModel; -import com.pine.repository.rendering.RenderingMode; -import com.pine.repository.rendering.RenderingRequest; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.streaming.ref.MaterialResourceRef; -import com.pine.service.system.AbstractPass; +import com.pine.engine.repository.ShadingMode; +import com.pine.engine.repository.rendering.RenderingMode; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.streaming.ref.MaterialResourceRef; +import com.pine.engine.service.system.AbstractPass; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL46; @@ -52,7 +51,7 @@ public void onInitialize() { } @Override - protected FrameBufferObject getTargetFBO() { + protected FBO getTargetFBO() { return bufferRepository.gBuffer; } @@ -60,7 +59,7 @@ protected void prepareCall() { GL46.glEnable(GL11.GL_DEPTH_TEST); GL46.glDisable(GL11.GL_BLEND); - if (!engineRepository.isBakingEnvironmentMaps && engineRepository.debugShadingModel == DebugShadingModel.WIREFRAME) { + if (!engineRepository.isBakingEnvironmentMaps && engineRepository.shadingMode == ShadingMode.WIREFRAME) { meshService.setRenderingMode(RenderingMode.WIREFRAME); GL46.glDisable(GL11.GL_CULL_FACE); } else { @@ -69,9 +68,9 @@ protected void prepareCall() { } if (engineRepository.isBakingEnvironmentMaps) { - shaderService.bindInt(DebugShadingModel.LIT.getId(), debugShadingMode); + shaderService.bindInt(ShadingMode.LIT.getId(), debugShadingMode); } else { - shaderService.bindInt(engineRepository.debugShadingModel.getId(), debugShadingMode); + shaderService.bindInt(engineRepository.shadingMode.getId(), debugShadingMode); shaderService.bindFloat(engineRepository.probeFiltering, probeFilteringLevels); bindEnvironmentMaps(); } diff --git a/engine/src/main/java/com/pine/service/system/impl/DecalGBufferPass.java b/src/main/java/com/pine/engine/service/system/impl/gbuffer/DecalGBufferPass.java similarity index 84% rename from engine/src/main/java/com/pine/service/system/impl/DecalGBufferPass.java rename to src/main/java/com/pine/engine/service/system/impl/gbuffer/DecalGBufferPass.java index ac0babe6..2b6c2e11 100644 --- a/engine/src/main/java/com/pine/service/system/impl/DecalGBufferPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/gbuffer/DecalGBufferPass.java @@ -1,10 +1,10 @@ -package com.pine.service.system.impl; +package com.pine.engine.service.system.impl.gbuffer; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.grid.WorldTile; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.streaming.ref.MaterialResourceRef; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.streaming.ref.MaterialResourceRef; +import com.pine.engine.service.world.WorldTile; public class DecalGBufferPass extends AbstractGBufferPass { private UniformDTO renderIndex; diff --git a/src/main/java/com/pine/engine/service/system/impl/gbuffer/FoliageGBufferPass.java b/src/main/java/com/pine/engine/service/system/impl/gbuffer/FoliageGBufferPass.java new file mode 100644 index 00000000..9e2a4f75 --- /dev/null +++ b/src/main/java/com/pine/engine/service/system/impl/gbuffer/FoliageGBufferPass.java @@ -0,0 +1,60 @@ +package com.pine.engine.service.system.impl.gbuffer; + +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.streaming.ref.MaterialResourceRef; +import com.pine.engine.service.streaming.ref.MeshResourceRef; +import com.pine.engine.service.system.impl.FoliageCullingPass; +import org.lwjgl.opengl.GL46; + + +public class FoliageGBufferPass extends AbstractGBufferPass { + private UniformDTO terrainOffsetU; + private UniformDTO objectScale; + + @Override + public void onInitialize() { + super.onInitialize(); + terrainOffsetU = addUniformDeclaration("terrainOffset"); + objectScale = addUniformDeclaration("objectScale"); + } + + @Override + protected Shader getShader() { + return shaderRepository.gBufferFoliageShader; + } + + @Override + protected boolean isRenderable() { + return terrainRepository.enabled; + } + + @Override + protected void renderInternal() { + prepareCall(); + shaderService.bindVec2(terrainRepository.offset, terrainOffsetU); + shaderService.bindSampler2dDirect(bufferRepository.windNoiseSampler, 10); + for (var foliage : terrainRepository.foliage) { + if(FoliageCullingPass.isFoliageNotReady(foliage)){ + continue; + } + + var mesh = (MeshResourceRef) streamingService.streamIn(foliage.mesh, StreamableResourceType.MESH); + var material = (MaterialResourceRef) streamingService.streamIn(foliage.material, StreamableResourceType.MATERIAL); + bindMaterial(material); + if (mesh != null) { + shaderService.bindVec3(foliage.objectScale, objectScale); + meshService.bind(mesh); + GL46.glBindBuffer(GL46.GL_DRAW_INDIRECT_BUFFER, foliage.indirectDrawBuffer); + GL46.glBindBufferBase(GL46.GL_SHADER_STORAGE_BUFFER, 3, foliage.transformationsBuffer); + GL46.glDrawElementsIndirect(GL46.GL_TRIANGLES, GL46.GL_UNSIGNED_INT, GL46.GL_NONE); + } + } + } + + @Override + public String getTitle() { + return "Foliage rendering"; + } +} diff --git a/engine/src/main/java/com/pine/service/system/impl/GBufferShadingPass.java b/src/main/java/com/pine/engine/service/system/impl/gbuffer/GBufferShadingPass.java similarity index 89% rename from engine/src/main/java/com/pine/service/system/impl/GBufferShadingPass.java rename to src/main/java/com/pine/engine/service/system/impl/gbuffer/GBufferShadingPass.java index c70df612..3973696a 100644 --- a/engine/src/main/java/com/pine/service/system/impl/GBufferShadingPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/gbuffer/GBufferShadingPass.java @@ -1,8 +1,9 @@ -package com.pine.service.system.impl; +package com.pine.engine.service.system.impl.gbuffer; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.system.impl.AbstractQuadPass; public class GBufferShadingPass extends AbstractQuadPass { private UniformDTO SSRFalloff; @@ -19,7 +20,7 @@ public class GBufferShadingPass extends AbstractQuadPass { private UniformDTO screenSpaceShadows; @Override - protected FrameBufferObject getTargetFBO() { + protected FBO getTargetFBO() { return bufferRepository.gBufferTarget; } @@ -68,7 +69,7 @@ protected void bindUniforms() { shaderService.bindSampler2dDirect(bufferRepository.gBufferMaterialSampler, 3); shaderService.bindSampler2dDirect(bufferRepository.brdfSampler, 4); shaderService.bindSampler2dDirect(bufferRepository.ssaoBlurredSampler, 5); -// shaderService.bindSampler2dDirect(fboRepository.ssgiSampler, 6); + shaderService.bindSampler2dDirect(bufferRepository.shadowsSampler, 6); shaderService.bindSampler2dDirect(bufferRepository.postProcessingSampler, 7); shaderService.bindSampler2dDirect(bufferRepository.gBufferDepthIndexSampler, 8); shaderService.bindSampler2dDirect(bufferRepository.gBufferIndirectSampler, 9); diff --git a/engine/src/main/java/com/pine/service/system/impl/PrimitiveGBufferPass.java b/src/main/java/com/pine/engine/service/system/impl/gbuffer/PrimitiveGBufferPass.java similarity index 88% rename from engine/src/main/java/com/pine/service/system/impl/PrimitiveGBufferPass.java rename to src/main/java/com/pine/engine/service/system/impl/gbuffer/PrimitiveGBufferPass.java index 527f72dd..7608cc90 100644 --- a/engine/src/main/java/com/pine/service/system/impl/PrimitiveGBufferPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/gbuffer/PrimitiveGBufferPass.java @@ -1,8 +1,8 @@ -package com.pine.service.system.impl; +package com.pine.engine.service.system.impl.gbuffer; -import com.pine.service.grid.WorldTile; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.world.WorldTile; public class PrimitiveGBufferPass extends AbstractGBufferPass { private UniformDTO renderIndex; diff --git a/engine/src/main/java/com/pine/service/system/impl/TerrainGBufferPass.java b/src/main/java/com/pine/engine/service/system/impl/gbuffer/TerrainGBufferPass.java similarity index 53% rename from engine/src/main/java/com/pine/service/system/impl/TerrainGBufferPass.java rename to src/main/java/com/pine/engine/service/system/impl/gbuffer/TerrainGBufferPass.java index abf6fc22..6f7df8ef 100644 --- a/engine/src/main/java/com/pine/service/system/impl/TerrainGBufferPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/gbuffer/TerrainGBufferPass.java @@ -1,21 +1,30 @@ -package com.pine.service.system.impl; +package com.pine.engine.service.system.impl.gbuffer; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.streaming.ref.MaterialResourceRef; -import com.pine.service.streaming.ref.TextureResourceRef; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.terrain.MaterialLayer; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.streaming.ref.MaterialResourceRef; +import com.pine.engine.service.streaming.ref.TextureResourceRef; + +import java.util.ArrayList; +import java.util.List; public class TerrainGBufferPass extends AbstractGBufferPass { private UniformDTO textureSize; private UniformDTO tilesScaleTranslation; private UniformDTO heightScale; private UniformDTO terrainOffset; + private final List materials = new ArrayList<>(); @Override public void onInitialize() { super.onInitialize(); + materials.add(addUniformDeclaration("material0")); + materials.add(addUniformDeclaration("material1")); + materials.add(addUniformDeclaration("material2")); + materials.add(addUniformDeclaration("material3")); textureSize = addUniformDeclaration("textureSize"); terrainOffset = addUniformDeclaration("terrainOffset"); tilesScaleTranslation = addUniformDeclaration("tilesScaleTranslation"); @@ -35,14 +44,7 @@ protected boolean isRenderable() { @Override protected void renderInternal() { prepareCall(); - - var foliageMask = (TextureResourceRef) streamingService.streamIn(terrainRepository.foliageMask, StreamableResourceType.TEXTURE); - if (foliageMask != null) { - foliageMask.lastUse = clockRepository.totalTime; - } - - MaterialResourceRef material = (MaterialResourceRef) streamingService.streamIn(terrainRepository.material, StreamableResourceType.MATERIAL); - bindMaterial(material); + materialService.bindMaterialLayers(terrainRepository.materialMask, terrainRepository.materialLayers, materials); meshService.renderTerrain(textureSize, terrainOffset, heightScale, tilesScaleTranslation); } diff --git a/editor/src/main/java/com/pine/tools/system/GridPass.java b/src/main/java/com/pine/engine/service/system/impl/tools/GridPass.java similarity index 60% rename from editor/src/main/java/com/pine/tools/system/GridPass.java rename to src/main/java/com/pine/engine/service/system/impl/tools/GridPass.java index ef163edf..e85b1948 100644 --- a/editor/src/main/java/com/pine/tools/system/GridPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/tools/GridPass.java @@ -1,14 +1,12 @@ -package com.pine.tools.system; - -import com.pine.injection.PInject; -import com.pine.repository.EditorRepository; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.system.impl.AbstractQuadPass; -import com.pine.tools.repository.ToolsResourceRepository; -import com.pine.tools.types.ExecutionEnvironment; -import org.joml.Vector3f; +package com.pine.engine.service.system.impl.tools; + +import com.pine.common.injection.PInject; +import com.pine.editor.repository.EditorRepository; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.system.impl.AbstractQuadPass; +import com.pine.engine.type.ExecutionEnvironment; import org.joml.Vector4f; import org.lwjgl.opengl.GL46; @@ -17,17 +15,14 @@ public class GridPass extends AbstractQuadPass { @PInject public EditorRepository editorRepository; - @PInject - public ToolsResourceRepository toolsResourceRepository; - private final Vector4f settings = new Vector4f(); private UniformDTO depthUniform; private UniformDTO settingsUniform; @Override public void onInitialize() { - settingsUniform = toolsResourceRepository.gridShader.addUniformDeclaration("settings"); - depthUniform = toolsResourceRepository.gridShader.addUniformDeclaration("sceneDepth"); + settingsUniform = addUniformDeclaration("settings"); + depthUniform = addUniformDeclaration("sceneDepth"); } @Override @@ -36,7 +31,7 @@ protected boolean isRenderable() { } @Override - protected FrameBufferObject getTargetFBO() { + protected FBO getTargetFBO() { return bufferRepository.postProcessingBuffer; } @@ -57,7 +52,7 @@ protected void bindUniforms() { @Override protected Shader getShader() { - return toolsResourceRepository.gridShader; + return shaderRepository.gridShader; } @Override diff --git a/editor/src/main/java/com/pine/tools/system/IconsPass.java b/src/main/java/com/pine/engine/service/system/impl/tools/IconsPass.java similarity index 82% rename from editor/src/main/java/com/pine/tools/system/IconsPass.java rename to src/main/java/com/pine/engine/service/system/impl/tools/IconsPass.java index 5e920a81..b5b77d0c 100644 --- a/editor/src/main/java/com/pine/tools/system/IconsPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/tools/IconsPass.java @@ -1,14 +1,13 @@ -package com.pine.tools.system; - -import com.pine.injection.PInject; -import com.pine.repository.EditorRepository; -import com.pine.repository.rendering.RenderingMode; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.system.AbstractPass; -import com.pine.tools.repository.ToolsResourceRepository; -import com.pine.tools.types.ExecutionEnvironment; +package com.pine.engine.service.system.impl.tools; + +import com.pine.common.injection.PInject; +import com.pine.editor.repository.EditorRepository; +import com.pine.engine.repository.rendering.RenderingMode; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.system.AbstractPass; +import com.pine.engine.type.ExecutionEnvironment; import org.lwjgl.opengl.GL46; @@ -16,9 +15,6 @@ public class IconsPass extends AbstractPass { @PInject public EditorRepository editorRepository; - @PInject - public ToolsResourceRepository toolsResourceRepository; - private UniformDTO transformationMatrix; private UniformDTO iconScale; private UniformDTO imageIndex; @@ -42,7 +38,7 @@ protected boolean isRenderable() { } @Override - protected FrameBufferObject getTargetFBO() { + protected FBO getTargetFBO() { return bufferRepository.gBuffer; } @@ -55,7 +51,7 @@ protected void renderInternal() { shaderService.bindFloat(editorRepository.iconScale, iconScale); shaderService.bindVec3(editorRepository.iconColor, iconColor); - shaderService.bindSampler2dDirect(toolsResourceRepository.icons, 0); + shaderService.bindSampler2dDirect(bufferRepository.icons, 0); shaderService.bindSampler2dDirect(bufferRepository.sceneDepthCopySampler, 1); meshService.bind(meshRepository.quadMesh); @@ -109,7 +105,7 @@ private void renderIcon(String entityId, int iconIndex, int index) { @Override protected Shader getShader() { - return toolsResourceRepository.iconShader; + return shaderRepository.iconShader; } @Override diff --git a/editor/src/main/java/com/pine/tools/system/PaintGizmoPass.java b/src/main/java/com/pine/engine/service/system/impl/tools/PaintGizmoPass.java similarity index 53% rename from editor/src/main/java/com/pine/tools/system/PaintGizmoPass.java rename to src/main/java/com/pine/engine/service/system/impl/tools/PaintGizmoPass.java index 822f0fc8..9147ff6b 100644 --- a/editor/src/main/java/com/pine/tools/system/PaintGizmoPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/tools/PaintGizmoPass.java @@ -1,32 +1,30 @@ -package com.pine.tools.system; - -import com.pine.injection.PInject; -import com.pine.repository.BrushMode; -import com.pine.repository.EditorMode; -import com.pine.repository.EditorRepository; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.streaming.ref.TextureResourceRef; -import com.pine.service.system.AbstractPass; -import com.pine.tools.repository.ToolsResourceRepository; -import com.pine.tools.types.ExecutionEnvironment; +package com.pine.engine.service.system.impl.tools; + +import com.pine.common.injection.PInject; +import com.pine.common.messaging.Loggable; +import com.pine.editor.repository.BrushMode; +import com.pine.editor.repository.EditorMode; +import com.pine.editor.repository.EditorRepository; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.streaming.ref.TextureResourceRef; +import com.pine.engine.service.system.AbstractPass; +import com.pine.engine.type.ExecutionEnvironment; import org.joml.Vector2f; import org.joml.Vector3f; import org.lwjgl.opengl.GL46; -import static com.pine.service.resource.ShaderService.COMPUTE_RUNTIME_DATA; +import static com.pine.engine.service.resource.shader.ShaderService.COMPUTE_RUNTIME_DATA; -public class PaintGizmoPass extends AbstractPass { +public class PaintGizmoPass extends AbstractPass implements Loggable { private static final int LOCAL_SIZE_X = 8; private static final int LOCAL_SIZE_Y = 8; + private static final long TIMEOUT = 250; @PInject public EditorRepository editorRepository; - @PInject - public ToolsResourceRepository toolsResourceRepository; - private UniformDTO xyMouseUniform; private UniformDTO paintMode; private UniformDTO heightScale; @@ -37,6 +35,8 @@ public class PaintGizmoPass extends AbstractPass { private final Vector3f radiusDensityMode = new Vector3f(); private final Vector2f targetImageSize = new Vector2f(); private TextureResourceRef targetTexture; + private TextureResourceRef lastChangedTexture; + private long sinceLastChange = 0; @Override public void onInitialize() { @@ -50,40 +50,36 @@ public void onInitialize() { @Override protected Shader getShader() { - return toolsResourceRepository.paintGizmoCompute; + return shaderRepository.paintGizmoCompute; } @Override protected boolean isRenderable() { + if ((clockRepository.totalTime - sinceLastChange) >= TIMEOUT && lastChangedTexture != null) { + writeTextureToFile(); + sinceLastChange = clockRepository.totalTime; + lastChangedTexture = null; + } return runtimeRepository.mousePressed && editorRepository.editorMode != EditorMode.TRANSFORM && editorRepository.environment == ExecutionEnvironment.DEVELOPMENT; } + private void writeTextureToFile() { + getLogger().warn("Writing modified texture {}", lastChangedTexture.id); + textureService.writeTexture(importerService.getPathToFile(lastChangedTexture.id, StreamableResourceType.TEXTURE), lastChangedTexture.width, lastChangedTexture.height, lastChangedTexture.texture); + } + @Override protected void renderInternal() { - switch (editorRepository.editorMode) { - case FOLIAGE: { - if (editorRepository.foliageForPainting != null) { - targetTexture = (TextureResourceRef) streamingService.streamIn(terrainRepository.foliageMask, StreamableResourceType.TEXTURE); - } - break; - } - case TERRAIN: { - targetTexture = (TextureResourceRef) streamingService.streamIn(terrainRepository.heightMapTexture, StreamableResourceType.TEXTURE); - break; - } - } - + targetTexture = updateTargetTexture(); if (targetTexture != null) { - targetTexture.bindForBoth(1); + targetTexture.lastUse = clockRepository.totalTime; + targetTexture.bindForBoth(0); dispatch(); - } - - if (editorRepository.editorMode == EditorMode.TERRAIN) { - terrainRepository.isHeightMapChanged = true; - } - - if (editorRepository.editorMode == EditorMode.FOLIAGE) { - terrainRepository.isFoliageMaskChanged = true; + if (lastChangedTexture != null && lastChangedTexture != targetTexture) { + writeTextureToFile(); + } + lastChangedTexture = targetTexture; + sinceLastChange = clockRepository.totalTime; } } @@ -99,8 +95,9 @@ private void dispatch() { } private void bindUniforms() { - if (editorRepository.foliageForPainting != null && terrainRepository.foliage.containsKey(editorRepository.foliageForPainting)) { - shaderService.bindVec3(terrainRepository.foliage.get(editorRepository.foliageForPainting).color, colorForPainting); + if(editorRepository.editorMode == EditorMode.MATERIAL) { + var layer = terrainRepository.materialLayers.getLayer(editorRepository.selectedMaterialLayer); + shaderService.bindVec4(layer.channel.mul(layer.weight), colorForPainting); } radiusDensityMode.x = editorRepository.brushRadius; @@ -108,7 +105,6 @@ private void bindUniforms() { radiusDensityMode.z = editorRepository.brushMode == BrushMode.ADD ? 1 : -1; shaderService.bindVec3(radiusDensityMode, radiusDensityUniform); - xyMouse.x = runtimeRepository.normalizedMouseX; xyMouse.y = runtimeRepository.normalizedMouseY; shaderService.bindVec2(xyMouse, xyMouseUniform); @@ -125,6 +121,16 @@ private void bindUniforms() { @Override public String getTitle() { - return "Paint gizmo"; + return "Terrain painting"; + } + + private TextureResourceRef updateTargetTexture() { + return switch (editorRepository.editorMode) { + case TERRAIN -> + (TextureResourceRef) streamingService.streamIn(terrainRepository.heightMapTexture, StreamableResourceType.TEXTURE); + case MATERIAL -> + (TextureResourceRef) streamingService.streamIn(terrainRepository.materialMask, StreamableResourceType.TEXTURE); + default -> null; + }; } } diff --git a/editor/src/main/java/com/pine/tools/system/PaintGizmoRenderingPass.java b/src/main/java/com/pine/engine/service/system/impl/tools/PaintGizmoRenderingPass.java similarity index 77% rename from editor/src/main/java/com/pine/tools/system/PaintGizmoRenderingPass.java rename to src/main/java/com/pine/engine/service/system/impl/tools/PaintGizmoRenderingPass.java index 56dc1fd8..55c50ad3 100644 --- a/editor/src/main/java/com/pine/tools/system/PaintGizmoRenderingPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/tools/PaintGizmoRenderingPass.java @@ -1,15 +1,14 @@ -package com.pine.tools.system; - -import com.pine.injection.PInject; -import com.pine.repository.BrushMode; -import com.pine.repository.EditorMode; -import com.pine.repository.EditorRepository; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.system.impl.AbstractQuadPass; -import com.pine.tools.repository.ToolsResourceRepository; -import com.pine.tools.types.ExecutionEnvironment; +package com.pine.engine.service.system.impl.tools; + +import com.pine.common.injection.PInject; +import com.pine.editor.repository.BrushMode; +import com.pine.editor.repository.EditorMode; +import com.pine.editor.repository.EditorRepository; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.system.impl.AbstractQuadPass; +import com.pine.engine.type.ExecutionEnvironment; import org.joml.Vector2f; import org.joml.Vector3f; import org.lwjgl.opengl.GL11; @@ -19,9 +18,6 @@ public class PaintGizmoRenderingPass extends AbstractQuadPass { @PInject public EditorRepository editorRepository; - @PInject - public ToolsResourceRepository toolsResourceRepository; - private UniformDTO xyMouseUniform; private UniformDTO viewportSize; private UniformDTO viewportOrigin; @@ -41,11 +37,11 @@ public void onInitialize() { @Override protected Shader getShader() { - return toolsResourceRepository.paintGizmoRenderingShader; + return shaderRepository.paintGizmoRenderingShader; } @Override - protected FrameBufferObject getTargetFBO() { + protected FBO getTargetFBO() { return bufferRepository.postProcessingBuffer; } diff --git a/editor/src/main/java/com/pine/tools/system/outline/BoxOutlineGenPass.java b/src/main/java/com/pine/engine/service/system/impl/tools/outline/BoxOutlineGenPass.java similarity index 70% rename from editor/src/main/java/com/pine/tools/system/outline/BoxOutlineGenPass.java rename to src/main/java/com/pine/engine/service/system/impl/tools/outline/BoxOutlineGenPass.java index c710dc7e..cb5a14c4 100644 --- a/editor/src/main/java/com/pine/tools/system/outline/BoxOutlineGenPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/tools/outline/BoxOutlineGenPass.java @@ -1,17 +1,14 @@ -package com.pine.tools.system.outline; +package com.pine.engine.service.system.impl.tools.outline; -import com.pine.injection.PInject; -import com.pine.repository.EditorMode; -import com.pine.repository.EditorRepository; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.grid.WorldTile; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.streaming.ref.TextureResourceRef; -import com.pine.service.system.AbstractPass; -import com.pine.tools.repository.ToolsResourceRepository; -import com.pine.tools.types.ExecutionEnvironment; +import com.pine.common.injection.PInject; +import com.pine.editor.repository.EditorMode; +import com.pine.editor.repository.EditorRepository; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.system.AbstractPass; +import com.pine.engine.service.world.WorldTile; +import com.pine.engine.type.ExecutionEnvironment; import org.lwjgl.opengl.GL46; @@ -19,9 +16,6 @@ public class BoxOutlineGenPass extends AbstractPass { @PInject public EditorRepository editorRepository; - @PInject - public ToolsResourceRepository toolsResourceRepository; - private UniformDTO renderIndex; private UniformDTO modelMatrix; @@ -39,12 +33,12 @@ protected boolean isRenderable() { @Override protected Shader getShader() { - return toolsResourceRepository.outlineBoxGenShader; + return shaderRepository.outlineBoxGenShader; } @Override - protected FrameBufferObject getTargetFBO() { - return toolsResourceRepository.outlineBuffer; + protected FBO getTargetFBO() { + return bufferRepository.outlineBuffer; } @Override diff --git a/editor/src/main/java/com/pine/tools/system/outline/OutlineGenPass.java b/src/main/java/com/pine/engine/service/system/impl/tools/outline/OutlineGenPass.java similarity index 71% rename from editor/src/main/java/com/pine/tools/system/outline/OutlineGenPass.java rename to src/main/java/com/pine/engine/service/system/impl/tools/outline/OutlineGenPass.java index 660313dd..2939edb8 100644 --- a/editor/src/main/java/com/pine/tools/system/outline/OutlineGenPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/tools/outline/OutlineGenPass.java @@ -1,24 +1,20 @@ -package com.pine.tools.system.outline; +package com.pine.engine.service.system.impl.tools.outline; -import com.pine.injection.PInject; -import com.pine.repository.EditorMode; -import com.pine.repository.EditorRepository; -import com.pine.service.grid.WorldTile; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.system.AbstractPass; -import com.pine.tools.repository.ToolsResourceRepository; -import com.pine.tools.types.ExecutionEnvironment; +import com.pine.common.injection.PInject; +import com.pine.editor.repository.EditorMode; +import com.pine.editor.repository.EditorRepository; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.system.AbstractPass; +import com.pine.engine.service.world.WorldTile; +import com.pine.engine.type.ExecutionEnvironment; public class OutlineGenPass extends AbstractPass { @PInject public EditorRepository editorRepository; - @PInject - public ToolsResourceRepository toolsResourceRepository; - private UniformDTO renderIndex; private UniformDTO modelMatrix; @@ -30,7 +26,7 @@ public void onInitialize() { @Override protected Shader getShader() { - return toolsResourceRepository.outlineGenShader; + return shaderRepository.outlineGenShader; } @Override @@ -39,8 +35,8 @@ protected boolean isRenderable() { } @Override - protected FrameBufferObject getTargetFBO() { - return toolsResourceRepository.outlineBuffer; + protected FBO getTargetFBO() { + return bufferRepository.outlineBuffer; } @Override diff --git a/editor/src/main/java/com/pine/tools/system/outline/OutlineRenderingPass.java b/src/main/java/com/pine/engine/service/system/impl/tools/outline/OutlineRenderingPass.java similarity index 57% rename from editor/src/main/java/com/pine/tools/system/outline/OutlineRenderingPass.java rename to src/main/java/com/pine/engine/service/system/impl/tools/outline/OutlineRenderingPass.java index 988c2e5b..cd7531ab 100644 --- a/editor/src/main/java/com/pine/tools/system/outline/OutlineRenderingPass.java +++ b/src/main/java/com/pine/engine/service/system/impl/tools/outline/OutlineRenderingPass.java @@ -1,22 +1,18 @@ -package com.pine.tools.system.outline; +package com.pine.engine.service.system.impl.tools.outline; -import com.pine.injection.PInject; -import com.pine.repository.EditorRepository; -import com.pine.service.resource.fbo.FrameBufferObject; -import com.pine.service.resource.shader.Shader; -import com.pine.service.resource.shader.UniformDTO; -import com.pine.service.system.impl.AbstractQuadPass; -import com.pine.tools.repository.ToolsResourceRepository; -import com.pine.tools.types.ExecutionEnvironment; +import com.pine.common.injection.PInject; +import com.pine.editor.repository.EditorRepository; +import com.pine.engine.service.resource.fbo.FBO; +import com.pine.engine.service.resource.shader.Shader; +import com.pine.engine.service.resource.shader.UniformDTO; +import com.pine.engine.service.system.impl.AbstractQuadPass; +import com.pine.engine.type.ExecutionEnvironment; public class OutlineRenderingPass extends AbstractQuadPass { @PInject public EditorRepository editorRepository; - @PInject - public ToolsResourceRepository toolsResourceRepository; - private UniformDTO color; private UniformDTO width; @@ -32,18 +28,18 @@ protected boolean isRenderable() { } @Override - protected FrameBufferObject getTargetFBO() { + protected FBO getTargetFBO() { return bufferRepository.postProcessingBuffer; } @Override protected Shader getShader() { - return toolsResourceRepository.outlineShader; + return shaderRepository.outlineShader; } @Override protected void bindUniforms() { - shaderService.bindSampler2dDirect(toolsResourceRepository.outlineSampler, 0); + shaderService.bindSampler2dDirect(bufferRepository.outlineSampler, 0); shaderService.bindFloat(editorRepository.outlineWidth, width); shaderService.bindVec3(editorRepository.outlineColor, color); } diff --git a/engine/src/main/java/com/pine/service/voxelization/VoxelizationService.java b/src/main/java/com/pine/engine/service/voxelization/VoxelizationService.java similarity index 82% rename from engine/src/main/java/com/pine/service/voxelization/VoxelizationService.java rename to src/main/java/com/pine/engine/service/voxelization/VoxelizationService.java index 17d84314..68947616 100644 --- a/engine/src/main/java/com/pine/service/voxelization/VoxelizationService.java +++ b/src/main/java/com/pine/engine/service/voxelization/VoxelizationService.java @@ -1,27 +1,27 @@ -package com.pine.service.voxelization; +package com.pine.engine.service.voxelization; import com.pine.FSUtil; -import com.pine.component.MeshComponent; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.messaging.Loggable; -import com.pine.repository.VoxelRepository; -import com.pine.repository.WorldRepository; -import com.pine.repository.rendering.RenderingRepository; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.service.grid.WorldService; -import com.pine.service.grid.WorldTile; -import com.pine.service.importer.ImporterService; -import com.pine.service.importer.data.MeshImportData; -import com.pine.service.streaming.StreamingService; -import com.pine.service.streaming.data.MaterialStreamData; -import com.pine.service.streaming.data.TextureStreamData; -import com.pine.service.streaming.impl.MaterialService; -import com.pine.service.streaming.impl.MeshService; -import com.pine.service.streaming.impl.TextureService; -import com.pine.service.voxelization.svo.SparseVoxelOctree; -import com.pine.service.voxelization.util.MeshUtil; -import com.pine.service.voxelization.util.VoxelizerUtil; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.common.messaging.Loggable; +import com.pine.engine.component.MeshComponent; +import com.pine.engine.repository.VoxelRepository; +import com.pine.engine.repository.WorldRepository; +import com.pine.engine.repository.rendering.RenderingRepository; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.service.importer.ImporterService; +import com.pine.engine.service.importer.data.MeshImportData; +import com.pine.engine.service.streaming.StreamingService; +import com.pine.engine.service.streaming.data.MaterialStreamData; +import com.pine.engine.service.streaming.data.TextureStreamData; +import com.pine.engine.service.streaming.impl.MaterialService; +import com.pine.engine.service.streaming.impl.MeshService; +import com.pine.engine.service.streaming.impl.TextureService; +import com.pine.engine.service.voxelization.svo.SparseVoxelOctree; +import com.pine.engine.service.voxelization.util.MeshUtil; +import com.pine.engine.service.voxelization.util.VoxelizerUtil; +import com.pine.engine.service.world.WorldService; +import com.pine.engine.service.world.WorldTile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; diff --git a/engine/src/main/java/com/pine/service/voxelization/svo/OctreeNode.java b/src/main/java/com/pine/engine/service/voxelization/svo/OctreeNode.java similarity index 97% rename from engine/src/main/java/com/pine/service/voxelization/svo/OctreeNode.java rename to src/main/java/com/pine/engine/service/voxelization/svo/OctreeNode.java index 681183f8..a2d2d87c 100644 --- a/engine/src/main/java/com/pine/service/voxelization/svo/OctreeNode.java +++ b/src/main/java/com/pine/engine/service/voxelization/svo/OctreeNode.java @@ -1,4 +1,4 @@ -package com.pine.service.voxelization.svo; +package com.pine.engine.service.voxelization.svo; import java.io.Serializable; diff --git a/engine/src/main/java/com/pine/service/voxelization/svo/SparseVoxelOctree.java b/src/main/java/com/pine/engine/service/voxelization/svo/SparseVoxelOctree.java similarity index 97% rename from engine/src/main/java/com/pine/service/voxelization/svo/SparseVoxelOctree.java rename to src/main/java/com/pine/engine/service/voxelization/svo/SparseVoxelOctree.java index 7010e7ac..e87ea34e 100644 --- a/engine/src/main/java/com/pine/service/voxelization/svo/SparseVoxelOctree.java +++ b/src/main/java/com/pine/engine/service/voxelization/svo/SparseVoxelOctree.java @@ -1,6 +1,6 @@ -package com.pine.service.voxelization.svo; +package com.pine.engine.service.voxelization.svo; -import com.pine.service.voxelization.util.BoundingBox; +import com.pine.engine.service.voxelization.util.BoundingBox; import org.joml.Vector3f; import org.joml.Vector3i; diff --git a/engine/src/main/java/com/pine/service/voxelization/svo/VoxelColorData.java b/src/main/java/com/pine/engine/service/voxelization/svo/VoxelColorData.java similarity index 88% rename from engine/src/main/java/com/pine/service/voxelization/svo/VoxelColorData.java rename to src/main/java/com/pine/engine/service/voxelization/svo/VoxelColorData.java index f0a6868e..a170c9ed 100644 --- a/engine/src/main/java/com/pine/service/voxelization/svo/VoxelColorData.java +++ b/src/main/java/com/pine/engine/service/voxelization/svo/VoxelColorData.java @@ -1,4 +1,4 @@ -package com.pine.service.voxelization.svo; +package com.pine.engine.service.voxelization.svo; public record VoxelColorData(int r, int g, int b) implements VoxelData { diff --git a/engine/src/main/java/com/pine/service/voxelization/svo/VoxelData.java b/src/main/java/com/pine/engine/service/voxelization/svo/VoxelData.java similarity index 67% rename from engine/src/main/java/com/pine/service/voxelization/svo/VoxelData.java rename to src/main/java/com/pine/engine/service/voxelization/svo/VoxelData.java index fd981580..8840d0d7 100644 --- a/engine/src/main/java/com/pine/service/voxelization/svo/VoxelData.java +++ b/src/main/java/com/pine/engine/service/voxelization/svo/VoxelData.java @@ -1,4 +1,4 @@ -package com.pine.service.voxelization.svo; +package com.pine.engine.service.voxelization.svo; import java.io.Serializable; diff --git a/engine/src/main/java/com/pine/service/voxelization/util/BoundingBox.java b/src/main/java/com/pine/engine/service/voxelization/util/BoundingBox.java similarity index 93% rename from engine/src/main/java/com/pine/service/voxelization/util/BoundingBox.java rename to src/main/java/com/pine/engine/service/voxelization/util/BoundingBox.java index 03774489..3edada3c 100644 --- a/engine/src/main/java/com/pine/service/voxelization/util/BoundingBox.java +++ b/src/main/java/com/pine/engine/service/voxelization/util/BoundingBox.java @@ -1,4 +1,4 @@ -package com.pine.service.voxelization.util; +package com.pine.engine.service.voxelization.util; import org.joml.Vector3f; diff --git a/engine/src/main/java/com/pine/service/voxelization/util/MeshUtil.java b/src/main/java/com/pine/engine/service/voxelization/util/MeshUtil.java similarity index 92% rename from engine/src/main/java/com/pine/service/voxelization/util/MeshUtil.java rename to src/main/java/com/pine/engine/service/voxelization/util/MeshUtil.java index 7a0f5a64..b33e112f 100644 --- a/engine/src/main/java/com/pine/service/voxelization/util/MeshUtil.java +++ b/src/main/java/com/pine/engine/service/voxelization/util/MeshUtil.java @@ -1,6 +1,6 @@ -package com.pine.service.voxelization.util; +package com.pine.engine.service.voxelization.util; -import com.pine.service.importer.data.MeshImportData; +import com.pine.engine.service.importer.data.MeshImportData; import org.joml.Matrix4f; import org.joml.Vector4f; diff --git a/engine/src/main/java/com/pine/service/voxelization/util/TextureUtil.java b/src/main/java/com/pine/engine/service/voxelization/util/TextureUtil.java similarity index 93% rename from engine/src/main/java/com/pine/service/voxelization/util/TextureUtil.java rename to src/main/java/com/pine/engine/service/voxelization/util/TextureUtil.java index 394c35aa..5c76f7f9 100644 --- a/engine/src/main/java/com/pine/service/voxelization/util/TextureUtil.java +++ b/src/main/java/com/pine/engine/service/voxelization/util/TextureUtil.java @@ -1,8 +1,8 @@ -package com.pine.service.voxelization.util; +package com.pine.engine.service.voxelization.util; -import com.pine.service.streaming.data.TextureStreamData; -import com.pine.service.streaming.ref.TextureResourceRef; -import com.pine.service.voxelization.svo.VoxelColorData; +import com.pine.engine.service.streaming.data.TextureStreamData; +import com.pine.engine.service.streaming.ref.TextureResourceRef; +import com.pine.engine.service.voxelization.svo.VoxelColorData; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL46; diff --git a/engine/src/main/java/com/pine/service/voxelization/util/Triangle.java b/src/main/java/com/pine/engine/service/voxelization/util/Triangle.java similarity index 89% rename from engine/src/main/java/com/pine/service/voxelization/util/Triangle.java rename to src/main/java/com/pine/engine/service/voxelization/util/Triangle.java index ef9b828e..bdd1b601 100644 --- a/engine/src/main/java/com/pine/service/voxelization/util/Triangle.java +++ b/src/main/java/com/pine/engine/service/voxelization/util/Triangle.java @@ -1,4 +1,4 @@ -package com.pine.service.voxelization.util; +package com.pine.engine.service.voxelization.util; import org.joml.Vector2f; import org.joml.Vector3f; diff --git a/engine/src/main/java/com/pine/service/voxelization/util/VoxelizerUtil.java b/src/main/java/com/pine/engine/service/voxelization/util/VoxelizerUtil.java similarity index 91% rename from engine/src/main/java/com/pine/service/voxelization/util/VoxelizerUtil.java rename to src/main/java/com/pine/engine/service/voxelization/util/VoxelizerUtil.java index 722f69fe..944b053e 100644 --- a/engine/src/main/java/com/pine/service/voxelization/util/VoxelizerUtil.java +++ b/src/main/java/com/pine/engine/service/voxelization/util/VoxelizerUtil.java @@ -1,8 +1,8 @@ -package com.pine.service.voxelization.util; +package com.pine.engine.service.voxelization.util; -import com.pine.service.importer.data.MeshImportData; -import com.pine.service.streaming.data.TextureStreamData; -import com.pine.service.voxelization.svo.SparseVoxelOctree; +import com.pine.engine.service.importer.data.MeshImportData; +import com.pine.engine.service.streaming.data.TextureStreamData; +import com.pine.engine.service.voxelization.svo.SparseVoxelOctree; import org.joml.Vector3f; diff --git a/engine/src/main/java/com/pine/service/grid/WorldGrid.java b/src/main/java/com/pine/engine/service/world/WorldGrid.java similarity index 93% rename from engine/src/main/java/com/pine/service/grid/WorldGrid.java rename to src/main/java/com/pine/engine/service/world/WorldGrid.java index 8b78eec0..0689ff69 100644 --- a/engine/src/main/java/com/pine/service/grid/WorldGrid.java +++ b/src/main/java/com/pine/engine/service/world/WorldGrid.java @@ -1,6 +1,6 @@ -package com.pine.service.grid; +package com.pine.engine.service.world; -import com.pine.messaging.Loggable; +import com.pine.common.messaging.Loggable; import org.joml.Vector3f; import java.util.HashMap; @@ -94,7 +94,7 @@ public void updateAdjacentTiles(WorldTile newTile) { private void putAdjacentTile(int[] tileLocation, WorldTile newTile) { String tileId = WorldTile.getId(tileLocation[0], tileLocation[1]); - if(tiles.containsKey(tileId)) { + if (tiles.containsKey(tileId)) { var tile = tiles.get(tileId); tile.putAdjacentTile(newTile); newTile.putAdjacentTile(tile); @@ -107,9 +107,11 @@ public Map getTiles() { public void removeTile(String id) { var tileToRemove = tiles.get(id); - tiles.remove(id); - for (var tile : tiles.values()) { - tile.removeAdjacentTile(tileToRemove); + if (tileToRemove != null) { + tiles.remove(id); + for (var tile : tiles.values()) { + tile.removeAdjacentTile(tileToRemove); + } } } diff --git a/engine/src/main/java/com/pine/service/grid/WorldService.java b/src/main/java/com/pine/engine/service/world/WorldService.java similarity index 54% rename from engine/src/main/java/com/pine/service/grid/WorldService.java rename to src/main/java/com/pine/engine/service/world/WorldService.java index e8183d9f..7c9724af 100644 --- a/engine/src/main/java/com/pine/service/grid/WorldService.java +++ b/src/main/java/com/pine/engine/service/world/WorldService.java @@ -1,27 +1,20 @@ -package com.pine.service.grid; - -import com.pine.component.MeshComponent; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.messaging.Loggable; -import com.pine.repository.CameraRepository; -import com.pine.repository.EngineRepository; -import com.pine.repository.WorldRepository; -import com.pine.service.rendering.TransformationService; -import com.pine.service.streaming.StreamingService; -import com.pine.tasks.AbstractTask; -import com.pine.tasks.SyncTask; -import org.joml.Vector2f; -import org.joml.Vector3f; +package com.pine.engine.service.world; + +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.common.messaging.Loggable; +import com.pine.engine.component.MeshComponent; +import com.pine.engine.repository.CameraRepository; +import com.pine.engine.repository.EngineRepository; +import com.pine.engine.repository.WorldRepository; +import com.pine.engine.service.streaming.StreamingService; +import com.pine.engine.tasks.SyncTask; import java.util.ArrayList; import java.util.Map; -import java.util.Objects; - -import static com.pine.service.grid.WorldGrid.TILE_SIZE; @PBean -public class WorldService extends AbstractTask implements SyncTask, Loggable { +public class WorldService implements SyncTask, Loggable { @PInject public WorldRepository repo; @@ -93,70 +86,44 @@ private void updateTileLayout() { } else { // Number of tiles reduced removeExtraTiles(); } - for (var tile : getTiles().values()) { - getHashGrid().updateAdjacentTiles(tile); + if (before != getTiles().size()) { + for (var tile : getTiles().values()) { + getHashGrid().updateAdjacentTiles(tile); + } + getLogger().warn("Tile layout update: Before {} | After {} | Expected {} | Total processing {}ms", before, getTiles().size(), squared, System.currentTimeMillis() - start); } - getLogger().warn("Tile layout update: Before {} | After {} | Total processing {}ms", before, getTiles().size(), System.currentTimeMillis() - start); } } private void addMissingTiles() { + int squared = engineRepository.numberOfTiles * engineRepository.numberOfTiles; int half = engineRepository.numberOfTiles / 2; for (int x = -half; x < half; x++) { for (int z = -half; z < half; z++) { - repo.worldGrid.createIfAbsent(x, z); + if(getTiles().size() + 1 <= squared) { + repo.worldGrid.createIfAbsent(x, z); + } } } } private void removeExtraTiles() { - int min = -engineRepository.numberOfTiles / 2; - int max = engineRepository.numberOfTiles / 2; + int half = engineRepository.numberOfTiles / 2; + int min = -half; var tiles = new ArrayList<>(getTiles().values()); - for (var tile : tiles) { - if (tile.getZ() > max || tile.getZ() < min || tile.getX() > max || tile.getX() < min) { - if (currentWorldTile != tile) { - getHashGrid().removeTile(tile.getId()); - } - } - } - } - - @Override - protected void tickInternal() { - var currentTile = repo.worldGrid.getOrCreateTile(cameraRepository.currentCamera.position); - Vector2f origin = new Vector2f(currentTile.getX(), currentTile.getZ()); - Vector2f aux = new Vector2f(); - try { - for (var tile : repo.worldGrid.getTiles().values()) { - processTile(currentTile, tile, aux, origin); - } - } catch (Exception e) { - getLogger().error("Error while processing tile", e); - } - } - - private void processTile(WorldTile currentWorldTile, WorldTile worldTile, Vector2f aux, Vector2f origin) { - if (worldTile == currentWorldTile) { - worldTile.setLoaded(true); - worldTile.setNormalizedDistance(0); + if (currentWorldTile == null || isTileOutsideBounds(currentWorldTile, half, min)) { return; } - - aux.set(worldTile.getX(), worldTile.getZ()); - worldTile.setNormalizedDistance((int) aux.sub(origin).length()); - for (var adjacent : currentWorldTile.getAdjacentTiles()) { - if (Objects.equals(adjacent, worldTile.getId())) { - worldTile.setLoaded(true); - return; + for (var tile : tiles) { + if (tile != null && isTileOutsideBounds(tile, half, min)) { + getLogger().warn("Removing tile {}", tile.getId()); + getHashGrid().removeTile(tile.getId()); } } - worldTile.setLoaded(false); } - @Override - public String getTitle() { - return "Grid processing"; + private static boolean isTileOutsideBounds(WorldTile tile, int half, int min) { + return tile.getZ() >= half || tile.getZ() <= min || tile.getX() >= half || tile.getX() <= min; } public boolean isEntityVisible(String entityId) { diff --git a/engine/src/main/java/com/pine/service/grid/WorldTile.java b/src/main/java/com/pine/engine/service/world/WorldTile.java similarity index 92% rename from engine/src/main/java/com/pine/service/grid/WorldTile.java rename to src/main/java/com/pine/engine/service/world/WorldTile.java index afa2ab4e..92dd92a6 100644 --- a/engine/src/main/java/com/pine/service/grid/WorldTile.java +++ b/src/main/java/com/pine/engine/service/world/WorldTile.java @@ -1,13 +1,14 @@ -package com.pine.service.grid; +package com.pine.engine.service.world; -import com.pine.service.voxelization.svo.SparseVoxelOctree; -import com.pine.service.voxelization.util.BoundingBox; +import com.pine.engine.service.voxelization.svo.SparseVoxelOctree; +import com.pine.engine.service.voxelization.util.BoundingBox; import org.jetbrains.annotations.NotNull; -import org.joml.Matrix4f; -import java.util.*; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; -import static com.pine.service.grid.WorldGrid.TILE_SIZE; +import static com.pine.engine.service.world.WorldGrid.TILE_SIZE; public class WorldTile { private final String[] adjacentTiles = new String[8]; diff --git a/engine/src/main/java/com/pine/tasks/AbstractTask.java b/src/main/java/com/pine/engine/tasks/AbstractTask.java similarity index 85% rename from engine/src/main/java/com/pine/tasks/AbstractTask.java rename to src/main/java/com/pine/engine/tasks/AbstractTask.java index 74e4baf5..06390957 100644 --- a/engine/src/main/java/com/pine/tasks/AbstractTask.java +++ b/src/main/java/com/pine/engine/tasks/AbstractTask.java @@ -1,8 +1,8 @@ -package com.pine.tasks; +package com.pine.engine.tasks; -import com.pine.MetricCollector; -import com.pine.injection.Disposable; -import com.pine.messaging.Loggable; +import com.pine.common.MetricCollector; +import com.pine.common.injection.Disposable; +import com.pine.common.messaging.Loggable; public abstract class AbstractTask extends MetricCollector implements Loggable, Disposable { private boolean started; diff --git a/engine/src/main/java/com/pine/tasks/RenderingTask.java b/src/main/java/com/pine/engine/tasks/RenderingTask.java similarity index 74% rename from engine/src/main/java/com/pine/tasks/RenderingTask.java rename to src/main/java/com/pine/engine/tasks/RenderingTask.java index 30cec468..ce5c8505 100644 --- a/engine/src/main/java/com/pine/tasks/RenderingTask.java +++ b/src/main/java/com/pine/engine/tasks/RenderingTask.java @@ -1,26 +1,24 @@ -package com.pine.tasks; - -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.repository.AtmosphereRepository; -import com.pine.repository.CameraRepository; -import com.pine.repository.ClockRepository; -import com.pine.repository.WorldRepository; -import com.pine.repository.core.CoreBufferRepository; -import com.pine.repository.rendering.RenderingRepository; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.repository.terrain.TerrainChunk; -import com.pine.repository.terrain.TerrainRepository; -import com.pine.service.grid.WorldService; -import com.pine.service.rendering.LightService; -import com.pine.service.rendering.RenderingRequestService; -import com.pine.service.rendering.TransformationService; -import com.pine.service.streaming.StreamingService; -import com.pine.service.streaming.ref.EnvironmentMapResourceRef; +package com.pine.engine.tasks; + +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.engine.repository.*; +import com.pine.engine.repository.core.CoreBufferRepository; +import com.pine.engine.repository.rendering.RenderingRepository; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.terrain.TerrainChunk; +import com.pine.engine.repository.terrain.TerrainRepository; +import com.pine.engine.service.rendering.LightService; +import com.pine.engine.service.rendering.RenderingRequestService; +import com.pine.engine.service.rendering.TransformationService; +import com.pine.engine.service.streaming.StreamingService; +import com.pine.engine.service.streaming.ref.EnvironmentMapResourceRef; +import com.pine.engine.service.world.WorldService; +import com.pine.engine.util.EngineUtils; import org.joml.Vector2f; import org.joml.Vector3f; -import static com.pine.service.system.impl.AbstractGBufferPass.MAX_CUBE_MAPS; +import static com.pine.engine.service.system.impl.gbuffer.AbstractGBufferPass.MAX_CUBE_MAPS; @PBean @@ -62,6 +60,9 @@ public class RenderingTask extends AbstractTask { @PInject public TerrainRepository terrainRepository; + @PInject + public EngineRepository engineRepository; + @Override protected void tickInternal() { if (renderingRepository.infoUpdated) { @@ -97,16 +98,11 @@ private void updateTerrainChunks() { .length(); int divider = 1; - if (distance >= 2) { - divider = 2; - } - - if (distance >= 3) { - divider = 4; - } - - if (distance >= 4) { - divider = 8; + int level = Math.min(4, distance - 1); + if(level > 0) { + for (int i = 0; i < level; i++) { + divider *= 2; + } } float tiles = (float) terrainRepository.quads / divider; @@ -147,19 +143,30 @@ private void updateSunInformation() { if (atmosphere.incrementTime) { atmosphere.elapsedTime += .0005f * atmosphere.elapsedTimeSpeed; } + Vector3f sunLightDirection = new Vector3f((float) Math.sin(atmosphere.elapsedTime), (float) Math.cos(atmosphere.elapsedTime), 0).mul(atmosphere.sunDistance); Vector3f sunLightColor = computeSunlightColor(sunLightDirection); + if (atmosphere.shadows) { + atmosphere.lightProjectionMatrix.ortho(-atmosphere.shadowsViewSize, atmosphere.shadowsViewSize, -atmosphere.shadowsViewSize, atmosphere.shadowsViewSize, atmosphere.shadowsNearPlane, atmosphere.shadowsFarPlane); + atmosphere.lightViewMatrix.lookAt(sunLightDirection, new Vector3f(0), new Vector3f(0, 1, 0)); + atmosphere.lightSpaceMatrix.set(atmosphere.lightViewMatrix).mul(atmosphere.lightProjectionMatrix); + } + bufferRepository.globalDataBuffer.put(87, atmosphere.elapsedTime); bufferRepository.globalDataBuffer.put(88, sunLightDirection.x); bufferRepository.globalDataBuffer.put(89, sunLightDirection.y); bufferRepository.globalDataBuffer.put(90, sunLightDirection.z); - bufferRepository.globalDataBuffer.put(91, clockRepository.totalTime - clockRepository.start); + bufferRepository.globalDataBuffer.put(91, atmosphere.sunLightIntensity); bufferRepository.globalDataBuffer.put(92, sunLightColor.x); bufferRepository.globalDataBuffer.put(93, sunLightColor.y); bufferRepository.globalDataBuffer.put(94, sunLightColor.z); + + bufferRepository.globalDataBuffer.put(95, engineRepository.sunShadowsResolution); + + EngineUtils.copyWithOffset(bufferRepository.globalDataBuffer, atmosphere.lightSpaceMatrix, 96); } private Vector3f computeSunlightColor(Vector3f sunDirection) { diff --git a/engine/src/main/java/com/pine/tasks/StreamingTask.java b/src/main/java/com/pine/engine/tasks/StreamingTask.java similarity index 82% rename from engine/src/main/java/com/pine/tasks/StreamingTask.java rename to src/main/java/com/pine/engine/tasks/StreamingTask.java index 941d242e..e000e274 100644 --- a/engine/src/main/java/com/pine/tasks/StreamingTask.java +++ b/src/main/java/com/pine/engine/tasks/StreamingTask.java @@ -1,13 +1,13 @@ -package com.pine.tasks; +package com.pine.engine.tasks; -import com.pine.injection.PBean; -import com.pine.injection.PInject; -import com.pine.messaging.Loggable; -import com.pine.repository.streaming.StreamableResourceType; -import com.pine.repository.streaming.StreamingRepository; -import com.pine.service.importer.ImporterService; -import com.pine.service.streaming.data.StreamData; -import com.pine.service.streaming.impl.AbstractStreamableService; +import com.pine.common.injection.PBean; +import com.pine.common.injection.PInject; +import com.pine.common.messaging.Loggable; +import com.pine.engine.repository.streaming.StreamableResourceType; +import com.pine.engine.repository.streaming.StreamingRepository; +import com.pine.engine.service.importer.ImporterService; +import com.pine.engine.service.streaming.data.StreamData; +import com.pine.engine.service.streaming.impl.AbstractStreamableService; import java.util.List; diff --git a/engine/src/main/java/com/pine/tasks/SyncTask.java b/src/main/java/com/pine/engine/tasks/SyncTask.java similarity index 60% rename from engine/src/main/java/com/pine/tasks/SyncTask.java rename to src/main/java/com/pine/engine/tasks/SyncTask.java index 7db1e8c6..89ff47bd 100644 --- a/engine/src/main/java/com/pine/tasks/SyncTask.java +++ b/src/main/java/com/pine/engine/tasks/SyncTask.java @@ -1,4 +1,4 @@ -package com.pine.tasks; +package com.pine.engine.tasks; public interface SyncTask { void sync(); diff --git a/engine/src/main/java/com/pine/type/AtmosphereType.java b/src/main/java/com/pine/engine/type/AtmosphereType.java similarity index 85% rename from engine/src/main/java/com/pine/type/AtmosphereType.java rename to src/main/java/com/pine/engine/type/AtmosphereType.java index 7153d9ba..d1afe7c9 100644 --- a/engine/src/main/java/com/pine/type/AtmosphereType.java +++ b/src/main/java/com/pine/engine/type/AtmosphereType.java @@ -1,6 +1,6 @@ -package com.pine.type; +package com.pine.engine.type; -import com.pine.inspection.SelectableEnum; +import com.pine.common.inspection.SelectableEnum; import java.io.Serializable; diff --git a/editor/src/main/java/com/pine/tools/types/ExecutionEnvironment.java b/src/main/java/com/pine/engine/type/ExecutionEnvironment.java similarity index 79% rename from editor/src/main/java/com/pine/tools/types/ExecutionEnvironment.java rename to src/main/java/com/pine/engine/type/ExecutionEnvironment.java index 30d9c781..c16a06ba 100644 --- a/editor/src/main/java/com/pine/tools/types/ExecutionEnvironment.java +++ b/src/main/java/com/pine/engine/type/ExecutionEnvironment.java @@ -1,4 +1,4 @@ -package com.pine.tools.types; +package com.pine.engine.type; import java.io.Serializable; diff --git a/engine/src/main/java/com/pine/type/LightType.java b/src/main/java/com/pine/engine/type/LightType.java similarity index 90% rename from engine/src/main/java/com/pine/type/LightType.java rename to src/main/java/com/pine/engine/type/LightType.java index e1ba5fcc..abfacffb 100644 --- a/engine/src/main/java/com/pine/type/LightType.java +++ b/src/main/java/com/pine/engine/type/LightType.java @@ -1,6 +1,6 @@ -package com.pine.type; +package com.pine.engine.type; -import com.pine.inspection.SelectableEnum; +import com.pine.common.inspection.SelectableEnum; public enum LightType implements SelectableEnum { SPOT("Spot light", 2, 15), diff --git a/engine/src/main/java/com/pine/type/MaterialRenderingMode.java b/src/main/java/com/pine/engine/type/MaterialRenderingMode.java similarity index 86% rename from engine/src/main/java/com/pine/type/MaterialRenderingMode.java rename to src/main/java/com/pine/engine/type/MaterialRenderingMode.java index a3ee2ebf..1fe1467e 100644 --- a/engine/src/main/java/com/pine/type/MaterialRenderingMode.java +++ b/src/main/java/com/pine/engine/type/MaterialRenderingMode.java @@ -1,6 +1,6 @@ -package com.pine.type; +package com.pine.engine.type; -import com.pine.inspection.SelectableEnum; +import com.pine.common.inspection.SelectableEnum; public enum MaterialRenderingMode implements SelectableEnum { ISOTROPIC("Isotropic", 1), diff --git a/engine/src/main/java/com/pine/EngineUtils.java b/src/main/java/com/pine/engine/util/EngineUtils.java similarity index 98% rename from engine/src/main/java/com/pine/EngineUtils.java rename to src/main/java/com/pine/engine/util/EngineUtils.java index 7a635d15..2a0c3294 100644 --- a/engine/src/main/java/com/pine/EngineUtils.java +++ b/src/main/java/com/pine/engine/util/EngineUtils.java @@ -1,4 +1,4 @@ -package com.pine; +package com.pine.engine.util; import org.joml.Matrix4f; import org.joml.Vector3f; diff --git a/engine/src/main/java/com/pine/service/ImageUtil.java b/src/main/java/com/pine/engine/util/ImageUtil.java similarity index 96% rename from engine/src/main/java/com/pine/service/ImageUtil.java rename to src/main/java/com/pine/engine/util/ImageUtil.java index 229db2e6..00e0e590 100644 --- a/engine/src/main/java/com/pine/service/ImageUtil.java +++ b/src/main/java/com/pine/engine/util/ImageUtil.java @@ -1,14 +1,14 @@ -package com.pine.service; +package com.pine.engine.util; import org.lwjgl.BufferUtils; -import org.lwjgl.stb.STBImageWrite; import org.lwjgl.system.MemoryStack; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.nio.ByteBuffer; -import static org.lwjgl.stb.STBImage.*; +import static org.lwjgl.stb.STBImage.stbi_image_free; +import static org.lwjgl.stb.STBImage.stbi_load; import static org.lwjgl.stb.STBImageWrite.stbi_write_png; import static org.lwjgl.system.MemoryStack.stackPush; import static org.lwjgl.system.MemoryUtil.memAlloc; diff --git a/editor/src/main/resources/application.properties b/src/main/resources/application.properties similarity index 100% rename from editor/src/main/resources/application.properties rename to src/main/resources/application.properties diff --git a/editor/src/main/resources/fonts/MATERIAL_ICON_LICENSE b/src/main/resources/fonts/MATERIAL_ICON_LICENSE similarity index 100% rename from editor/src/main/resources/fonts/MATERIAL_ICON_LICENSE rename to src/main/resources/fonts/MATERIAL_ICON_LICENSE diff --git a/editor/src/main/resources/fonts/MaterialIcons.ttf b/src/main/resources/fonts/MaterialIcons.ttf similarity index 100% rename from editor/src/main/resources/fonts/MaterialIcons.ttf rename to src/main/resources/fonts/MaterialIcons.ttf diff --git a/editor/src/main/resources/fonts/ROBOTO_LICENSE b/src/main/resources/fonts/ROBOTO_LICENSE similarity index 100% rename from editor/src/main/resources/fonts/ROBOTO_LICENSE rename to src/main/resources/fonts/ROBOTO_LICENSE diff --git a/editor/src/main/resources/fonts/Roboto-Regular.ttf b/src/main/resources/fonts/Roboto-Regular.ttf similarity index 100% rename from editor/src/main/resources/fonts/Roboto-Regular.ttf rename to src/main/resources/fonts/Roboto-Regular.ttf diff --git a/editor/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml similarity index 100% rename from editor/src/main/resources/log4j2.xml rename to src/main/resources/log4j2.xml diff --git a/engine/src/main/resources/shaders/ATMOSPHERE.frag b/src/main/resources/shaders/ATMOSPHERE.frag similarity index 86% rename from engine/src/main/resources/shaders/ATMOSPHERE.frag rename to src/main/resources/shaders/ATMOSPHERE.frag index d502b251..b021bba6 100644 --- a/engine/src/main/resources/shaders/ATMOSPHERE.frag +++ b/src/main/resources/shaders/ATMOSPHERE.frag @@ -2,7 +2,6 @@ in vec2 texCoords; out vec4 finalColor; -uniform float intensity; vec3 createRay() { vec2 pxNDS = texCoords * 2. - 1.; @@ -21,9 +20,8 @@ vec3 createRay() { void main(){ vec3 rayDir = createRay(); vec4 clouds = computeClouds(rayDir); - vec4 sky = vec4(1); if(clouds.a < 1){ - sky = computeAtmpshere(rayDir) * intensity; + vec3 sky = computeAtmpshere(rayDir); clouds = vec4(clouds.rgb + (1.0f - clouds.a) * sky.rgb, 1); } finalColor = clouds; diff --git a/engine/src/main/resources/shaders/ATMOSPHERE.glsl b/src/main/resources/shaders/ATMOSPHERE.glsl similarity index 53% rename from engine/src/main/resources/shaders/ATMOSPHERE.glsl rename to src/main/resources/shaders/ATMOSPHERE.glsl index fb381214..af484be2 100644 --- a/engine/src/main/resources/shaders/ATMOSPHERE.glsl +++ b/src/main/resources/shaders/ATMOSPHERE.glsl @@ -1,28 +1,19 @@ #define PI 3.14159265 -#define ONLY_MIE 0 -#define ONLY_RAYLEIGH 1 -#define COMBINED 2 - -uniform int type; -uniform vec3 rayleighBeta; -uniform vec3 mieBeta; -uniform float atmosphereRadius; -uniform float planetRadius; -uniform float rayleighHeight; -uniform float mieHeight; -uniform float threshold; -uniform int samples; +#define ATMOSPHERE_RADIUS 6420e3 +#define PLANET_RADIUS 6360e3 +#define THRESHOLD -.1f +#define RAYLEIGH_HEIGHT 7994.0 +#define MIE_HEIGHT 700. +#define INTENSITY 20. +#define SAMPLES 10 +#define RAYLEIGH_BETA vec3(3.8e-6, 13.5e-6, 33.1e-6) +#define MIE_BETA vec3(210e-5, 210e-5, 210e-5) +#define G 0.76 float mu; float muSquared; - vec3 sunDirection; -vec3 rayleighBeta1 = vec3(rayleighBeta); -vec3 mieBeta1 = vec3(mieBeta); -float atmosphereRadius1 = atmosphereRadius; -float planetRadius1 = planetRadius; -float G = 0.76; float raySphereIntersect(vec3 rayOrigin, vec3 rayDirection, vec3 sphereCenter, float sphereRadius) { float a = dot(rayDirection, rayDirection); @@ -50,10 +41,9 @@ vec3 scatteringAtHeight(vec3 scatteringAtSea, float height, float heightScale) { } float getSampleHeight(vec3 point) { - return (length(point) - planetRadius1); + return (length(point) - PLANET_RADIUS); } - vec3 transmittance(vec3 pa, vec3 pb, int samples, float scaleHeight, vec3 scatCoeffs) { float opticalDepth = 0.0; float segmentLength = length(pb - pa) / float(samples); @@ -75,26 +65,23 @@ vec3 getSkyColor(vec3 pa, vec3 pb) { float phaseM = miePhase(); vec3 rayleighColor = vec3(0.0, 0.0, 0.0); vec3 mieColor = vec3(0.0, 0.0, 0.0); - float segmentLength = length(pb - pa) / float(samples); + float fSamples = float(SAMPLES); + float segmentLength = length(pb - pa) / fSamples; - for (int i = 0; i < samples; i++) { + for (int i = 0; i < SAMPLES; i++) { - vec3 samplePoint = mix(pa, pb, (float(i) + 0.5) / float(samples)); + vec3 samplePoint = mix(pa, pb, (float(i) + 0.5) / fSamples); float sampleHeight = getSampleHeight(samplePoint); - float distanceToAtmosphere = raySphereIntersect(samplePoint, sunDirection, vec3(0.0, 0.0, 0.0), atmosphereRadius1); + float distanceToAtmosphere = raySphereIntersect(samplePoint, sunDirection, vec3(0.0, 0.0, 0.0), ATMOSPHERE_RADIUS); vec3 atmosphereIntersect = samplePoint + sunDirection * distanceToAtmosphere; - if (type == ONLY_RAYLEIGH || type == COMBINED) { - vec3 trans1R = transmittance(pa, samplePoint, 10, rayleighHeight, rayleighBeta1); - vec3 trans2R = transmittance(samplePoint, atmosphereIntersect, 10, rayleighHeight, rayleighBeta1); - rayleighColor += trans1R * trans2R * scatteringAtHeight(rayleighBeta1, sampleHeight, rayleighHeight) * segmentLength; - } - - if (type == ONLY_MIE || type == COMBINED) { - vec3 trans1M = transmittance(pa, samplePoint, 10, mieHeight, mieBeta1); - vec3 trans2M = transmittance(samplePoint, atmosphereIntersect, 10, mieHeight, mieBeta1); - mieColor += trans1M * trans2M * scatteringAtHeight(mieBeta1, sampleHeight, mieHeight) * segmentLength; - } + vec3 trans1R = transmittance(pa, samplePoint, 10, RAYLEIGH_HEIGHT, RAYLEIGH_BETA); + vec3 trans2R = transmittance(samplePoint, atmosphereIntersect, 10, RAYLEIGH_HEIGHT, RAYLEIGH_BETA); + rayleighColor += trans1R * trans2R * scatteringAtHeight(RAYLEIGH_BETA, sampleHeight, RAYLEIGH_HEIGHT) * segmentLength; + + vec3 trans1M = transmittance(pa, samplePoint, 10, MIE_HEIGHT, MIE_BETA); + vec3 trans2M = transmittance(samplePoint, atmosphereIntersect, 10, MIE_HEIGHT, MIE_BETA); + mieColor += trans1M * trans2M * scatteringAtHeight(MIE_BETA, sampleHeight, MIE_HEIGHT) * segmentLength; } rayleighColor = phaseR * rayleighColor; @@ -103,27 +90,15 @@ vec3 getSkyColor(vec3 pa, vec3 pb) { return rayleighColor + mieColor; } -vec4 computeAtmpshere(vec3 rayDir){ - rayleighBeta1.x *= 263157.; - rayleighBeta1.y *= 74074.; - rayleighBeta1.z *= 30211.; - - rayleighBeta1 = 1. / rayleighBeta1; - - mieBeta1 *= 476.; - mieBeta1 = 1. / mieBeta1; - - atmosphereRadius1 *= 6420e3; - planetRadius1 *= 6360e3; - +vec3 computeAtmpshere(vec3 rayDir){ sunDirection = normalize(sunLightDirection.xyz); - if (rayDir.y >= threshold) { - vec3 origin = vec3(0.0, planetRadius1 + 1.0, 0.0); + if (rayDir.y >= THRESHOLD) { + vec3 origin = vec3(0.0, PLANET_RADIUS + 1.0, 0.0); - float distanceToAtmosphere = raySphereIntersect(origin, rayDir, vec3(0.0, 0.0, 0.0), atmosphereRadius1); + float distanceToAtmosphere = raySphereIntersect(origin, rayDir, vec3(0.0, 0.0, 0.0), ATMOSPHERE_RADIUS); vec3 atmosphereIntersect = origin + rayDir * distanceToAtmosphere; - return vec4(getSkyColor(origin, atmosphereIntersect), 1); + return getSkyColor(origin, atmosphereIntersect) * INTENSITY; } - return vec4(0); + return vec3(0); } diff --git a/engine/src/main/resources/shaders/BILATERAL_BLUR.glsl b/src/main/resources/shaders/BILATERAL_BLUR.glsl similarity index 100% rename from engine/src/main/resources/shaders/BILATERAL_BLUR.glsl rename to src/main/resources/shaders/BILATERAL_BLUR.glsl diff --git a/engine/src/main/resources/shaders/BILINEAR_DOWNSCALE.glsl b/src/main/resources/shaders/BILINEAR_DOWNSCALE.glsl similarity index 100% rename from engine/src/main/resources/shaders/BILINEAR_DOWNSCALE.glsl rename to src/main/resources/shaders/BILINEAR_DOWNSCALE.glsl diff --git a/engine/src/main/resources/shaders/BOKEH.frag b/src/main/resources/shaders/BOKEH.frag similarity index 100% rename from engine/src/main/resources/shaders/BOKEH.frag rename to src/main/resources/shaders/BOKEH.frag diff --git a/engine/src/main/resources/shaders/BOX-BLUR.frag b/src/main/resources/shaders/BOX-BLUR.frag similarity index 100% rename from engine/src/main/resources/shaders/BOX-BLUR.frag rename to src/main/resources/shaders/BOX-BLUR.frag diff --git a/engine/src/main/resources/shaders/BRDF_GEN.frag b/src/main/resources/shaders/BRDF_GEN.frag similarity index 100% rename from engine/src/main/resources/shaders/BRDF_GEN.frag rename to src/main/resources/shaders/BRDF_GEN.frag diff --git a/engine/src/main/resources/shaders/BRIGHTNESS_FILTER.frag b/src/main/resources/shaders/BRIGHTNESS_FILTER.frag similarity index 100% rename from engine/src/main/resources/shaders/BRIGHTNESS_FILTER.frag rename to src/main/resources/shaders/BRIGHTNESS_FILTER.frag diff --git a/engine/src/main/resources/shaders/CLOUDS.glsl b/src/main/resources/shaders/CLOUDS.glsl similarity index 66% rename from engine/src/main/resources/shaders/CLOUDS.glsl rename to src/main/resources/shaders/CLOUDS.glsl index 0785cc31..031a6bd4 100644 --- a/engine/src/main/resources/shaders/CLOUDS.glsl +++ b/src/main/resources/shaders/CLOUDS.glsl @@ -2,22 +2,17 @@ layout(binding = 0) uniform sampler3D uShapeNoise; layout(binding = 1) uniform sampler3D uDetailNoise; uniform float densityMultiplier; -uniform float densityOffset; +uniform float cloudCoverage; uniform float scale; uniform float detailNoiseScale; -uniform float detailNoiseWeight; -uniform vec3 detailWeights; -uniform vec4 shapeNoiseWeights; +uniform float cloudErosionStrength; uniform vec4 phaseParams; uniform int numStepsLight; uniform float rayOffsetStrength; uniform vec3 boundsMin; uniform vec3 boundsMax; -uniform vec3 shapeOffset; -uniform vec3 detailOffset; uniform float lightAbsorptionTowardSun; uniform float lightAbsorptionThroughCloud; -uniform float darknessThreshold; uniform float baseSpeed; uniform float detailSpeed; @@ -25,16 +20,6 @@ float remap(float v, float minOld, float maxOld, float minNew, float maxNew) { return minNew + (v-minOld) * (maxNew - minNew) / (maxOld-minOld); } -vec2 squareUV(vec2 uv) { - float width = bufferResolution.x; - float height = bufferResolution.y; - //float minDim = min(width, height); - float scale = 1000; - float x = uv.x * width; - float y = uv.y * height; - return vec2 (x/scale, y/scale); -} - // Returns (dstToBox, dstInsideBox). If ray misses box, dstInsideBox will be zero // Adapted from: http://jcgt.org/published/0007/03/04/ vec2 rayBoxDst(vec3 boundsMin, vec3 boundsMax, vec3 rayOrigin, vec3 invRaydir) { @@ -52,23 +37,7 @@ vec2 rayBoxDst(vec3 boundsMin, vec3 boundsMax, vec3 rayOrigin, vec3 invRaydir) { return vec2(dstToBox, dstInsideBox); } -// Henyey-Greenstein -float hg(float a, float g) { - float g2 = g*g; - return (1-g2) / (4*3.1415*pow(1+g2-2*g*(a), 1.5)); -} - -float phase(float a) { - float blend = .5; - float hgBlend = hg(a, phaseParams.x) * (1-blend) + hg(a, -phaseParams.y) * blend; - return phaseParams.z + hgBlend*phaseParams.w; -} - -float remap01(float v, float low, float high) { - return (v-low)/(high-low); -} - -float sampleDensity(vec3 rayPos) { +float sampleDensity(vec3 rayPos, bool sampleDetail) { // Constants: const int mipLevel = 0; const float baseScale = 1/1000.0; @@ -77,7 +46,7 @@ float sampleDensity(vec3 rayPos) { vec3 size = boundsMax - boundsMin; vec3 boundsCentre = (boundsMin+boundsMax) * .5; vec3 uvw = (size * .5 + rayPos) * baseScale * scale; - vec3 shapeSamplePos = uvw + shapeOffset * offsetSpeed + vec3(timeOfDay, timeOfDay*0.1, timeOfDay*0.2) * baseSpeed; + vec3 shapeSamplePos = uvw + offsetSpeed + vec3(timeOfDay, timeOfDay*0.1, timeOfDay*0.2) * baseSpeed; // Calculate falloff at along x/z edges of the cloud container const float containerEdgeFadeDst = 50; @@ -94,23 +63,24 @@ float sampleDensity(vec3 rayPos) { // Calculate base shape density vec4 shapeNoise = texture(uShapeNoise, shapeSamplePos, mipLevel); - vec4 normalizedShapeWeights = shapeNoiseWeights / dot(shapeNoiseWeights, vec4(1)); - float shapeFBM = dot(shapeNoise, normalizedShapeWeights) * heightGradient; - float baseShapeDensity = shapeFBM + densityOffset * .1; + float shapeFBM = dot(shapeNoise, vec4(0.25)) * heightGradient; + float baseShapeDensity = shapeFBM + cloudCoverage * .1; // Save sampling from detail tex if shape density <= 0 if (baseShapeDensity > 0) { // Sample detail noise - vec3 detailSamplePos = uvw*detailNoiseScale + detailOffset * offsetSpeed + vec3(timeOfDay*.4, -timeOfDay, timeOfDay*0.1)*detailSpeed; - vec3 detailNoise = texture(uDetailNoise, detailSamplePos, mipLevel).rgb; - vec3 normalizedDetailWeights = detailWeights / dot(detailWeights, vec3(1)); - float detailFBM = dot(detailNoise, normalizedDetailWeights); + float detailFBM = 0; + if(sampleDetail){ + vec3 detailSamplePos = uvw*detailNoiseScale + offsetSpeed + vec3(timeOfDay*.4, -timeOfDay, timeOfDay*0.1)*detailSpeed; + vec3 detailNoise = texture(uDetailNoise, detailSamplePos, mipLevel).rgb; + detailFBM = dot(detailNoise, vec3(.25)); + } // Subtract detail noise from base shape (weighted by inverse density so that edges get eroded more than centre) float oneMinusShape = 1 - shapeFBM; float detailErodeWeight = oneMinusShape * oneMinusShape * oneMinusShape; - float cloudDensity = baseShapeDensity - (1-detailFBM) * detailErodeWeight * detailNoiseWeight; + float cloudDensity = baseShapeDensity - (1-detailFBM) * detailErodeWeight * cloudErosionStrength; return cloudDensity * densityMultiplier * 0.1; } @@ -119,7 +89,7 @@ float sampleDensity(vec3 rayPos) { // Calculate proportion of light that reaches the given point from the lightsource float lightmarch(vec3 position) { - vec3 dirToLight = sunLightDirection.xyz; + vec3 dirToLight = normalize(sunLightDirection.xyz); float dstInsideBox = rayBoxDst(boundsMin, boundsMax, position, 1/dirToLight).y; float stepSize = dstInsideBox/numStepsLight; @@ -127,11 +97,10 @@ float lightmarch(vec3 position) { for (int step = 0; step < numStepsLight; step ++) { position += dirToLight * stepSize; - totalDensity += max(0, sampleDensity(position) * stepSize); + totalDensity += max(0, sampleDensity(position, step < 2) * stepSize); } - float transmittance = exp(-totalDensity * lightAbsorptionTowardSun); - return darknessThreshold + transmittance * (1-darknessThreshold); + return exp(-totalDensity * lightAbsorptionTowardSun); } // Hash function for pseudo-random numbers @@ -155,6 +124,35 @@ float blueNoise(vec2 uv) { return mix(mix(a, b, blend.x), mix(c, d, blend.x), blend.y); } + + +float beer_law(float density) +{ + float d = -density * lightAbsorptionTowardSun; + return max(exp(d), exp(d * 0.5f) * 0.7f); +} + +// ------------------------------------------------------------------ +float u_HenyeyGreensteinGForward = 0.4f; +float u_HenyeyGreensteinGBackward = 0.179f; +float henyey_greenstein_phase(float cos_angle, float g) +{ + float g2 = g * g; + return ((1.0f - g2) / pow(1.0f + g2 - 2.0f * g * cos_angle, 1.5f)) / 4.0f * 3.1415f; +} +float powder_effect(float _density, float _cos_angle) +{ + float powder = 1.0f - exp(-_density * 2.0f); + return mix(1.0f, powder, clamp((-_cos_angle * 0.5f) + 0.5f, 0.0f, 1.0f)); +} +float calculate_light_energy(float _density, float _cos_angle, float _powder_density) +{ + float beer_powder = 2.0f * beer_law(_density) * powder_effect(_powder_density, _cos_angle); + float HG = max(henyey_greenstein_phase(_cos_angle, u_HenyeyGreensteinGForward), henyey_greenstein_phase(_cos_angle, u_HenyeyGreensteinGBackward)) * 0.07f + 0.8f; + return beer_powder * HG; +} + + vec4 computeClouds(vec3 rayDir){ // Create ray vec3 rayPos = cameraWorldPosition.xyz; @@ -169,11 +167,9 @@ vec4 computeClouds(vec3 rayDir){ vec3 entryPoint = rayPos + rayDir * dstToBox; - float randomOffset = blueNoise(texCoords); - randomOffset *= rayOffsetStrength; + float randomOffset = blueNoise(texCoords) * rayOffsetStrength; - float cosAngle = dot(rayDir, sunLightDirection.xyz); - float phaseVal = phase(cosAngle); + float cosAngle = dot(rayDir, normalize(sunLightDirection.xyz)); float dstTravelled = randomOffset; float dstLimit = min(dstToBox, dstInsideBox); @@ -183,15 +179,16 @@ vec4 computeClouds(vec3 rayDir){ // March through volume: float transmittance = 1; + float alpha = 0; vec3 lightEnergy = vec3(0); - while (dstTravelled < dstLimit) { rayPos = entryPoint + rayDir * dstTravelled; - float density = sampleDensity(rayPos); - + float density = sampleDensity(rayPos, true); if (density > 0) { float lightTransmittance = lightmarch(rayPos); - lightEnergy += density * stepSize * transmittance * lightTransmittance * phaseVal; + float phaseVal = 1; // TODO + alpha += (1.0f - transmittance) * (1.0f - alpha); + lightEnergy += calculate_light_energy(density * stepSize, cosAngle, lightTransmittance * stepSize) * sunLightColor.rgb * alpha * transmittance * density; transmittance *= exp(-density * stepSize * lightAbsorptionThroughCloud); // Exit early if T is close to zero as further samples won't affect the result much @@ -201,5 +198,5 @@ vec4 computeClouds(vec3 rayDir){ } dstTravelled += stepSize; } - return vec4(lightEnergy * sunLightColor, 1 - transmittance); + return vec4(lightEnergy, 1 - transmittance); } \ No newline at end of file diff --git a/engine/src/main/resources/shaders/COMPOSITE.frag b/src/main/resources/shaders/COMPOSITE.frag similarity index 71% rename from engine/src/main/resources/shaders/COMPOSITE.frag rename to src/main/resources/shaders/COMPOSITE.frag index dfa52bd3..b72a1c01 100644 --- a/engine/src/main/resources/shaders/COMPOSITE.frag +++ b/src/main/resources/shaders/COMPOSITE.frag @@ -1,7 +1,6 @@ in vec2 texCoords; out vec4 finalColor; -uniform vec3 backgroundColor; layout (binding = 0) uniform sampler2D primary; layout (binding = 1) uniform sampler2D depth; layout (binding = 2) uniform sampler2D secondary; @@ -13,10 +12,6 @@ void main(){ }else { vec3 s = texture(secondary, texCoords).rgb; float sLength = length(s); - if (sLength == 0){ - finalColor = vec4(backgroundColor, 1); - } else { - finalColor = vec4(s, 1); - } + finalColor = vec4(s, 1); } } \ No newline at end of file diff --git a/engine/src/main/resources/shaders/CUBEMAP.vert b/src/main/resources/shaders/CUBEMAP.vert similarity index 100% rename from engine/src/main/resources/shaders/CUBEMAP.vert rename to src/main/resources/shaders/CUBEMAP.vert diff --git a/engine/src/main/resources/shaders/DIRECTIONAL_SHADOWS.frag b/src/main/resources/shaders/DIRECTIONAL_SHADOWS.frag similarity index 100% rename from engine/src/main/resources/shaders/DIRECTIONAL_SHADOWS.frag rename to src/main/resources/shaders/DIRECTIONAL_SHADOWS.frag diff --git a/engine/src/main/resources/shaders/FRAME_COMPOSITION.frag b/src/main/resources/shaders/FRAME_COMPOSITION.frag similarity index 100% rename from engine/src/main/resources/shaders/FRAME_COMPOSITION.frag rename to src/main/resources/shaders/FRAME_COMPOSITION.frag diff --git a/engine/src/main/resources/shaders/GAUSSIAN.frag b/src/main/resources/shaders/GAUSSIAN.frag similarity index 100% rename from engine/src/main/resources/shaders/GAUSSIAN.frag rename to src/main/resources/shaders/GAUSSIAN.frag diff --git a/engine/src/main/resources/shaders/IRRADIANCE_MAP.frag b/src/main/resources/shaders/IRRADIANCE_MAP.frag similarity index 100% rename from engine/src/main/resources/shaders/IRRADIANCE_MAP.frag rename to src/main/resources/shaders/IRRADIANCE_MAP.frag diff --git a/engine/src/main/resources/shaders/LENS_POST_PROCESSING.frag b/src/main/resources/shaders/LENS_POST_PROCESSING.frag similarity index 85% rename from engine/src/main/resources/shaders/LENS_POST_PROCESSING.frag rename to src/main/resources/shaders/LENS_POST_PROCESSING.frag index 4bbcaa10..238b0aa4 100644 --- a/engine/src/main/resources/shaders/LENS_POST_PROCESSING.frag +++ b/src/main/resources/shaders/LENS_POST_PROCESSING.frag @@ -61,12 +61,22 @@ vec3 PBRNeutralToneMapping( vec3 color ) { return mix(color, newPeak * vec3(1, 1, 1), g); } +vec3 aces( vec3 x ) { + // Narkowicz 2015, "ACES Filmic Tone Mapping Curve" + const float a = 2.51; + const float b = 0.03; + const float c = 2.43; + const float d = 0.59; + const float e = 0.14; + return (x * (a * x + b)) / (x * (c * x + d) + e); +} + void main(void) { vec2 texCoords = distortionEnabled ? lensDistortion(texCoords, distortionIntensity * .5) : texCoords; - vec3 color = bloomEnabled ? PBRNeutralToneMapping(texture(bloomColor, texCoords).rgb) : vec3(0.); + vec3 color = bloomEnabled ? aces(texture(bloomColor, texCoords).rgb) : vec3(0.); color += chromaticAberrationEnabled ? chromaticAberration(texCoords) : texture(sceneColor, texCoords).rgb; - fragColor = vec4(PBRNeutralToneMapping(color), 1.); + fragColor = vec4(aces(color), 1.); if (vignetteEnabled) { vec2 uv = texCoords; diff --git a/engine/src/main/resources/shaders/MOTION_BLUR.frag b/src/main/resources/shaders/MOTION_BLUR.frag similarity index 100% rename from engine/src/main/resources/shaders/MOTION_BLUR.frag rename to src/main/resources/shaders/MOTION_BLUR.frag diff --git a/engine/src/main/resources/shaders/NOISE.frag b/src/main/resources/shaders/NOISE.frag similarity index 100% rename from engine/src/main/resources/shaders/NOISE.frag rename to src/main/resources/shaders/NOISE.frag diff --git a/engine/src/main/resources/shaders/OMNIDIRECTIONAL_SHADOWS.frag b/src/main/resources/shaders/OMNIDIRECTIONAL_SHADOWS.frag similarity index 100% rename from engine/src/main/resources/shaders/OMNIDIRECTIONAL_SHADOWS.frag rename to src/main/resources/shaders/OMNIDIRECTIONAL_SHADOWS.frag diff --git a/engine/src/main/resources/shaders/PREFILTERED_MAP.frag b/src/main/resources/shaders/PREFILTERED_MAP.frag similarity index 100% rename from engine/src/main/resources/shaders/PREFILTERED_MAP.frag rename to src/main/resources/shaders/PREFILTERED_MAP.frag diff --git a/engine/src/main/resources/shaders/QUAD.vert b/src/main/resources/shaders/QUAD.vert similarity index 100% rename from engine/src/main/resources/shaders/QUAD.vert rename to src/main/resources/shaders/QUAD.vert diff --git a/engine/src/main/resources/shaders/QUAD_COPY.frag b/src/main/resources/shaders/QUAD_COPY.frag similarity index 100% rename from engine/src/main/resources/shaders/QUAD_COPY.frag rename to src/main/resources/shaders/QUAD_COPY.frag diff --git a/engine/src/main/resources/shaders/SHADOWS.vert b/src/main/resources/shaders/SHADOWS.vert similarity index 100% rename from engine/src/main/resources/shaders/SHADOWS.vert rename to src/main/resources/shaders/SHADOWS.vert diff --git a/engine/src/main/resources/shaders/SPRITE.frag b/src/main/resources/shaders/SPRITE.frag similarity index 100% rename from engine/src/main/resources/shaders/SPRITE.frag rename to src/main/resources/shaders/SPRITE.frag diff --git a/engine/src/main/resources/shaders/SPRITE.vert b/src/main/resources/shaders/SPRITE.vert similarity index 100% rename from engine/src/main/resources/shaders/SPRITE.vert rename to src/main/resources/shaders/SPRITE.vert diff --git a/engine/src/main/resources/shaders/SSAO.frag b/src/main/resources/shaders/SSAO.frag similarity index 100% rename from engine/src/main/resources/shaders/SSAO.frag rename to src/main/resources/shaders/SSAO.frag diff --git a/engine/src/main/resources/shaders/SSGI.frag b/src/main/resources/shaders/SSGI.frag similarity index 100% rename from engine/src/main/resources/shaders/SSGI.frag rename to src/main/resources/shaders/SSGI.frag diff --git a/src/main/resources/shaders/TERRAIN_MATERIAL_MASK_GEN.frag b/src/main/resources/shaders/TERRAIN_MATERIAL_MASK_GEN.frag new file mode 100644 index 00000000..64441baa --- /dev/null +++ b/src/main/resources/shaders/TERRAIN_MATERIAL_MASK_GEN.frag @@ -0,0 +1,33 @@ +in vec2 texCoords; +out vec4 FragColor; + +layout(binding = 0) uniform sampler2D heightMap; + +uniform vec4 color1; +uniform vec4 color2; +uniform vec4 color3; +uniform vec4 color4; + +void main() { + float height = texture(heightMap, texCoords).r; + + float t1 = 0.33; + float t2 = 0.66; + + vec4 blendedColor; + + if (height < t1) { + float factor = height / t1; + blendedColor = mix(color1, color2, factor); + } + else if (height < t2) { + float factor = (height - t1) / (t2 - t1); + blendedColor = mix(color2, color3, factor); + } + else { + float factor = (height - t2) / (1.0 - t2); + blendedColor = mix(color3, color4, factor); + } + + FragColor = blendedColor; +} \ No newline at end of file diff --git a/engine/src/main/resources/shaders/TO_SCREEN.frag b/src/main/resources/shaders/TO_SCREEN.frag similarity index 100% rename from engine/src/main/resources/shaders/TO_SCREEN.frag rename to src/main/resources/shaders/TO_SCREEN.frag diff --git a/engine/src/main/resources/shaders/UPSAMPLE_TENT.glsl b/src/main/resources/shaders/UPSAMPLE_TENT.glsl similarity index 100% rename from engine/src/main/resources/shaders/UPSAMPLE_TENT.glsl rename to src/main/resources/shaders/UPSAMPLE_TENT.glsl diff --git a/engine/src/main/resources/shaders/buffer_objects/GLOBAL_DATA_UBO.glsl b/src/main/resources/shaders/buffer_objects/GLOBAL_DATA_UBO.glsl similarity index 70% rename from engine/src/main/resources/shaders/buffer_objects/GLOBAL_DATA_UBO.glsl rename to src/main/resources/shaders/buffer_objects/GLOBAL_DATA_UBO.glsl index 9c0dd658..654b00e3 100644 --- a/engine/src/main/resources/shaders/buffer_objects/GLOBAL_DATA_UBO.glsl +++ b/src/main/resources/shaders/buffer_objects/GLOBAL_DATA_UBO.glsl @@ -8,6 +8,9 @@ uniform GlobalData{ vec2 bufferResolution; float logDepthFC; float timeOfDay; - vec4 sunLightDirection; + vec3 sunLightDirection; + float sunLightIntensity; vec3 sunLightColor; + float sunShadowsResolution; + mat4 lightSpaceMatrix; }; \ No newline at end of file diff --git a/engine/src/main/resources/shaders/buffer_objects/LIGHT_METADATA_SSBO.glsl b/src/main/resources/shaders/buffer_objects/LIGHT_METADATA_SSBO.glsl similarity index 100% rename from engine/src/main/resources/shaders/buffer_objects/LIGHT_METADATA_SSBO.glsl rename to src/main/resources/shaders/buffer_objects/LIGHT_METADATA_SSBO.glsl diff --git a/engine/src/main/resources/shaders/buffer_objects/MODEL_SSBO.glsl b/src/main/resources/shaders/buffer_objects/MODEL_SSBO.glsl similarity index 100% rename from engine/src/main/resources/shaders/buffer_objects/MODEL_SSBO.glsl rename to src/main/resources/shaders/buffer_objects/MODEL_SSBO.glsl diff --git a/engine/src/main/resources/shaders/compute/CLOUD_DETAIL_COMPUTE.glsl b/src/main/resources/shaders/compute/CLOUD_DETAIL_COMPUTE.glsl similarity index 71% rename from engine/src/main/resources/shaders/compute/CLOUD_DETAIL_COMPUTE.glsl rename to src/main/resources/shaders/compute/CLOUD_DETAIL_COMPUTE.glsl index ceca4ba2..bb5c6444 100644 --- a/engine/src/main/resources/shaders/compute/CLOUD_DETAIL_COMPUTE.glsl +++ b/src/main/resources/shaders/compute/CLOUD_DETAIL_COMPUTE.glsl @@ -15,10 +15,7 @@ void main() float worley0 = worley_fbm(texCoord, freq); float worley1 = worley_fbm(texCoord, freq * 2.0f); float worley2 = worley_fbm(texCoord, freq * 4.0f); - float worley3 = worley_fbm(texCoord, freq * 8.0f); - vec4 worley = vec4(worley0, worley1, worley2, worley3); - - imageStore(noiseSampler, ivec3(gl_GlobalInvocationID), worley); + imageStore(noiseSampler, ivec3(gl_GlobalInvocationID), vec4(worley0, worley1, worley2, 1)); } diff --git a/engine/src/main/resources/shaders/compute/CLOUD_SHAPE_COMPUTE.glsl b/src/main/resources/shaders/compute/CLOUD_SHAPE_COMPUTE.glsl similarity index 100% rename from engine/src/main/resources/shaders/compute/CLOUD_SHAPE_COMPUTE.glsl rename to src/main/resources/shaders/compute/CLOUD_SHAPE_COMPUTE.glsl diff --git a/src/main/resources/shaders/compute/FOLIAGE_CULLING_COMPUTE.glsl b/src/main/resources/shaders/compute/FOLIAGE_CULLING_COMPUTE.glsl new file mode 100644 index 00000000..d0e29163 --- /dev/null +++ b/src/main/resources/shaders/compute/FOLIAGE_CULLING_COMPUTE.glsl @@ -0,0 +1,128 @@ +layout (local_size_x = 4, local_size_y = 4) in; + +layout (binding = 0) uniform sampler2D materialMask; +layout (binding = 1) uniform sampler2D heightMap; +layout (binding = 2, offset = 0) uniform atomic_uint globalIndex; + +layout(std430, binding = 3) writeonly buffer TransformationBuffer { + vec3 transformations[]; +}; + +layout(std430, binding = 4) writeonly buffer IndirectBuffer { + uint count;// Number of indices + uint instanceCount;// Number of instances + uint firstIndex;// First index + uint baseVertex;// Base vertex + uint baseInstance;// Base instance ID +} drawCommand; + +uniform vec2 terrainOffset; +uniform vec4 colorToMatch; +uniform vec4 settings; +uniform vec2 imageSize; +uniform float heightScale; + +#define MAX_DISTANCE_FROM_CAMERA settings.x +#define MAX_INSTANCES uint(settings.y) + +#include "../buffer_objects/GLOBAL_DATA_UBO.glsl" + +shared vec4 l; +shared vec4 r; +shared vec4 b; +shared vec4 t; +shared vec4 n; +shared vec4 f; +shared int rows_per_thread; +shared int cols_per_thread; +const int N = 1024; +const ivec2 total_threads = ivec2(1024); + +vec3 getWorldPosition(vec2 uv, vec2 planeSize) { + float worldX = uv.x * planeSize.x + terrainOffset.x; + float worldZ = uv.y * planeSize.y + terrainOffset.y; + return vec3(worldX, 0, worldZ); +} + +bool isPointInsideFrustum(vec3 point) { + vec4 p4D = vec4(point, 1.); + return (dot(l, p4D) >= 0) && + (dot(r, p4D) <= 0) && + (dot(t, p4D) <= 0) && + (dot(b, p4D) >= 0) && + (dot(n, p4D) >= 0) && + (dot(f, p4D) <= 0); +} + +bool isEqual(float u, float v){ + return u == 0 || u == v; +} + +vec2 hash(vec2 a) { + a = fract(a * vec2(.8)); + a += dot(a, a.yx + 19.19); + return fract((a.xx + a.yx)*a.xy); +} + +bool check(float v, float v1){ + return v != 0 && v1 != 0; +} + +void doWork(int col, int row){ + vec2 scaledTexCoord= (vec2(round(cameraWorldPosition.x), round(cameraWorldPosition.z)) + vec2(row, col)) / imageSize; + if (scaledTexCoord.x <= 1 && scaledTexCoord.x >= 0 && scaledTexCoord.y <= 1 && scaledTexCoord.y >= 0){ + vec4 pixelColor = texture(materialMask, scaledTexCoord); + if (check(pixelColor.r, colorToMatch.r) || check(pixelColor.g, colorToMatch.g) || check(pixelColor.b, colorToMatch.b) || check(pixelColor.a, colorToMatch.a)){ + vec3 worldSpaceCoord = getWorldPosition(scaledTexCoord, imageSize); + worldSpaceCoord.xz += hash(worldSpaceCoord.xz); + if (length(worldSpaceCoord.xz - cameraWorldPosition.xz) < MAX_DISTANCE_FROM_CAMERA){ + scaledTexCoord = (worldSpaceCoord.xz - terrainOffset)/imageSize; + worldSpaceCoord.y = texture(heightMap, scaledTexCoord).r * heightScale; + if (isPointInsideFrustum(worldSpaceCoord)){ + uint index = atomicCounterIncrement(globalIndex); + if (index < MAX_INSTANCES){ + transformations[index] = worldSpaceCoord; + } + } + } + } + } +} + +void main() { + if (gl_LocalInvocationIndex == 0){ + mat4 m = transpose(viewProjection); + vec4 Row1 = vec4(m[0][0], m[0][1], m[0][2], m[0][3]); + vec4 Row2 = vec4(m[1][0], m[1][1], m[1][2], m[1][3]); + vec4 Row3 = vec4(m[2][0], m[2][1], m[2][2], m[2][3]); + vec4 Row4 = vec4(m[3][0], m[3][1], m[3][2], m[3][3]); + + l = Row1 + Row4; + r = Row1 - Row4; + b = Row2 + Row4; + t = Row2 - Row4; + n = Row3 + Row4; + f = Row3 - Row4; + + rows_per_thread = (N + total_threads.y - 1) / total_threads.y; + cols_per_thread = (N + total_threads.x - 1) / total_threads.x; + } + + ivec2 global_id = ivec2(gl_GlobalInvocationID.xy); + int start_row = global_id.y * rows_per_thread; + int start_col = global_id.x * cols_per_thread; + + for (int row = start_row; row < min(start_row + rows_per_thread, N); ++row) { + for (int col = start_col; col < min(start_col + cols_per_thread, N); ++col) { + doWork(col, row); + } + } + + if (ivec2(gl_GlobalInvocationID.xy) == (total_threads - 1)){ + drawCommand.instanceCount = atomicCounter(globalIndex); + drawCommand.count = uint(settings.z); + drawCommand.firstIndex= 0; + drawCommand.baseVertex= 0; + drawCommand.baseInstance = 0; + } +} \ No newline at end of file diff --git a/engine/src/main/resources/shaders/compute/MESHLET_COMPUTE.glsl b/src/main/resources/shaders/compute/MESHLET_COMPUTE.glsl similarity index 100% rename from engine/src/main/resources/shaders/compute/MESHLET_COMPUTE.glsl rename to src/main/resources/shaders/compute/MESHLET_COMPUTE.glsl diff --git a/engine/src/main/resources/shaders/compute/PAINT_GIZMO_COMPUTE.glsl b/src/main/resources/shaders/compute/PAINT_GIZMO_COMPUTE.glsl similarity index 79% rename from engine/src/main/resources/shaders/compute/PAINT_GIZMO_COMPUTE.glsl rename to src/main/resources/shaders/compute/PAINT_GIZMO_COMPUTE.glsl index 3d0bfc58..a0cd91df 100644 --- a/engine/src/main/resources/shaders/compute/PAINT_GIZMO_COMPUTE.glsl +++ b/src/main/resources/shaders/compute/PAINT_GIZMO_COMPUTE.glsl @@ -1,17 +1,15 @@ layout (local_size_x = 8, local_size_y = 8) in; #define TERRAIN 1 -#define FOLIAGE 2 -#define MATERIAL 3 +#define MATERIAL 2 -layout (rgba8, binding = 0) uniform image2D outputImage; -layout (rgba8, binding = 1) uniform image2D targetImage; +layout (rgba8, binding = 0) uniform image2D targetImage; layout (binding = 2) uniform sampler2D sceneDepth; uniform int paintMode; uniform float heightScale; uniform vec2 xyMouse; -uniform vec3 colorForPainting; +uniform vec4 colorForPainting; uniform vec2 targetImageSize; uniform vec3 radiusDensityMode; @@ -32,7 +30,8 @@ bool randomBoolean(float density) { void main() { // RECONSTRUCT POSITION BASED ON MOUSE POSITION vec2 textureCoord = xyMouse.xy; - float depthData = getLogDepth(textureCoord); + vec4 mousePixelData = texture(sceneDepth, textureCoord); + float depthData = getLogDepthFromSampler(mousePixelData); if (depthData == 1.){ return; } @@ -41,8 +40,8 @@ void main() { // RECONSTRUCT POSITION BASED ON FRAGMENT POSITION textureCoord = vec2(gl_GlobalInvocationID.xy / bufferResolution); - vec4 depthIdUVData = texture(sceneDepth, textureCoord); - depthData = getLogDepthFromSampler(depthIdUVData); + vec4 currentPixelData = texture(sceneDepth, textureCoord); + depthData = getLogDepthFromSampler(currentPixelData); if (depthData == 1.){ return; } @@ -58,11 +57,11 @@ void main() { return; } - ivec2 uvScaled = ivec2(targetImageSize * depthIdUVData.ba); + ivec2 uvScaled = ivec2(targetImageSize * currentPixelData.ba); if (paintMode == TERRAIN){ float scale = (distToCenter/radiusDensityMode.x) * radiusDensityMode.y; imageStore(targetImage, uvScaled, radiusDensityMode.z < 1 ? vec4(vec3(originalYPosition - scale) / heightScale, 1) : vec4(vec3(originalYPosition + .1 * scale)/heightScale, 1)); - } else if (paintMode == FOLIAGE && randomBoolean(radiusDensityMode.y * radiusDensityMode.y)){ - imageStore(targetImage, uvScaled, radiusDensityMode.z < 1 ? NONE : vec4(colorForPainting, 1)); + } else if(paintMode == MATERIAL){ + imageStore(targetImage, uvScaled, radiusDensityMode.z < 1 ? NONE : colorForPainting); } } \ No newline at end of file diff --git a/engine/src/main/resources/shaders/compute/VOXEL_RAY_MARCHING_COMPUTE.glsl b/src/main/resources/shaders/compute/VOXEL_RAY_MARCHING_COMPUTE.glsl similarity index 100% rename from engine/src/main/resources/shaders/compute/VOXEL_RAY_MARCHING_COMPUTE.glsl rename to src/main/resources/shaders/compute/VOXEL_RAY_MARCHING_COMPUTE.glsl diff --git a/src/main/resources/shaders/shadows/EMPTY.frag b/src/main/resources/shaders/shadows/EMPTY.frag new file mode 100644 index 00000000..93529b15 --- /dev/null +++ b/src/main/resources/shaders/shadows/EMPTY.frag @@ -0,0 +1,2 @@ +void main(){ +} \ No newline at end of file diff --git a/src/main/resources/shaders/shadows/PRIMITIVE.vert b/src/main/resources/shaders/shadows/PRIMITIVE.vert new file mode 100644 index 00000000..e69de29b diff --git a/engine/src/main/resources/shaders/tool/OUTLINE_GEN_TERRAIN.vert b/src/main/resources/shaders/shadows/TERRAIN.vert similarity index 70% rename from engine/src/main/resources/shaders/tool/OUTLINE_GEN_TERRAIN.vert rename to src/main/resources/shaders/shadows/TERRAIN.vert index 4b6811be..26bce3f9 100644 --- a/engine/src/main/resources/shaders/tool/OUTLINE_GEN_TERRAIN.vert +++ b/src/main/resources/shaders/shadows/TERRAIN.vert @@ -7,13 +7,9 @@ uniform vec2 terrainOffset; uniform int textureSize; uniform float heightScale; -layout (binding = 8) uniform sampler2D heightMap; - -flat out int rIndex; +layout (binding = 3) uniform sampler2D heightMap; void main() { - rIndex = 1; - TerrainData terrain = computeTerrainData(tilesScaleTranslation, terrainOffset, textureSize, heightMap, heightScale); - gl_Position = viewProjection * vec4(terrain.position, 1); + gl_Position = lightSpaceMatrix * vec4(terrain.position, 1); } diff --git a/engine/src/main/resources/shaders/tool/GRID.frag b/src/main/resources/shaders/tool/GRID.frag similarity index 62% rename from engine/src/main/resources/shaders/tool/GRID.frag rename to src/main/resources/shaders/tool/GRID.frag index c3144729..a79b316b 100644 --- a/engine/src/main/resources/shaders/tool/GRID.frag +++ b/src/main/resources/shaders/tool/GRID.frag @@ -57,25 +57,31 @@ void main() { } if (hasData){ - vec3 baseColor = vec3(0.3); - vec3 xAxisColor = vec3(1.0, 0.0, 0.0); - vec3 zAxisColor = vec3(0.0, 0.0, 1.0); + float distanceFromCamera = length(cameraWorldPosition.xyz - p.xyz); + float alpha = 1; + if (distanceFromCamera >= THREASHOLD){ + alpha = 0; + } else { + float opacity = abs(distanceFromCamera - THREASHOLD) / ((distanceFromCamera + THREASHOLD) / 2.); + alpha = min(1, opacity); + } - float isXAxis = step(abs(p.z/ SCALE), isOverlay ? 0 : THICKNESS); - float isZAxis = step(abs(p.x/ SCALE), isOverlay ? 0 : THICKNESS); + if (alpha > 0){ + vec3 baseColor = vec3(0.3); + vec3 xAxisColor = vec3(1.0, 0.0, 0.0); + vec3 zAxisColor = vec3(0.0, 0.0, 1.0); - vec3 axisColor = mix(zAxisColor, xAxisColor, isXAxis); - vec4 centerLineColor = vec4(axisColor, 1.0) * max(isXAxis, isZAxis); + float isXAxis = step(abs(p.z/ SCALE), isOverlay ? 0 : THICKNESS); + float isZAxis = step(abs(p.x/ SCALE), isOverlay ? 0 : THICKNESS); - vec4 gridColor = mix(vec4(baseColor, 1.0), vec4(0), getGridLine(1)); - gridColor = mix(vec4(baseColor/2., 1.0), gridColor, getGridLine(5)); - finalColor = mix(gridColor, centerLineColor, max(isXAxis, isZAxis)); + vec3 axisColor = mix(zAxisColor, xAxisColor, isXAxis); + vec4 centerLineColor = vec4(axisColor, 1.0) * max(isXAxis, isZAxis); - if (finalColor.a > 0){ - float distanceFromCamera = length(cameraWorldPosition.xyz - p.xyz); - float opacity = abs(distanceFromCamera - THREASHOLD) / ((distanceFromCamera + THREASHOLD) / 2.); - finalColor.a = opacity; + vec4 gridColor = mix(vec4(baseColor, 1.0), vec4(0), getGridLine(1)); + gridColor = mix(vec4(baseColor/2., 1.0), gridColor, getGridLine(5)); + finalColor = mix(gridColor, centerLineColor, max(isXAxis, isZAxis)); } + finalColor.a = min(alpha, finalColor.a); } else { discard; } diff --git a/engine/src/main/resources/shaders/tool/ICON.frag b/src/main/resources/shaders/tool/ICON.frag similarity index 78% rename from engine/src/main/resources/shaders/tool/ICON.frag rename to src/main/resources/shaders/tool/ICON.frag index 33c7e49b..1915322b 100644 --- a/engine/src/main/resources/shaders/tool/ICON.frag +++ b/src/main/resources/shaders/tool/ICON.frag @@ -8,13 +8,6 @@ uniform float imageIndex; uniform int renderIndex; uniform bool isSelected; -layout (location = 0) out vec4 gBufferAlbedoSampler; -layout (location = 1) out vec4 gBufferNormalSampler; -layout (location = 2) out vec4 gBufferRMAOSampler; -layout (location = 3) out vec4 gBufferMaterialSampler; -layout (location = 4) out vec4 gBufferDepthSampler; -layout (location = 5) out vec4 gBufferIndirect; - #include "../util/SCENE_DEPTH_UTILS.glsl" #include "../uber/G_BUFFER_UTIL.glsl" diff --git a/engine/src/main/resources/shaders/tool/ICON.vert b/src/main/resources/shaders/tool/ICON.vert similarity index 100% rename from engine/src/main/resources/shaders/tool/ICON.vert rename to src/main/resources/shaders/tool/ICON.vert diff --git a/engine/src/main/resources/shaders/tool/OUTLINE.frag b/src/main/resources/shaders/tool/OUTLINE.frag similarity index 100% rename from engine/src/main/resources/shaders/tool/OUTLINE.frag rename to src/main/resources/shaders/tool/OUTLINE.frag diff --git a/engine/src/main/resources/shaders/tool/OUTLINE_GEN.frag b/src/main/resources/shaders/tool/OUTLINE_GEN.frag similarity index 100% rename from engine/src/main/resources/shaders/tool/OUTLINE_GEN.frag rename to src/main/resources/shaders/tool/OUTLINE_GEN.frag diff --git a/engine/src/main/resources/shaders/tool/OUTLINE_GEN.vert b/src/main/resources/shaders/tool/OUTLINE_GEN.vert similarity index 100% rename from engine/src/main/resources/shaders/tool/OUTLINE_GEN.vert rename to src/main/resources/shaders/tool/OUTLINE_GEN.vert diff --git a/engine/src/main/resources/shaders/tool/OUTLINE_GEN_BOX.frag b/src/main/resources/shaders/tool/OUTLINE_GEN_BOX.frag similarity index 100% rename from engine/src/main/resources/shaders/tool/OUTLINE_GEN_BOX.frag rename to src/main/resources/shaders/tool/OUTLINE_GEN_BOX.frag diff --git a/engine/src/main/resources/shaders/tool/PAINT_GIZMO.frag b/src/main/resources/shaders/tool/PAINT_GIZMO.frag similarity index 100% rename from engine/src/main/resources/shaders/tool/PAINT_GIZMO.frag rename to src/main/resources/shaders/tool/PAINT_GIZMO.frag diff --git a/engine/src/main/resources/shaders/uber/G_BUFFER.frag b/src/main/resources/shaders/uber/G_BUFFER.frag similarity index 54% rename from engine/src/main/resources/shaders/uber/G_BUFFER.frag rename to src/main/resources/shaders/uber/G_BUFFER.frag index 922921e9..9f8592d3 100644 --- a/engine/src/main/resources/shaders/uber/G_BUFFER.frag +++ b/src/main/resources/shaders/uber/G_BUFFER.frag @@ -1,20 +1,3 @@ - -#define ALBEDO 0 -#define NORMAL 1 -#define DEPTH 3 -#define AO 4 -#define LIGHT_ONLY 6 -#define METALLIC 7 -#define ROUGHNESS 8 -#define POSITION 11 -#define RANDOM 13 -#define WIREFRAME 17 -#define UV_FLAG 18 -#define INDIRECT 19 -#define TRIANGLE_ID 20 -#define HEIGHT 21 -#define LIT -1 - #define ISOTROPIC 1 #define ANISOTROPIC 2 #define SHEEN 3 @@ -23,7 +6,6 @@ #define DECAL_DEPTH_THRESHOLD 1. - in mat4 invModelMatrix; flat in int isDecalPass; flat in int renderingIndex; @@ -31,15 +13,13 @@ smooth in vec2 initialUV; smooth in vec3 normalVec; smooth in vec3 worldSpacePosition; -layout (binding = 0) uniform samplerCube specularProbe; -layout (binding = 1) uniform samplerCube irradianceProbe; -layout (binding = 2) uniform samplerCube irradianceProbe1; -layout (binding = 3) uniform sampler2D albedo; layout (binding = 4) uniform sampler2D roughness; layout (binding = 5) uniform sampler2D metallic; layout (binding = 6) uniform sampler2D ao; -layout (binding = 7) uniform sampler2D normal; layout (binding = 8) uniform sampler2D heightMap; + +layout (binding = 3) uniform sampler2D albedo; +layout (binding = 7) uniform sampler2D normal; layout (binding = 9) uniform sampler2D sceneDepth; uniform vec3 albedoColor; @@ -47,10 +27,8 @@ uniform vec2 roughnessMetallic; uniform vec4 useAlbedoRoughnessMetallicAO; uniform bool useNormalTexture; -uniform float probeFilteringLevels; uniform float parallaxHeightScale; uniform int parallaxLayers; -uniform int debugShadingMode; uniform bool useParallax; uniform bool fallbackMaterial; @@ -62,18 +40,6 @@ uniform float sheenTint; uniform int renderingMode; uniform bool ssrEnabled; -layout (location = 0) out vec4 gBufferAlbedoSampler; -layout (location = 1) out vec4 gBufferNormalSampler; -layout (location = 2) out vec4 gBufferRMAOSampler; - -// X channel: 16 bits for anisotropicRotation + 16 bits for anisotropy -// Y channel: 16 bits for clearCoat + 16 bits for sheen -// Z channel: 16 bits for sheenTint + 15 bits for renderingMode + 1 bit for ssrEnabled -// W channel: 32 bit render index -layout (location = 3) out vec4 gBufferMaterialSampler; -layout (location = 4) out vec4 gBufferDepthSampler; -layout (location = 5) out vec4 gBufferIndirect; - #include "../util/SCENE_DEPTH_UTILS.glsl" #include "../uber/MATERIAL_INFO.glsl" @@ -85,7 +51,7 @@ void main() { vec3 W = worldSpacePosition; vec3 N = normalVec; float depth = encode(logDepthFC, gl_FragCoord.z); - if(isDecalPass == 1){ + if (isDecalPass == 1){ vec2 quadUV = gl_FragCoord.xy/bufferResolution; depth = getLogDepth(quadUV); if (depth == 1.) discard; @@ -122,7 +88,11 @@ void main() { bool useAlbedo = useAlbedoRoughnessMetallicAO.r != 0; bool useAO = useAlbedoRoughnessMetallicAO.a != 0; - gBufferAlbedoSampler = vec4(useAlbedo ? texture(albedo, UV).rgb : albedoColor, 0); + vec4 al = texture(albedo, UV); + if(al.a < .5){ + discard; + } + gBufferAlbedoSampler = vec4(useAlbedo ? al.rgb : albedoColor, 0); if (useNormalTexture){ N = vec3(normalize(TBN * ((texture(normal, UV).rgb * 2.0)- 1.0))); } @@ -135,58 +105,7 @@ void main() { } gBufferNormalSampler = vec4(N, 1); + sampleIndirectIllumination(V, N); - vec3 R = reflect(-V, N); - float specularFactor = 1.0 - gBufferRMAOSampler.r; - vec3 combinedReflection = mix( - texture(irradianceProbe, R).rgb, - textureLod(specularProbe, R, gBufferRMAOSampler.r * probeFilteringLevels).rgb, - specularFactor); - gBufferIndirect = vec4(combinedReflection, 1); - - if (debugShadingMode != LIT){ - switch (debugShadingMode) { - case RANDOM: - gBufferAlbedoSampler.rgb = randomColor(renderingIndex + 1); - break; - case WIREFRAME: - gBufferAlbedoSampler.rgb = vec3(1., 0., 1.); - break; - case LIGHT_ONLY: - gBufferAlbedoSampler.rgb = vec3(.5); - break; - case NORMAL: - gBufferAlbedoSampler = gBufferNormalSampler; - break; - case DEPTH: - gBufferAlbedoSampler.rgb = vec3(distanceFromCamera) / 10; - break; - case AO: - gBufferAlbedoSampler.rgb = vec3(gBufferRMAOSampler.b); - break; - case METALLIC: - gBufferAlbedoSampler.rgb = vec3(gBufferRMAOSampler.g); - break; - case ROUGHNESS: - gBufferAlbedoSampler.rgb = vec3(gBufferRMAOSampler.r); - break; - case POSITION: - gBufferAlbedoSampler.rgb = vec3(W); - break; - case UV_FLAG: - gBufferAlbedoSampler.rgb = vec3(UV, 0); - break; - case INDIRECT: - gBufferAlbedoSampler.rgb = gBufferIndirect.rgb; - break; - case TRIANGLE_ID: - gBufferAlbedoSampler.rgb = randomColor(gl_PrimitiveID); - break; - case HEIGHT: - gBufferAlbedoSampler.rgb = vec3(W.y/10); - break; - } - - gBufferAlbedoSampler.a = debugShadingMode != LIGHT_ONLY ? 1 : 0; - } + processDebugFlags(UV, W, renderingIndex, distanceFromCamera, vec4(0)); } \ No newline at end of file diff --git a/engine/src/main/resources/shaders/uber/G_BUFFER.vert b/src/main/resources/shaders/uber/G_BUFFER.vert similarity index 100% rename from engine/src/main/resources/shaders/uber/G_BUFFER.vert rename to src/main/resources/shaders/uber/G_BUFFER.vert diff --git a/engine/src/main/resources/shaders/uber/G_BUFFER_DECAL.vert b/src/main/resources/shaders/uber/G_BUFFER_DECAL.vert similarity index 100% rename from engine/src/main/resources/shaders/uber/G_BUFFER_DECAL.vert rename to src/main/resources/shaders/uber/G_BUFFER_DECAL.vert diff --git a/engine/src/main/resources/shaders/uber/G_BUFFER_FOLIAGE.vert b/src/main/resources/shaders/uber/G_BUFFER_FOLIAGE.vert similarity index 60% rename from engine/src/main/resources/shaders/uber/G_BUFFER_FOLIAGE.vert rename to src/main/resources/shaders/uber/G_BUFFER_FOLIAGE.vert index 719fb36e..fc01abe1 100644 --- a/engine/src/main/resources/shaders/uber/G_BUFFER_FOLIAGE.vert +++ b/src/main/resources/shaders/uber/G_BUFFER_FOLIAGE.vert @@ -10,6 +10,7 @@ layout(std430, binding = 3) buffer TransformationBuffer { layout(binding = 10) uniform sampler2D noise; uniform vec2 terrainOffset; +uniform vec3 objectScale; out mat4 invModelMatrix; flat out int isDecalPass; @@ -18,21 +19,23 @@ smooth out vec2 initialUV; smooth out vec3 normalVec; smooth out vec3 worldSpacePosition; +float hash(float seed) { + return fract(sin(seed * 0.1) * 43758.5453); +} + void main() { isDecalPass = 0; invModelMatrix = mat4(0); - renderingIndex = gl_InstanceID + 1; - vec3 translation = transformations[renderingIndex]; - vec3 updatedPosition = position + translation; - vec2 normPos = normalize(terrainOffset + translation.xz); + vec3 translation = transformations[gl_InstanceID]; + float hashedValue = hash(translation.x + translation.z / (max(0, abs(translation.y)))); + renderingIndex = int(length(translation)); + vec2 normPos = normalize(terrainOffset + translation.xz); vec2 noiseVal = texture(noise, normPos).rg * position.y; - - updatedPosition += vec3(noiseVal.x, 0, noiseVal.y); - worldSpacePosition = updatedPosition.xyz; + worldSpacePosition = position * objectScale * max(hashedValue, .5) + translation + vec3(noiseVal.x, 0, noiseVal.y); normalVec = normalize(normal); initialUV = uv; - gl_Position = viewProjection * vec4(updatedPosition, 1); + gl_Position = viewProjection * vec4(worldSpacePosition, 1); } diff --git a/engine/src/main/resources/shaders/uber/G_BUFFER_SHADING.frag b/src/main/resources/shaders/uber/G_BUFFER_SHADING.frag similarity index 97% rename from engine/src/main/resources/shaders/uber/G_BUFFER_SHADING.frag rename to src/main/resources/shaders/uber/G_BUFFER_SHADING.frag index 32d24492..de2ed0e2 100644 --- a/engine/src/main/resources/shaders/uber/G_BUFFER_SHADING.frag +++ b/src/main/resources/shaders/uber/G_BUFFER_SHADING.frag @@ -27,7 +27,7 @@ layout(binding = 2) uniform sampler2D gBufferRMAOSampler; layout(binding = 3) uniform sampler2D gBufferMaterialSampler; layout(binding = 4) uniform sampler2D brdfSampler; layout(binding = 5) uniform sampler2D SSAO; -layout(binding = 6) uniform sampler2D SSGI; +layout(binding = 6) uniform sampler2D sunShadows; layout(binding = 7) uniform sampler2D previousFrame; layout(binding = 8) uniform sampler2D sceneDepth; layout(binding = 9) uniform sampler2D gBufferIndirect; @@ -105,7 +105,7 @@ void main() { discard; } vec4 albedoEmissive = texture(gBufferAlbedoSampler, quadUV); - if (albedoEmissive.a == 1) { // EMISSION + if (albedoEmissive.a > 0) { // EMISSION color = vec4(albedoEmissive.rgb, 1.); return; } diff --git a/src/main/resources/shaders/uber/G_BUFFER_TERRAIN.frag b/src/main/resources/shaders/uber/G_BUFFER_TERRAIN.frag new file mode 100644 index 00000000..793722cd --- /dev/null +++ b/src/main/resources/shaders/uber/G_BUFFER_TERRAIN.frag @@ -0,0 +1,104 @@ +#define ISOTROPIC 1 +#define ANISOTROPIC 2 +#define SHEEN 3 +#define CLEAR_COAT 4 +#define TRANSPARENCY 5 + +#define DECAL_DEPTH_THRESHOLD 1. + +flat in int renderingIndex; +smooth in vec2 initialUV; +smooth in vec3 normalVec; +smooth in vec3 worldSpacePosition; + +layout (binding = 4) uniform sampler2D materialMask; + +layout (binding = 5) uniform sampler2D albedo; +layout (binding = 6) uniform sampler2D roughness; +layout (binding = 7) uniform sampler2D metallic; +layout (binding = 8) uniform sampler2D normal; +uniform vec4 material0; + +layout (binding = 9) uniform sampler2D albedo1; +layout (binding = 10) uniform sampler2D roughness1; +layout (binding = 11) uniform sampler2D metallic1; +layout (binding = 12) uniform sampler2D normal1; +uniform vec4 material1; + +layout (binding = 13) uniform sampler2D albedo2; +layout (binding = 14) uniform sampler2D roughness2; +layout (binding = 15) uniform sampler2D metallic2; +layout (binding = 16) uniform sampler2D normal2; +uniform vec4 material2; + +layout (binding = 17) uniform sampler2D albedo3; +layout (binding = 18) uniform sampler2D roughness3; +layout (binding = 19) uniform sampler2D metallic3; +layout (binding = 20) uniform sampler2D normal3; +uniform vec4 material3; + +uniform vec3 albedoColor; +uniform vec2 roughnessMetallic; + +uniform float parallaxHeightScale; +uniform int parallaxLayers; +uniform bool useParallax; +uniform bool fallbackMaterial; + +uniform int renderingMode; +uniform bool ssrEnabled; + +#include "../buffer_objects/GLOBAL_DATA_UBO.glsl" + +#include "../uber/MATERIAL_INFO.glsl" + +#include "../uber/G_BUFFER_UTIL.glsl" + +float totalWeight = 0; +void blendMaterial(inout vec4 matMask, vec4 matId, inout vec2 UV, sampler2D albedo, sampler2D roughness, sampler2D metallic, sampler2D normal){ + float weight = 0; + if (matId.r != 0 && matMask.r != 0){ + weight = matMask.r; + } else if (matId.g != 0 && matMask.g != 0){ + weight = matMask.g; + } else if (matId.b != 0 && matMask.b != 0){ + weight = matMask.b; + } else if (matId.a != 0 && matMask.a != 0){ + weight = matMask.a; + } + + if (weight > 0){ + totalWeight += weight; + gBufferAlbedoSampler += vec4(texture(albedo, UV).rgb, 0) * weight; + gBufferRMAOSampler += vec4(texture(roughness, UV).r, texture(metallic, UV).r, 0, 1); + gBufferMaterialSampler = vec4(packValues(0, 0, 0, 0, 0, ISOTROPIC, false), 1); + gBufferNormalSampler += vec4(vec3(normalize(computeTBN(worldSpacePosition, UV, normalVec, 0) * ((texture(normal, UV).rgb * 2.0)- 1.0))) * weight, 1); + } +} + +void main() { + vec3 W = worldSpacePosition; + vec2 UV = W.xz * .1; + vec3 V = cameraWorldPosition.xyz - W; + vec3 N = normalVec; + vec4 materialId = texture(materialMask, initialUV); + gBufferDepthSampler = vec4(encode(logDepthFC, gl_FragCoord.z), renderingIndex + 1, initialUV); + + if (length(materialId) == 0){ + totalWeight = 1; + gBufferAlbedoSampler = vec4(vec3(1), 0); + gBufferRMAOSampler = vec4(1, 0, 0, 1); + gBufferMaterialSampler = vec4(packValues(0, 0, 0, 0, 0, ISOTROPIC, false), 1); + gBufferNormalSampler = vec4(N, 1); + } else { + blendMaterial(materialId, material0, UV, albedo, roughness, metallic, normal); + blendMaterial(materialId, material1, UV, albedo1, roughness1, metallic1, normal1); + blendMaterial(materialId, material2, UV, albedo2, roughness2, metallic2, normal2); + blendMaterial(materialId, material3, UV, albedo3, roughness3, metallic3, normal3); + } + gBufferAlbedoSampler.rgb /= totalWeight; + gBufferNormalSampler.rgb /= totalWeight; + + sampleIndirectIllumination(V, gBufferNormalSampler.rgb); + processDebugFlags(UV, W, renderingIndex, length(V), materialId * 10.); +} \ No newline at end of file diff --git a/engine/src/main/resources/shaders/uber/G_BUFFER_TERRAIN.vert b/src/main/resources/shaders/uber/G_BUFFER_TERRAIN.vert similarity index 83% rename from engine/src/main/resources/shaders/uber/G_BUFFER_TERRAIN.vert rename to src/main/resources/shaders/uber/G_BUFFER_TERRAIN.vert index 7d0f296f..02b85514 100644 --- a/engine/src/main/resources/shaders/uber/G_BUFFER_TERRAIN.vert +++ b/src/main/resources/shaders/uber/G_BUFFER_TERRAIN.vert @@ -7,18 +7,14 @@ uniform vec2 terrainOffset; uniform int textureSize; uniform float heightScale; -layout (binding = 8) uniform sampler2D heightMap; +layout (binding = 3) uniform sampler2D heightMap; -out mat4 invModelMatrix; -flat out int isDecalPass; flat out int renderingIndex; smooth out vec2 initialUV; smooth out vec3 normalVec; smooth out vec3 worldSpacePosition; void main() { - isDecalPass = 0; - invModelMatrix = mat4(0); renderingIndex = int(tilesScaleTranslation.z + tilesScaleTranslation.w); TerrainData terrain = computeTerrainData(tilesScaleTranslation, terrainOffset, textureSize, heightMap, heightScale); diff --git a/src/main/resources/shaders/uber/G_BUFFER_UTIL.glsl b/src/main/resources/shaders/uber/G_BUFFER_UTIL.glsl new file mode 100644 index 00000000..3104d1c2 --- /dev/null +++ b/src/main/resources/shaders/uber/G_BUFFER_UTIL.glsl @@ -0,0 +1,167 @@ +#define ALBEDO 0 +#define NORMAL 1 +#define DEPTH 3 +#define AO 4 +#define LIGHT_ONLY 6 +#define METALLIC 7 +#define ROUGHNESS 8 +#define POSITION 11 +#define RANDOM 13 +#define WIREFRAME 17 +#define UV_FLAG 18 +#define INDIRECT 19 +#define TRIANGLE_ID 20 +#define HEIGHT 21 +#define MATERIAL_MASK 22 +#define LIT -1 + + +layout (location = 0) out vec4 gBufferAlbedoSampler; +layout (location = 1) out vec4 gBufferNormalSampler; +layout (location = 2) out vec4 gBufferRMAOSampler; + +// X channel: 16 bits for anisotropicRotation + 16 bits for anisotropy +// Y channel: 16 bits for clearCoat + 16 bits for sheen +// Z channel: 16 bits for sheenTint + 15 bits for renderingMode + 1 bit for ssrEnabled +// W channel: 32 bit render index +layout (location = 3) out vec4 gBufferMaterialSampler; +layout (location = 4) out vec4 gBufferDepthSampler; +layout (location = 5) out vec4 gBufferIndirect; + +uniform float probeFilteringLevels; +uniform int debugShadingMode; +layout (binding = 0) uniform samplerCube specularProbe; +layout (binding = 1) uniform samplerCube irradianceProbe; +layout (binding = 2) uniform samplerCube irradianceProbe1; + +#define PARALLAX_THRESHOLD 200. + +void sampleIndirectIllumination(inout vec3 V, inout vec3 N){ + vec3 R = reflect(-V, N); + float specularFactor = 1.0 - gBufferRMAOSampler.r; + vec3 combinedReflection = mix( + texture(irradianceProbe, R).rgb, + textureLod(specularProbe, R, gBufferRMAOSampler.r * probeFilteringLevels).rgb, + specularFactor); + gBufferIndirect = vec4(combinedReflection, 1); +} + +vec3 randomColor(int seed) { + float hash = fract(sin(float(seed)) * 43758.5453); + + float r = fract(hash * 13.756); + float g = fract(hash * 15.734); + float b = fract(hash * 17.652); + + return vec3(r, g, b); +} + +void processDebugFlags(inout vec2 UV, inout vec3 W, int renderingIndex, float distanceFromCamera, vec4 materialMask){ + if (debugShadingMode != LIT){ + switch (debugShadingMode) { + case RANDOM: + gBufferAlbedoSampler.rgb = randomColor(renderingIndex + 1); + break; + case WIREFRAME: + gBufferAlbedoSampler.rgb = vec3(1., 0., 1.); + break; + case LIGHT_ONLY: + gBufferAlbedoSampler.rgb = vec3(.5); + break; + case NORMAL: + gBufferAlbedoSampler = gBufferNormalSampler; + break; + case DEPTH: + gBufferAlbedoSampler.rgb = vec3(distanceFromCamera) / 10; + break; + case AO: + gBufferAlbedoSampler.rgb = vec3(gBufferRMAOSampler.b); + break; + case METALLIC: + gBufferAlbedoSampler.rgb = vec3(gBufferRMAOSampler.g); + break; + case ROUGHNESS: + gBufferAlbedoSampler.rgb = vec3(gBufferRMAOSampler.r); + break; + case POSITION: + gBufferAlbedoSampler.rgb = vec3(W); + break; + case UV_FLAG: + gBufferAlbedoSampler.rgb = vec3(UV, 0); + break; + case INDIRECT: + gBufferAlbedoSampler.rgb = gBufferIndirect.rgb; + break; + case TRIANGLE_ID: + gBufferAlbedoSampler.rgb = randomColor(gl_PrimitiveID); + break; + case HEIGHT: + gBufferAlbedoSampler.rgb = vec3(W.y/10); + break; + case MATERIAL_MASK: + gBufferAlbedoSampler.rgb = materialMask.rgb; + break; + } + + gBufferAlbedoSampler.a = debugShadingMode != LIGHT_ONLY ? 1 : 0; + } +} + +float encode(float depthFunc, float val) { + float half_co = depthFunc * 0.5; + float clamp_z = max(0.000001, val); + return log2(clamp_z) * half_co; +} + +mat3 computeTBN(vec3 worldPosition, vec2 initialUV, vec3 normalVec, int isDecalPass) { + if (isDecalPass == 1) { + vec3 N = abs(normalVec); + vec3 T = vec3(0., 0., 1.); + if (N.z > N.x && N.z > N.y){ + T = vec3(1., 0., 0.); + } + + T = normalize(T - N * dot(T, N)); + vec3 B = cross(T, N); + return mat3(T, B, N); + } + vec3 dp1 = dFdx(worldPosition); + vec3 dp2 = dFdy(worldPosition); + vec2 duv1 = dFdx(initialUV); + vec2 duv2 = dFdy(initialUV); + + vec3 dp2perp = cross(dp2, normalVec); + vec3 dp1perp = cross(normalVec, dp1); + vec3 T = dp2perp * duv1.x + dp1perp * duv2.x; + vec3 B = dp2perp * duv1.y + dp1perp * duv2.y; + + float invmax = inversesqrt(max(dot(T, T), dot(B, B))); + return mat3(T * invmax, B * invmax, normalVec); +} + +vec2 parallaxOcclusionMapping(vec2 initialUV, vec3 worldSpacePosition, sampler2D heightMap, float heightScale, int layers, float distanceFromCamera, mat3 TBN) { + if (distanceFromCamera > PARALLAX_THRESHOLD) return initialUV; + mat3 transposed = transpose(TBN); + vec3 viewDirection = normalize(transposed * (cameraWorldPosition.xyz - worldSpacePosition.xyz)); + float fLayers = float(max(layers, 1)); + float layerDepth = 1.0 / fLayers; + float currentLayerDepth = 0.0; + vec2 P = viewDirection.xy / viewDirection.z * max(heightScale, .00000001); + vec2 deltaTexCoords = P / fLayers; + + vec2 currentUVs = initialUV; + float currentDepthMapValue = texture(heightMap, currentUVs).r; + while (currentLayerDepth < currentDepthMapValue) { + currentUVs -= deltaTexCoords; + currentDepthMapValue = texture(heightMap, currentUVs).r; + currentLayerDepth += layerDepth; + } + + vec2 prevTexCoords = currentUVs + deltaTexCoords; + float afterDepth = currentDepthMapValue - currentLayerDepth; + float beforeDepth = texture(heightMap, prevTexCoords).r - currentLayerDepth + layerDepth; + + + float weight = afterDepth / (afterDepth - beforeDepth); + return prevTexCoords * weight + currentUVs * (1.0 - weight); +} \ No newline at end of file diff --git a/engine/src/main/resources/shaders/uber/LIGHTS.glsl b/src/main/resources/shaders/uber/LIGHTS.glsl similarity index 100% rename from engine/src/main/resources/shaders/uber/LIGHTS.glsl rename to src/main/resources/shaders/uber/LIGHTS.glsl diff --git a/engine/src/main/resources/shaders/uber/MATERIAL_INFO.GLSL b/src/main/resources/shaders/uber/MATERIAL_INFO.GLSL similarity index 100% rename from engine/src/main/resources/shaders/uber/MATERIAL_INFO.GLSL rename to src/main/resources/shaders/uber/MATERIAL_INFO.GLSL diff --git a/engine/src/main/resources/shaders/uber/SHADOWS.glsl b/src/main/resources/shaders/uber/SHADOWS.glsl similarity index 100% rename from engine/src/main/resources/shaders/uber/SHADOWS.glsl rename to src/main/resources/shaders/uber/SHADOWS.glsl diff --git a/engine/src/main/resources/shaders/uber/SUN_CONTRIBUTION.glsl b/src/main/resources/shaders/uber/SUN_CONTRIBUTION.glsl similarity index 70% rename from engine/src/main/resources/shaders/uber/SUN_CONTRIBUTION.glsl rename to src/main/resources/shaders/uber/SUN_CONTRIBUTION.glsl index b175eec0..5274dfeb 100644 --- a/engine/src/main/resources/shaders/uber/SUN_CONTRIBUTION.glsl +++ b/src/main/resources/shaders/uber/SUN_CONTRIBUTION.glsl @@ -36,10 +36,7 @@ float sampleSoftShadows(vec2 coord, float compare, sampler2D shadowMapTexture, f return response/SAMPLES_SQUARED; } -float directionalLightShadows(float distanceFromCamera, float shadowFalloffDistance, float bias, vec4 lightSpacePosition, vec2 faceOffset, sampler2D shadowMapTexture, float shadowMapsQuantity, float shadowMapResolution, float pcfSamples){ - float attenuation = clamp(mix(1., 0., shadowFalloffDistance - distanceFromCamera), 0., 1.); - if (attenuation == 1.) return 1.; - +float directionalLightShadows(float bias, vec4 lightSpacePosition, sampler2D shadowMapTexture, float shadowMapResolution, float pcfSamples){ float response = 1.0; vec3 pos = (lightSpacePosition.xyz / lightSpacePosition.w)* 0.5 + 0.5; @@ -47,10 +44,10 @@ float directionalLightShadows(float distanceFromCamera, float shadowFalloffDista pos.z = 1.0; float compare = pos.z - bias; - - response = sampleSoftShadows(vec2(pos.x/shadowMapsQuantity + faceOffset.x/shadowMapsQuantity, pos.y/shadowMapsQuantity + faceOffset.y/shadowMapsQuantity), compare, shadowMapTexture, shadowMapResolution, pcfSamples); - if (response < 1.) - return min(1., response + attenuation); + response = sampleSoftShadows(pos.xy, compare, shadowMapTexture, shadowMapResolution, pcfSamples); + if (response < 1.){ + return min(1., response); + } return response; } @@ -58,9 +55,8 @@ vec3 computeDirectionalLight(bool useScreenSpaceShadows){ vec4 baseContribution = precomputeContribution(sunLightDirection.xyz); if (baseContribution.a == 0.) return vec3(0.); - float shadows = 1.; -// vec4 lightSpacePosition = info.viewProjection * vec4(worldSpacePosition, 1.0); -// shadows = directionalLightShadows(distanceFromCamera, info.shadowAttenuationMinDistance, info.shadowBias, lightSpacePosition, info.atlasFace, shadowAtlas, shadowMapsQuantity, shadowMapResolution, pcfSamples); + vec4 lightSpacePosition = lightSpaceMatrix * vec4(sunLightDirection.xyz, 1.0); + float shadows = directionalLightShadows(.01, lightSpacePosition, sunShadows, sunShadowsResolution, 2); if (shadows == 0.) { return vec3(0.); } @@ -69,5 +65,5 @@ vec3 computeDirectionalLight(bool useScreenSpaceShadows){ if (occlusion == 0.){ return vec3(0.); } - return computeBRDF(baseContribution.rgb, baseContribution.a, sunLightColor); + return computeBRDF(baseContribution.rgb, baseContribution.a, sunLightColor.rgb * sunLightIntensity); } \ No newline at end of file diff --git a/engine/src/main/resources/shaders/util/BRDF_FUNCTIONS.glsl b/src/main/resources/shaders/util/BRDF_FUNCTIONS.glsl similarity index 100% rename from engine/src/main/resources/shaders/util/BRDF_FUNCTIONS.glsl rename to src/main/resources/shaders/util/BRDF_FUNCTIONS.glsl diff --git a/engine/src/main/resources/shaders/util/MATH.glsl b/src/main/resources/shaders/util/MATH.glsl similarity index 100% rename from engine/src/main/resources/shaders/util/MATH.glsl rename to src/main/resources/shaders/util/MATH.glsl diff --git a/engine/src/main/resources/shaders/util/NOISE.glsl b/src/main/resources/shaders/util/NOISE.glsl similarity index 99% rename from engine/src/main/resources/shaders/util/NOISE.glsl rename to src/main/resources/shaders/util/NOISE.glsl index a6c4cb15..1dba420f 100644 --- a/engine/src/main/resources/shaders/util/NOISE.glsl +++ b/src/main/resources/shaders/util/NOISE.glsl @@ -20,7 +20,7 @@ float remap(float x, float a, float b, float c, float d) // Gradient noise by iq (modified to be tileable) float gradient_noise(vec3 x, float freq) { - // grid + // world vec3 p = floor(x); vec3 w = fract(x); diff --git a/engine/src/main/resources/shaders/util/PERLIN_NOISE.glsl b/src/main/resources/shaders/util/PERLIN_NOISE.glsl similarity index 100% rename from engine/src/main/resources/shaders/util/PERLIN_NOISE.glsl rename to src/main/resources/shaders/util/PERLIN_NOISE.glsl diff --git a/engine/src/main/resources/shaders/util/RAY_MARCHER.glsl b/src/main/resources/shaders/util/RAY_MARCHER.glsl similarity index 100% rename from engine/src/main/resources/shaders/util/RAY_MARCHER.glsl rename to src/main/resources/shaders/util/RAY_MARCHER.glsl diff --git a/engine/src/main/resources/shaders/util/SATURATE.glsl b/src/main/resources/shaders/util/SATURATE.glsl similarity index 100% rename from engine/src/main/resources/shaders/util/SATURATE.glsl rename to src/main/resources/shaders/util/SATURATE.glsl diff --git a/engine/src/main/resources/shaders/util/SCENE_DEPTH_UTILS.glsl b/src/main/resources/shaders/util/SCENE_DEPTH_UTILS.glsl similarity index 100% rename from engine/src/main/resources/shaders/util/SCENE_DEPTH_UTILS.glsl rename to src/main/resources/shaders/util/SCENE_DEPTH_UTILS.glsl diff --git a/engine/src/main/resources/shaders/util/SSS.glsl b/src/main/resources/shaders/util/SSS.glsl similarity index 100% rename from engine/src/main/resources/shaders/util/SSS.glsl rename to src/main/resources/shaders/util/SSS.glsl diff --git a/engine/src/main/resources/shaders/util/STRONG_BLUR.glsl b/src/main/resources/shaders/util/STRONG_BLUR.glsl similarity index 100% rename from engine/src/main/resources/shaders/util/STRONG_BLUR.glsl rename to src/main/resources/shaders/util/STRONG_BLUR.glsl diff --git a/engine/src/main/resources/shaders/util/TERRAIN.glsl b/src/main/resources/shaders/util/TERRAIN.glsl similarity index 100% rename from engine/src/main/resources/shaders/util/TERRAIN.glsl rename to src/main/resources/shaders/util/TERRAIN.glsl diff --git a/engine/src/main/resources/shaders/util/UTIL.glsl b/src/main/resources/shaders/util/UTIL.glsl similarity index 100% rename from engine/src/main/resources/shaders/util/UTIL.glsl rename to src/main/resources/shaders/util/UTIL.glsl diff --git a/engine/src/main/resources/textures/icons.png b/src/main/resources/textures/icons.png similarity index 100% rename from engine/src/main/resources/textures/icons.png rename to src/main/resources/textures/icons.png