Skip to content

Commit

Permalink
Merged in feature/three-rendering-types (pull request #18)
Browse files Browse the repository at this point in the history
Use same context, render texture and rendering types to optimise 2D/3D rendering of many layers
  • Loading branch information
4ian committed May 2, 2023
2 parents d296dab + 6e6ae3b commit 69cdd4a
Show file tree
Hide file tree
Showing 15 changed files with 489 additions and 231 deletions.
5 changes: 4 additions & 1 deletion Core/GDCore/Project/Layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ namespace gd {
Camera Layer::badCamera;

Layer::Layer()
: isVisible(true),
: renderingType("2d"),
isVisible(true),
isLightingLayer(false),
followBaseLayerCamera(false),
threeDNearPlaneDistance(0.1),
Expand All @@ -33,6 +34,7 @@ void Layer::SetCameraCount(std::size_t n) {

void Layer::SerializeTo(SerializerElement& element) const {
element.SetAttribute("name", GetName());
element.SetAttribute("renderingType", GetRenderingType());
element.SetAttribute("visibility", GetVisibility());
element.SetAttribute("isLightingLayer", IsLightingLayer());
element.SetAttribute("followBaseLayerCamera", IsFollowingBaseLayerCamera());
Expand Down Expand Up @@ -68,6 +70,7 @@ void Layer::SerializeTo(SerializerElement& element) const {
*/
void Layer::UnserializeFrom(const SerializerElement& element) {
SetName(element.GetStringAttribute("name", "", "Name"));
SetRenderingType(element.GetStringAttribute("renderingType", "2d"));
SetVisibility(element.GetBoolAttribute("visibility", true, "Visibility"));
SetLightingLayer(element.GetBoolAttribute("isLightingLayer", false));
SetFollowBaseLayerCamera(
Expand Down
4 changes: 4 additions & 0 deletions Core/GDCore/Project/Layer.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ class GD_CORE_API Layer {
*/
const gd::String& GetName() const { return name; }

const gd::String& GetRenderingType() const { return renderingType; }
void SetRenderingType(const gd::String& renderingType_) { renderingType = renderingType_; }

/**
* \brief Change if layer is displayed or not
*/
Expand Down Expand Up @@ -191,6 +194,7 @@ class GD_CORE_API Layer {

private:
gd::String name; ///< The name of the layer
gd::String renderingType; ///< The rendering type: "2d", "3d" or "2d+3d".
bool isVisible; ///< True if the layer is visible
bool isLightingLayer; ///< True if the layer is used to display lights and
///< renders an ambient light.
Expand Down
32 changes: 29 additions & 3 deletions GDJS/Runtime/RuntimeLayer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,36 @@
* This project is released under the MIT License.
*/
namespace gdjs {
export enum RuntimeLayerRenderingType {
TWO_D,
THREE_D,
TWO_D_PLUS_THREE_D,
}

const getRenderingTypeFromString = (
renderingTypeAsString: string | undefined
) =>
renderingTypeAsString === '3d'
? RuntimeLayerRenderingType.THREE_D
: renderingTypeAsString === '2d+3d'
? RuntimeLayerRenderingType.TWO_D_PLUS_THREE_D
: RuntimeLayerRenderingType.TWO_D;

/**
* Represents a layer of a "container", used to display objects.
* The container can be a scene (see gdjs.Layer)
* or a custom object (see gdjs.RuntimeCustomObjectLayer).
*/
export abstract class RuntimeLayer implements EffectsTarget {
_name: string;
_renderingType: RuntimeLayerRenderingType;
_timeScale: float = 1;
_defaultZOrder: integer = 0;
_hidden: boolean;
_initialEffectsData: Array<EffectData>;

// TODO EBO Don't store scene layer related data in layers used by custom objects.
// (both these 3D settings and the lighting layer properties below).
_initialThreeDFieldOfView: float;
_initialThreeDFarPlaneDistance: float;
_initialThreeDNearPlaneDistance: float;
Expand All @@ -39,10 +58,13 @@ namespace gdjs {
instanceContainer: gdjs.RuntimeInstanceContainer
) {
this._name = layerData.name;
this._renderingType = getRenderingTypeFromString(layerData.renderingType);
this._hidden = !layerData.visibility;
this._initialThreeDFieldOfView = layerData.threeDFieldOfView;
this._initialThreeDFarPlaneDistance = layerData.threeDFarPlaneDistance;
this._initialThreeDNearPlaneDistance = layerData.threeDNearPlaneDistance;
this._initialThreeDFieldOfView = layerData.threeDFieldOfView || 45;
this._initialThreeDFarPlaneDistance =
layerData.threeDFarPlaneDistance || 0.1;
this._initialThreeDNearPlaneDistance =
layerData.threeDNearPlaneDistance || 2000;
this._initialEffectsData = layerData.effects || [];
this._runtimeScene = instanceContainer;
this._effectsManager = instanceContainer.getGame().getEffectsManager();
Expand All @@ -69,6 +91,10 @@ namespace gdjs {
return this._renderer;
}

getRenderingType(): RuntimeLayerRenderingType {
return this._renderingType;
}

/**
* Get the default Z order to be attributed to objects created on this layer
* (usually from events generated code).
Expand Down
14 changes: 13 additions & 1 deletion GDJS/Runtime/debugger-client/hot-reloader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1060,7 +1060,19 @@ namespace gdjs {
}
}

// TODO: cameras
// Rendering type can't be easily changed at runtime.
if (oldLayer.renderingType !== newLayer.renderingType) {
this._logs.push({
kind: 'error',
message: `Could not change the rendering type (2D, 3D...) layer at runtime (for layer "${newLayer.name}").`,
});
}
if (newLayer.isLightingLayer !== oldLayer.isLightingLayer) {
this._logs.push({
kind: 'error',
message: `Could not add/remove a lighting layer at runtime (for layer "${newLayer.name}").`,
});
}

// Effects
this._hotReloadRuntimeLayerEffects(
Expand Down

0 comments on commit 69cdd4a

Please sign in to comment.