What 3D Engine are people using now?

Started by Amon, November 10, 2018, 07:19:25

Previous topic - Next topic

Steve Elliott

#60
Yep, so many options out there...But I just get the feeling people aren't truely connecting with a particular product...I like this about it - but not this...I'll wait for something better.  That's not a great situation to be in.
Win11 64Gb 12th Gen Intel i9 12900K 3.2Ghz Nvidia RTX 3070Ti 8Gb
Win11 16Gb 12th Gen Intel i5 12450H 2Ghz Nvidia RTX 2050 8Gb
Win11  Pro 8Gb Celeron Intel UHD Graphics 600
Win10/Linux Mint 16Gb 4th Gen Intel i5 4570 3.2GHz, Nvidia GeForce GTX 1050 2Gb
macOS 32Gb Apple M2Max
pi5 8Gb
Spectrum Next 2Mb

Madjack

So what is the best Blitz3d like option at the moment?
And by best, I mean something that is DX9 or higher, at least as fast as B3d (but pref as fast as BMax), has the full range of commands including raycasting+collision and has very few bugs?

3DzForMe

I've tried AGK briefly, to be fair, my age might not have given it a fair crack of the whip, and just possibly my resolve at overcoming coding nuances that I didn't find a problem a decade ago when having fun with Blitz3D and JV ODE may be down to coding mojo fade.

Blitz3D still works for me, made a new video tonight on my W7 box, I should really do it on my son's W10 box. Sure, it's not polygon tastic, but it's an example of what is achievable as an analysis tool of real world 3d data.

Would love to hear of any responses to MJ's question, otherwise/nevertheless, B3D still rocks
BLitz3D, IDEal, AGK Studio, BMax, Java Code, Cerberus
Recent Hardware: Dell Laptop
Oldest Hardware: Commodore Amiga 1200 with 1084S Monitor & Blitz Basic 2.1

Naughty Alien

#63
Quote from: Madjack on November 13, 2018, 22:34:38
So what is the best Blitz3d like option at the moment?
And by best, I mean something that is DX9 or higher, at least as fast as B3d (but pref as fast as BMax), has the full range of commands including raycasting+collision and has very few bugs?

..thats exactly what im trying to look for..there are tons of options which are Unity like, but thats not something im feeling comfortable with..currently, im messing with Lumberyard engine, and it is nice..just like Unity and all, you sort out your level visually quickly, and then you go to coding..and when you do that, this is what you code just to have entity spinning around Z axis...


local RotateEntity =
{
Properties =
{
IncomingGameplayEventName = "",
AxisOfRotation = {default=Vector3(0,0,1), description="The axis to rotate around"},
IsRelative = {default=true, description="When true, the entity's transform will transform the AxisOfRotation"},
RotationSpeed = {default=60, description="Degrees per second."},
},

}


function RotateEntity:OnActivate()
local gameplayBusId = GameplayNotificationId(self.entityId, self.Properties.IncomingGameplayEventName, "float")
self.gameplayBus = GameplayNotificationBus.Connect(self, gameplayBusId)
end

function RotateEntity:ApplyRotation(floatValue)
local axisOfRotation = self.Properties.AxisOfRotation:GetNormalized()
local localTM = TransformBus.Event.GetWorldTM(self.entityId)
local translation = localTM:GetTranslation()
localTM:SetTranslation(Vector3(0,0,0))
local scale = localTM:ExtractScale()

if not self.Properties.IsRelative then
axisOfRotation = axisOfRotation * localTM
end

local dt = TickRequestBus.Broadcast.GetTickDeltaTime()
local rotationAmount = floatValue * dt * Math.DegToRad(self.Properties.RotationSpeed)

local finalTM = localTM * Transform.CreateFromQuaternion(Quaternion.CreateFromAxisAngle(axisOfRotation, rotationAmount):GetNormalized())
finalTM:SetPosition(translation)
finalTM:MultiplyByScale(scale)
TransformBus.Event.SetWorldTM(self.entityId, finalTM)
end

function RotateEntity:OnEventBegin(floatValue)
self:ApplyRotation(floatValue)
end

function RotateEntity:OnEventUpdating(floatValue)
self:ApplyRotation(floatValue)
end

function RotateEntity:OnEventEnd(floatValue)
self:ApplyRotation(floatValue)
end

function RotateEntity:OnDeactivate()
self.gameplayBus:Disconnect()
end

return RotateEntity


..and this is exactly where this tools start losing me..yes, you do compose your level quickly in editor( i do same in 3dsmax by the way,end export directly for engine use), and then you 'code' stuff...i mean..if you see trigger code(to open door for example), its a spaghetti of various things..i guess its just me as so many people like this sort of tools..ill keep digging..

plenatus

and thats where i totally agree.
I tested unity some years ago.But at the end its most only behavior scripting.
Its good for game designer and i know we can code detailed in unity.
And the games made with unity, godot and similar looks good but maybe i´m to oldschool.
Atm i´m learning c++ deeper and maybe i can code a little 2d framework/engine anytime...

But the bigges wish is a Blitz3D like thing with dx11/12 support and an active community.
I´m sure such thing is possible with bm-ng too but i never used it.
On the other side there are then modules and modules and always modules....thats not bad but the most would use an out-of-the-box system.

Its the same reason why i don´t use linux(this time its better...but years ago...).
I would work with an OS not for an OS. ;)
And mainly i would code game code and not an (parts of) engine.

And so i should write a wishlist to santa....for now...good night ;)

Madjack

The example code NA posted below is why sometimes I feel that programmers make things overly complex because it's self-reinforcing and a form of gate-keeping.

Quote from: Naughty Alien on November 14, 2018, 00:34:01

local RotateEntity =
{
Properties =
{
IncomingGameplayEventName = "",
AxisOfRotation = {default=Vector3(0,0,1), description="The axis to rotate around"},
IsRelative = {default=true, description="When true, the entity's transform will transform the AxisOfRotation"},
RotationSpeed = {default=60, description="Degrees per second."},
},

}


function RotateEntity:OnActivate()
local gameplayBusId = GameplayNotificationId(self.entityId, self.Properties.IncomingGameplayEventName, "float")
self.gameplayBus = GameplayNotificationBus.Connect(self, gameplayBusId)
end

function RotateEntity:ApplyRotation(floatValue)
local axisOfRotation = self.Properties.AxisOfRotation:GetNormalized()
local localTM = TransformBus.Event.GetWorldTM(self.entityId)
local translation = localTM:GetTranslation()
localTM:SetTranslation(Vector3(0,0,0))
local scale = localTM:ExtractScale()

if not self.Properties.IsRelative then
axisOfRotation = axisOfRotation * localTM
end

local dt = TickRequestBus.Broadcast.GetTickDeltaTime()
local rotationAmount = floatValue * dt * Math.DegToRad(self.Properties.RotationSpeed)

local finalTM = localTM * Transform.CreateFromQuaternion(Quaternion.CreateFromAxisAngle(axisOfRotation, rotationAmount):GetNormalized())
finalTM:SetPosition(translation)
finalTM:MultiplyByScale(scale)
TransformBus.Event.SetWorldTM(self.entityId, finalTM)
end

function RotateEntity:OnEventBegin(floatValue)
self:ApplyRotation(floatValue)
end

function RotateEntity:OnEventUpdating(floatValue)
self:ApplyRotation(floatValue)
end

function RotateEntity:OnEventEnd(floatValue)
self:ApplyRotation(floatValue)
end

function RotateEntity:OnDeactivate()
self.gameplayBus:Disconnect()
end

return RotateEntity



Naughty Alien

...i mean..i just dont get this hype over this visual tools...it does allow you to create scene rather fast and visually very pleasing, no doubt about that, but soon as you start doing some coding work, things are a bit different..i mean..look at this AiSpawn trigger code, which really could be scaled down to not more than 5 lines of code, if coded directly..


local utilities = require "scripts/common/utilities"

local aispawntrigger = {
Properties = {
AISpawnGroup = { default = "", description = "The spawn group to be triggered when the player enters the trigger." },
Switch =
{
On = { default = "", description = "The event name when switched on." },
Off = { default = "", description = "The event name when switched off." },
},
},
}

function aispawntrigger:OnActivate()
self.triggerHandler = TriggerAreaNotificationBus.Connect(self, self.entityId);
self.enteredAreaId = GameplayNotificationId(EntityId(), "EnteredAITrigger", "float");
self.exitedAreaId = GameplayNotificationId(EntityId(),"ExitedAITrigger", "float");
self.somethingDeepInside = false;

-- Initialise the values with defaults first and then set them up for listening, if necessary.
self.switchedOn = true;
self.switchedOnEventId = nil;
self.switchedOnHandler = nil;
self.switchedOffEventId = nil;
self.switchedOffHandler = nil;
local validOn = self:IsValidString(self.Properties.Switch.On);
local validOff = self:IsValidString(self.Properties.Switch.Off);
if (validOn and validOff) then
self.switchedOn = false;
self.switchedOnEventId = GameplayNotificationId(self.entityId, self.Properties.Switch.On, "float");
self.switchedOnHandler = GameplayNotificationBus.Connect(self, self.switchedOnEventId);
self.switchedOffEventId = GameplayNotificationId(self.entityId, self.Properties.Switch.Off, "float");
self.switchedOffHandler = GameplayNotificationBus.Connect(self, self.switchedOffEventId);
elseif (validOn or validOff) then
-- Output a warning that something was set but it'll be ignored.
Debug.Log("[LuaWarning] AISpawnTrigger '" .. tostring(StarterGameEntityUtility.GetEntityName(self.entityId)) .. "': one of the switches has an event name but the other doesn't. The switch will not be active.");
end
end

function aispawntrigger:OnDeactivate()
if (self.switchedOffHandler ~= nil) then
self.switchedOffHandler:Disconnect();
self.switchedOffHandler = nil;
end
if (self.switchedOnHandler ~= nil) then
self.switchedOnHandler:Disconnect();
self.switchedOnHandler = nil;
end
if (self.triggerHandler ~= nil) then
self.triggerHandler:Disconnect();
self.triggerHandler = nil;
end
end

function aispawntrigger:IsValidString(str)
return str ~= "" and str ~= nil;
end

function aispawntrigger:OnTriggerAreaEntered(entityId)
--Debug.Log("A.I. Trigger Volume entered");
if (entityId ~= nil) then
self.somethingDeepInside = true;
end
if (not utilities.GetDebugManagerBool("PreventAIDisabling", false) and self.switchedOn) then
GameplayNotificationBus.Event.OnEventBegin(self.enteredAreaId, self.Properties.AISpawnGroup);
end
end

function aispawntrigger:OnTriggerAreaExited(entityId)
--Debug.Log("A.I. Trigger Volume exited");
if (entityId ~= nil) then
self.somethingDeepInside = false;
end
if (not utilities.GetDebugManagerBool("PreventAIDisabling", false)) then
GameplayNotificationBus.Event.OnEventBegin(self.exitedAreaId, self.Properties.AISpawnGroup);
end
end

function aispawntrigger:OnEventBegin(value)
if (self.switchedOnEventId ~= nil and self.switchedOffEventId ~= nil) then
if (GameplayNotificationBus.GetCurrentBusId() == self.switchedOnEventId) then
if (not self.switchedOn) then
self.switchedOn = true;
if (self.somethingDeepInside) then
self:OnTriggerAreaEntered(nil);
end
end
elseif (GameplayNotificationBus.GetCurrentBusId() == self.switchedOffEventId) then
if (self.switchedOn) then
self.switchedOn = false;
if (self.somethingDeepInside) then
self:OnTriggerAreaExited(nil);
end
end
end
end
end

return aispawntrigger;


..it must be just me as many folks enjoying this sort of tools..

GaborD

#67
I am with you on that NA, I never liked these kinds of engines.
I did use Unity back in the day for work projects a lot. But I never enjoyed it and always used other engines for own fun stuff. It's just not my cup of tea.
You spend more time in Wikis trying to figure out how their devs think and work than actually making your own game. And then it runs slow as heck. (Which is not meant as attack, it just comes with the territory. They are bloated because they try to support everything and everyone. A streamlined own renderchain will always be much faster)
I do however see how these tools are great for new people or when you need to export to toasters. They have the edge in that area.

Naughty Alien

..exactly what i feel all the time..no doubt these visual tools are productive, but they rub me on wrong way for some reason..anyway, i think i have found what i was looking for, in form of Urho3D, as suggested before..it seems to be well documented and supported with modern features and quite friendly..and it does come with editor, where you put your scene in order and just load and access trough code to do whatever you want, directly..nice so far..

..simple scene with 2 dynamic lights set on scene..



..loaded scene and lights and all parts of scene/entity, easy to access and modify directly...yay..

Qube

Quote from: Naughty Alien on November 14, 2018, 01:32:39
...i mean..i just dont get this hype over this visual tools...it does allow you to create scene rather fast and visually very pleasing, no doubt about that, but soon as you start doing some coding work, things are a bit different..i mean..look at this AiSpawn trigger code, which really could be scaled down to not more than 5 lines of code, if coded directly..


local utilities = require "scripts/common/utilities"

local aispawntrigger = {
Properties = {
AISpawnGroup = { default = "", description = "The spawn group to be triggered when the player enters the trigger." },
Switch =
{
On = { default = "", description = "The event name when switched on." },
Off = { default = "", description = "The event name when switched off." },
},
},
}

function aispawntrigger:OnActivate()
self.triggerHandler = TriggerAreaNotificationBus.Connect(self, self.entityId);
self.enteredAreaId = GameplayNotificationId(EntityId(), "EnteredAITrigger", "float");
self.exitedAreaId = GameplayNotificationId(EntityId(),"ExitedAITrigger", "float");
self.somethingDeepInside = false;

-- Initialise the values with defaults first and then set them up for listening, if necessary.
self.switchedOn = true;
self.switchedOnEventId = nil;
self.switchedOnHandler = nil;
self.switchedOffEventId = nil;
self.switchedOffHandler = nil;
local validOn = self:IsValidString(self.Properties.Switch.On);
local validOff = self:IsValidString(self.Properties.Switch.Off);
if (validOn and validOff) then
self.switchedOn = false;
self.switchedOnEventId = GameplayNotificationId(self.entityId, self.Properties.Switch.On, "float");
self.switchedOnHandler = GameplayNotificationBus.Connect(self, self.switchedOnEventId);
self.switchedOffEventId = GameplayNotificationId(self.entityId, self.Properties.Switch.Off, "float");
self.switchedOffHandler = GameplayNotificationBus.Connect(self, self.switchedOffEventId);
elseif (validOn or validOff) then
-- Output a warning that something was set but it'll be ignored.
Debug.Log("[LuaWarning] AISpawnTrigger '" .. tostring(StarterGameEntityUtility.GetEntityName(self.entityId)) .. "': one of the switches has an event name but the other doesn't. The switch will not be active.");
end
end

function aispawntrigger:OnDeactivate()
if (self.switchedOffHandler ~= nil) then
self.switchedOffHandler:Disconnect();
self.switchedOffHandler = nil;
end
if (self.switchedOnHandler ~= nil) then
self.switchedOnHandler:Disconnect();
self.switchedOnHandler = nil;
end
if (self.triggerHandler ~= nil) then
self.triggerHandler:Disconnect();
self.triggerHandler = nil;
end
end

function aispawntrigger:IsValidString(str)
return str ~= "" and str ~= nil;
end

function aispawntrigger:OnTriggerAreaEntered(entityId)
--Debug.Log("A.I. Trigger Volume entered");
if (entityId ~= nil) then
self.somethingDeepInside = true;
end
if (not utilities.GetDebugManagerBool("PreventAIDisabling", false) and self.switchedOn) then
GameplayNotificationBus.Event.OnEventBegin(self.enteredAreaId, self.Properties.AISpawnGroup);
end
end

function aispawntrigger:OnTriggerAreaExited(entityId)
--Debug.Log("A.I. Trigger Volume exited");
if (entityId ~= nil) then
self.somethingDeepInside = false;
end
if (not utilities.GetDebugManagerBool("PreventAIDisabling", false)) then
GameplayNotificationBus.Event.OnEventBegin(self.exitedAreaId, self.Properties.AISpawnGroup);
end
end

function aispawntrigger:OnEventBegin(value)
if (self.switchedOnEventId ~= nil and self.switchedOffEventId ~= nil) then
if (GameplayNotificationBus.GetCurrentBusId() == self.switchedOnEventId) then
if (not self.switchedOn) then
self.switchedOn = true;
if (self.somethingDeepInside) then
self:OnTriggerAreaEntered(nil);
end
end
elseif (GameplayNotificationBus.GetCurrentBusId() == self.switchedOffEventId) then
if (self.switchedOn) then
self.switchedOn = false;
if (self.somethingDeepInside) then
self:OnTriggerAreaExited(nil);
end
end
end
end
end

return aispawntrigger;


..it must be just me as many folks enjoying this sort of tools..
What the frack is all that for?. It looks like a load of code to make up for something the engine should be handling by itself in the background. Remind me never to use LumberTurd ;D

Quote..exactly what i feel all the time..no doubt these visual tools are productive, but they rub me on wrong way for some reason
Me too, I've been coding since I was 10 years old and that's just how my brain works. Then I changed my approach to Unity. Rather than fight with it I thought hang on, I like things like VB.NET and Delphi and those have visual editors?!?!?, what's the difference?. So now I just treat Unity as a visual level designer and I'm happy that you have to code a lot more than some make out. Sure, it's a lot more than just that but that was the best starting point I was happy with.
Mac Studio M1 Max ( 10 core CPU - 24 core GPU ), 32GB LPDDR5, 512GB SSD,
Beelink SER7 Mini Gaming PC, Ryzen 7 7840HS 8-Core 16-Thread 5.1GHz Processor, 32G DDR5 RAM 1T PCIe 4.0 SSD
MSI MEG 342C 34" QD-OLED Monitor

Until the next time.

Naughty Alien

..ehhmm..soo..i have installed Unity and playing with it now...script seems to be very straightforward and it does feel 'natural' to given environment..lets see how it goes..

plenatus


Qube

Quote from: Naughty Alien on November 14, 2018, 10:40:32
..ehhmm..soo..i have installed Unity and playing with it now...script seems to be very straightforward and it does feel 'natural' to given environment..lets see how it goes..
Have fun ;D

Oh and that mountain of code you posted about rotating an object on the Z axis in Lumberyard.. Here's the full Unity version :P


using UnityEngine;

public class RotateAGoGo : MonoBehaviour {
void Update () {
        transform.Rotate( 0, 0, 10.0f * Time.deltaTime, Space.Self );
}
}
Mac Studio M1 Max ( 10 core CPU - 24 core GPU ), 32GB LPDDR5, 512GB SSD,
Beelink SER7 Mini Gaming PC, Ryzen 7 7840HS 8-Core 16-Thread 5.1GHz Processor, 32G DDR5 RAM 1T PCIe 4.0 SSD
MSI MEG 342C 34" QD-OLED Monitor

Until the next time.

Steve Elliott

#73
Quote
I have installed Unity

We are horrified.  :o   ;D

Yes we are  :P
Win11 64Gb 12th Gen Intel i9 12900K 3.2Ghz Nvidia RTX 3070Ti 8Gb
Win11 16Gb 12th Gen Intel i5 12450H 2Ghz Nvidia RTX 2050 8Gb
Win11  Pro 8Gb Celeron Intel UHD Graphics 600
Win10/Linux Mint 16Gb 4th Gen Intel i5 4570 3.2GHz, Nvidia GeForce GTX 1050 2Gb
macOS 32Gb Apple M2Max
pi5 8Gb
Spectrum Next 2Mb

Derron

gdscript (Godot):

extends Spatial

func _physics_process(delta):
self.rotation_degrees += Vector3(0, 10.0f*delta, 0)


I am pretty sure it can get cut down to a similar thing in Lumberyard too. The biggest problem is the "component/entity"-approach they use in all these tools. Separation of concerns as much as possible (A does not know B, B does not know A, it is C who connects events from B to A and vice versa). Especially if you are used to code in "single files" or often used "includes" rather "imports" (BMax) then you will need to think twice or end up with "might work if I do not change something" code.


bye
Ron