Jump to content

Adding Toggle 3D button to actor viewer.


Recommended Posts

I am attempting to add a button to the Actor Viewer that will toggle between 2d and 3d projection:

camera.SetPerspectiveProjection(2.f, 512.f, DEGTORAD(20.f));

found in source/tools/atlas/GameInterface/View.cpp

sets the Field Of View, IE how strongly things are effected by perspective.

 

float m_Distance;

found on line 38 of source/tools/atlas/AtlasUI/ScenarioEditor/Tools/ActorViewerTool.cpp

sets the distance from the object being viewed to the camera, IE how large the object appears on screen.

 

I want to modify both of these at the same time, but I can't for the life of me find a way to send data from source/tools/atlas/GameInterface/View.cpp to source/tools/atlas/AtlasUI/ScenarioEditor/Tools/ActorViewerTool.cpp

 

Any advice would be appreciated.

Boston.

 

  • Like 3
Link to comment
Share on other sites

m_ScenarioEditor.GetToolManager().GetCurrentToolName();

(added to Object.cpp)

returns "ActorViewerTool", but

m_ScenarioEditor.GetToolManager().GetCurrentTool();

returns type ObservablePtr<ITool>&

and I cant get it to cast as ActorViewerTool& to modify it's variables.

I tried passing data via a global variable, but the program wouldn't link.

Boston.

 

 

Link to comment
Share on other sites

The correct syntax is

            ObservablePtr<ITool>& Tool = p->m_ScenarioEditor.GetToolManager().GetCurrentTool();
            ActorViewerTool *Tool1 = static_cast<ActorViewerTool*>(*Tool);
            Tool1->Toggle_3d(m_ViewerToggle3d);

I get the same problem with the linker as I did trying to share a global variable.

 

 

Link to comment
Share on other sites

I cant get the orthographic camera to work.

Does anyone have code that works with the orthographic camera?

Delenda Est, the mod for 0 A.D, uses a perspective camera with a narrow field of view.

With a narrow field of view you have to place the camera further away to achieve the same level of "zoom"

If the distance from the camera is too far, details like shadows are no longer drawn.

Will look into fixing this, tomorrow.

Boston

  • Like 1
Link to comment
Share on other sites

8 hours ago, Boston said:

If the distance from the camera is too far, details like shadows are no longer drawn.

 

You just have to enable the whole map option for the shadows.

The main problem with the narrow FOV/far zoom approach is that sound effects are now no longer the correct volume. The emitters are "far away", so that there needs to be a custom sound schema for such an approach. 

  • Like 1
Link to comment
Share on other sites

I changed line 511 of source/graphics/CameraController.cpp

 

from: m_Camera.SetPerspectiveProjection(m_ViewNear, m_ViewFar, m_ViewFOV);

to: m_Camera.SetOrthoProjection(-m_ViewNear, -m_ViewFar, 256.f);

this is the result:

Sound works perfectly but I couldn't capture it with the screen capture software.

Edited by Boston
Typo
  • Like 1
Link to comment
Share on other sites

4 hours ago, Boston said:

m_Camera.SetOrthoProjection(-m_ViewNear, -m_ViewFar, 256.f);

m_Camera.SetOrthoProjection(m_ViewFar, m_ViewNear, 256.f); might also work.

3 hours ago, wowgetoffyourcellphone said:

@vladislavbelov You think this is the direction to go to add an orthographic option? 

Yes, it's a start. Then we need:

  • Add a separate camera controller to be able to configure the orthogonal mode properly
  • Add an option in GUI
  • Adjust zooming code with visible bounds to fit/to be similar to the perspective mode
  • Choose camera position to have proper sounds on all zooms
  • Check reflections and refractions
  • Check shadows (w/ and w/o cover the whole map mode)
  • Test regular and big screenshots and adjust their code if it doesn't work
  • Think what do we need to do in Atlas (autoswitch to the perspective mode or something else)
  • Test for z-fighting for all backends (OpenGL, OpenGL ARB, Vulcan)
  • Like 2
Link to comment
Share on other sites

I can share data between:

source/tools/atlas/AtlasUI/ScenarioEditor/Tools/ActorViewerTool.cpp

and:

source/tools/atlas/GameInterface/View.cpp

fairly easily by declaring global variables in ActorViewerTool.cpp (and I know this is an ugly hack)

But

  1. I cannot figure out how to trigger a call to ActorViewerTool::PostLookAt() from View.cpp, to update the display after modifying parameters.
  2. I cannot figure out how to trigger a call to camera.SetOrthoProjection(-2.f, -512.f, XXX); from ActorViewerTool.cpp (in order to change the scale of the image by clicking and dragging on it)

 

 

  • Like 2
Link to comment
Share on other sites

Posted (edited)

2: is solved by making a call such as:

POST_MESSAGE(SetViewParamI, (AtlasMessage::eRenderView::ACTOR, L"Set 2d scale", 512));

from within ActorViewerTool.cpp

P.S.

1: might have to create the file ActorViewerTool.h

Edited by Boston
P.S.
  • Like 1
Link to comment
Share on other sites

I tried to declare a C like function in  ActorViewerTool.cpp and call it from within View.cpp

unfortunately, build/workspaces/gcc/atlas.make "includes" View.cpp and not ActorViewerTool.cpp

I guess this is why I can't try to run code in ActorViewerTool.cpp from View.cpp without getting a linking error

  • Like 1
Link to comment
Share on other sites

I was able to implement

POST_MESSAGE(SetViewParamF, (AtlasMessage::eRenderView::ACTOR, L"Set 2d scale", obj->m_Distance / 5));

instead of

POST_MESSAGE(SetViewParamI, (AtlasMessage::eRenderView::ACTOR, L"Set 2d scale", obj->m_Distance / 5));

for smoother scrolling.

I need to implement

POST_MESSAGE(SetViewParamB, (ActorViewerTool, L"Set Toggle 3d", m_Toggle3d));

Then everything else should fall into place

Boston

  • Like 2
Link to comment
Share on other sites

I was able to implement a C like function in

source/tools/atlas/AtlasUI/ScenarioEditor/Tools/ActorViewerTool.cpp

and call it from

source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Object/Object.cpp

I'm pretty happy with the functionality but not so sure about coding this up "correctly"

  • Like 2
Link to comment
Share on other sites

I'd like to split ActorViewerTool.cpp into header and source and include ActorViewerTool.h in Object.cpp

That would create a new dependency, so would I have to much around with Premake?

I'm not sure what to do with lines 94 to 169 of ActorViewerTool.cpp, any advice?

I'll soon be ready to submit a patch to Phabricator. What is the best place to download the current source for modifying and creating a patch?

Boston.

Link to comment
Share on other sites

33 minutes ago, Boston said:

That would create a new dependency, so would I have to much around with Premake?

Globbing is used for almost all of 0ad, so rerunning premake or update-workspace.sh should be all you need to do.

  • Thanks 1
Link to comment
Share on other sites

I implemented this code in Object.cpp:

            if (m_ViewerToggle3d == true) {
                p->m_ScenarioEditor.GetToolManager().GetCurrentTool()->OnCommand(_T("Set 3d"), NULL);
            } else {
                p->m_ScenarioEditor.GetToolManager().GetCurrentTool()->OnCommand(_T("Set 2d"), NULL);
            }

I believe this is the "correct" solution.

I've read that the best place to download the latest source is on SVN but I've also read that you have transitioned to hosting the latest source on GitHub, so which is it?

Boston

Link to comment
Share on other sites

3 hours ago, Boston said:

I've read that the best place to download the latest source is on SVN

You can get the latest SVN here: https://svn.wildfiregames.com/public/ps/trunk/

3 hours ago, Boston said:

I've also read that you have transitioned to hosting the latest source on GitHub, so which is it?

We haven't done transitioning yet, only mirror and test repositories. GitHub mirror is https://github.com/0ad/0ad.

2 hours ago, wowgetoffyourcellphone said:

Each is a mirror of the other as far as I know. @Stan`?

Yeah, currently all repositories except the SVN one are mirrors (or test mirrors).

  • Thanks 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...