• Advertisement

• ### Popular Now

• 12
• 12
• 9
• 10
• 13
• Advertisement
• ### Similar Content

• By dgi
Hey all ,
For a few days I'm trying to solve some problems with my engine's memory management.Basically what is have is a custom heap with pre allocated memory.Every block has a header and so on.I decided to leave it like that(not cache friendly) because my model is that every block will be large and I will have a pool allocators and stack allocators dealing with those blocks internally. So far so good I figure out how to place my per scene resources . There is one thing that I really don't know how to do and thats dealing with containers.What kind of allocation strategy to use here.
If I use vector for my scene objects(entities , cameras , particle emitters .. ) I will fragment my custom heap if I do it in a standard way , adding and removing objects will cause a lot of reallocations . If I use a linked list this will not fragment the memory but it's not cache friendly.I guess if a reserve large amount of memory for those vectors it will work but then I will waste a lot memory.I was thinking for some sort of mix between a vector and a linked list , where you have block of memory that can contain lets say 40 items and if you go over that number a new one will be created and re location of the data would not be needed.There would be some cache misses but it will reduce the fragmentation.

How you guys deal with that ? Do you just reserve a lot data ?

dgi
• By Hermetix
I am trying to setup the custom wizard for making a 3ds MAX 2018 plug-in (to export a character animation data), but I can't locate the wizard file folder to put the .vsz file in. In the 3ds MAX 2018 docs, it only mentions where the folder is in VS 2015 (VC/vcprojects). It's a VC++ project, but I don't see any folder in VC for the wizard files. I'm using VS 2017 update 15.5.6 Enterprise, and the folders in VC are: Auxiliary, Redist and Tools.

Thanks.
• By KarimIO
Hey guys! Three questions about uniform buffers:
1) Is there a benefit to Vulkan and DirectX's Shader State for the Constant/Uniform Buffer? In these APIs, and NOT in OpenGL, you must set which shader is going to take each buffer. Why is this? For allowing more slots?
2) I'm building an wrapper over these graphics APIs, and was wondering how to handle passing parameters. In addition, I used my own json format to describe material formats and shader formats. In this, I can describe which shaders get what uniform buffers. I was thinking of moving to support ShaderLab (Unity's shader format) instead, as this would allow people to jump over easily enough and ease up the learning curve. But ShaderLab does not support multiple Uniform Buffers at all, as I can tell, let alone what parameters go where.
So to fix this, I was just going to send all Uniform Buffers to all shaders. Is this that big of a problem?
3) Do you have any references on how to organize material uniform buffers? I may be optimizing too early, but I've seen people say what a toll this can take.
• By abarnes
Hello All!
I am currently pursuing a degree in video game programming, so far I have completed an intro to programming course and object oriented programming course. Both were taught using C++ as the programming langauge which I know is very popular for game development, but in these classes we do not actually do any game development. I would like to start to build my skills with C++ for game development as that is a common required thing for a job and am looking for ways to do this. Any recommendations such as books to read or youtube videos to watch will be greatly appreciated!
• By Orella
I'm having problems rotating GameObjects in my engine. I'm trying to rotate in 2 ways.
I'm using MathGeoLib to calculate maths in the engine.
First way: Rotates correctly around axis but if I want to rotate back, if I don't do it following the inverse order then rotation doesn't work properly.
e.g:
Rotate X axis 50 degrees, Rotate Y axis 30 degrees -> Rotate Y axis -50 degrees, Rotate X axis -30 degrees. Works.
Rotate X axis 50 degrees, Rotate Y axis 30 degrees -> Rotate X axis -50 degrees, Rotate Y axis -30 degrees. Doesn't.

Code:
void ComponentTransform::SetRotation(float3 euler_rotation) { float3 diff = euler_rotation - editor_rotation; editor_rotation = euler_rotation; math::Quat mod = math::Quat::FromEulerXYZ(diff.x * DEGTORAD, diff.y * DEGTORAD, diff.z * DEGTORAD); quat_rotation = quat_rotation * mod; UpdateMatrix();  } Second way: Starts rotating good around axis but after rotating some times, then it stops to rotate correctly around axis, but if I rotate it back regardless of the rotation order it works, not like the first way.

Code:
void ComponentTransform::SetRotation(float3 euler_rotation) { editor_rotation = euler_rotation; quat_rotation = math::Quat::FromEulerXYZ(euler_rotation.x * DEGTORAD, euler_rotation.y * DEGTORAD, euler_rotation.z * DEGTORAD); UpdateMatrix();  }
Rest of code:
#define DEGTORAD 0.0174532925199432957f void ComponentTransform::UpdateMatrix() { if (!this->GetGameObject()->IsParent()) { //Get parent transform component ComponentTransform* parent_transform = (ComponentTransform*)this->GetGameObject()->GetParent()->GetComponent(Component::CompTransform); //Create matrix from position, rotation(quaternion) and scale transform_matrix = math::float4x4::FromTRS(position, quat_rotation, scale); //Multiply the object transform by parent transform transform_matrix = parent_transform->transform_matrix * transform_matrix; //If object have childs, call this function in childs objects for (std::list<GameObject*>::iterator it = this->GetGameObject()->childs.begin(); it != this->GetGameObject()->childs.end(); it++) { ComponentTransform* child_transform = (ComponentTransform*)(*it)->GetComponent(Component::CompTransform); child_transform->UpdateMatrix(); } } else { //Create matrix from position, rotation(quaternion) and scale transform_matrix = math::float4x4::FromTRS(position, quat_rotation, scale); //If object have childs, call this function in childs objects for (std::list<GameObject*>::iterator it = this->GetGameObject()->childs.begin(); it != this->GetGameObject()->childs.end(); it++) { ComponentTransform* child_transform = (ComponentTransform*)(*it)->GetComponent(Component::CompTransform); child_transform->UpdateMatrix(); } } } MathGeoLib: Quat MUST_USE_RESULT Quat::FromEulerXYZ(float x, float y, float z) { return (Quat::RotateX(x) * Quat::RotateY(y) * Quat::RotateZ(z)).Normalized(); } Quat MUST_USE_RESULT Quat::RotateX(float angle) { return Quat(float3(1,0,0), angle); } Quat MUST_USE_RESULT Quat::RotateY(float angle) { return Quat(float3(0,1,0), angle); } Quat MUST_USE_RESULT Quat::RotateZ(float angle) { return Quat(float3(0,0,1), angle); } Quat(const float3 &rotationAxis, float rotationAngleRadians) { SetFromAxisAngle(rotationAxis, rotationAngleRadians); } void Quat::SetFromAxisAngle(const float3 &axis, float angle) { assume1(axis.IsNormalized(), axis); assume1(MATH_NS::IsFinite(angle), angle); float sinz, cosz; SinCos(angle*0.5f, sinz, cosz); x = axis.x * sinz; y = axis.y * sinz; z = axis.z * sinz; w = cosz; } Any help?
Thanks.
• Advertisement
• Advertisement

# Error when returning a Pair<type,type> from a function

## Recommended Posts

Maybe today I'm confused and I'm missing the obvious...

I've made this simple struct inside my Utility.h

template<typename TFirst, typename TSecond>
struct Pair {
Pair(TFirst f, TSecond s):First{f},Second{s}{}
TFirst First;
TSecond Second;
};

And I'm using it from App.h (which #include "Utility.h") like so:

App.h

Pair<Uint32, Uint32> GetWindowSize();

App.cpp

Pair<Uint32, Uint32> App::GetWindowSize()
{
return Pair<Uint32, Uint32>(Width,Height);
}

And I'm getting a cascade of errors ALL on line 39 (image below).

Any idea what I am doing wrong this time? x_x

EDIT: please mod delete this topic, I just remembered Utility.h put everything inside namespace util, sorry x_x

Edited by MarcusAseth

#### Share this post

##### Share on other sites
Advertisement

Why not use std::pair, which is significantly more full-featured and optimal?

Why are you using a pair to return a window size? A size is a conceptually richer concept, which includes a different set of operations and relationships than the more-generic "pair" concept. This seems like a prematurely-pessimized API design.

#### Share this post

##### Share on other sites

I didn't wanted to have to add another include in all my files in order to use that, since I already had my Utility.h included I put my class inside of that. There is a way to add the std::pair to my Utility.h so that all files including it get to use std::pair without including anything else?

Quote

A size is a conceptually richer concept, which includes a different set of operations and relationships than the more-generic "pair" concept

I don't fully understand this, I basically just needed to pass around width and height so that I can spawn my Entities like so(code below:

EDIT: by the way, why the code below is being pasted in this crazy way?!  Maybe a problem in how the tab character is interpreted?

It should appear like this --> https://pastebin.com/iddWWWfH

GameMode::GameMode(SDL_Window* Window, SDL_Renderer* Renderer, App* App)
:Window{ Window }, Renderer{ Renderer }, AppRef{ App }, Running{ true }
{
float WindowWidth = static_cast<float>(AppRef->GetWindowSize().First);
float WindowHeight = static_cast<float>(AppRef->GetWindowSize().Second);

//PhysicsManager
PhysicsManager = std::make_unique<Physics>(this);

//Create Player
Entities.push_back(std::make_unique<Paddle>(this,
static_cast<int>(WindowWidth) / 2,
static_cast<int>(WindowHeight) - 40,
PivotMode::CENTER));

//Boundaries
//Right
Entities.push_back(std::make_unique<Boundary>(this,
Rect{ WindowWidth - 5.f, 0.f,
50.f, WindowHeight },
PivotMode::CENTER));
//Left
Entities.push_back(std::make_unique<Boundary>(this,
Rect{ -45.f, 0.f,
50.f, WindowHeight },
PivotMode::CENTER));
//Top
Entities.push_back(std::make_unique<Boundary>(this,
Rect{ 6.f, -45.f,
WindowWidth - 12.f, 50.f },
PivotMode::CENTER));

//Bottom
Entities.push_back(std::make_unique<Boundary>(this,
Rect{ 6.f, WindowHeight - 5.f,
WindowWidth - 12.f, 50.f },
PivotMode::CENTER));

//Create Ball
Entities.push_back(std::make_unique<Ball>(this,
static_cast<int>(WindowWidth) / 2,
200,
PivotMode::CENTER));
}

Edited by MarcusAseth

#### Share this post

##### Share on other sites
11 minutes ago, MarcusAseth said:

EDIT: by the way, why the code below is being pasted in this crazy way?!  Maybe a problem in how the tab character is interpreted?

It is, a TAB character is defined to aligned at multiples of 8 characters, in ASCII. Most editors ignore this definition, and allow you to change it, giving the illusion that a TAB is whatever you configured. That of course fails as soon as your file leaves your editor, since other programs or other people use different TAB settings, or use the official size.

#### Share this post

##### Share on other sites
2 minutes ago, Alberth said:

It is, a TAB character is defined to aligned at multiples of 8 characters, in ASCII. Most editors ignore this definition, and allow you to change it, giving the illusion that a TAB is whatever you configured. That of course fails as soon as your file leaves your editor, since other programs or other people use different TAB settings, or use the official size.

though this pastes correctly on codeshare.io and pastebin and Windows blocknote and pretty much everywhere else... wouldn't be better to have the site behaving the same way?

#### Share this post

##### Share on other sites
Just now, MarcusAseth said:

though this pastes correctly on codeshare.io and pastebin and Windows blocknote

It can't paste correctly in all cases. TAB length isn't copied with the text, so either it guestimates, or it just happens to use the same length as you have. In both cases, you can break the formatting with a clever enough example.

24 minutes ago, MarcusAseth said:
Quote

A size is a conceptually richer concept, which includes a different set of operations and relationships than the more-generic "pair" concept

I don't fully understand this, I basically just needed to pass around width and height so that I can spawn my Entities like so(code below:

This means that if two numbers have a width and height relation, you can discuss other properties, eg "area". You can multiply 2 unrelated numbers, with each other, but without a width/height relation between them it has no useful meaning.

#### Share this post

##### Share on other sites
58 minutes ago, MarcusAseth said:

I didn't wanted to have to add another include in all my files in order to use that, since I already had my Utility.h included I put my class inside of that. There is a way to add the std::pair to my Utility.h so that all files including it get to use std::pair without including anything else?

No, but including <utility> isn't going to be a huge deal, especially if you're just taking your Utility.h and turning into a convenience catch-all anyway. The net impact on compile time over the life of any nontrivial project will probably be smaller using <utility>, since it changes so infrequently, whereas your Utility.h will change quite often.

1 hour ago, MarcusAseth said:

I don't fully understand this, I basically just needed to pass around width and height so that I can spawn my Entities like so(code below:

Why do you have a Window class then? Why not Tuple<std::string, int, int, Pair<int, int>, bool, bool, ...>? It's the same thing, right?

Seeing "Size" in a function signature conveys useful meaning that seeing "Pair<foo, bar>" does not. It also lets you write interfaces that operate in the language appropriate for the semantics of the data you're sending around - as Alberth noted with his "area" example, but also even simpler than that: what is a size? It's a width and a height. Not a "first" and a "second." Seeing "thing.width" written in code is lot easier to comprehend than "thing.first," just as seeing "Size" in the parameter list is easier to comprehend than "Pair."

#### Share this post

##### Share on other sites

ok, so the bottom line is I should either return a Struct filled with info with inside appropriete variables names like WindowInfo.width and WindowInfo.height or split it into two methods Game->GetWindowWidth() , Game->GetWindowHeight()

Did I got this right?

By the way, I added this as well into Utility.h

	template <typename First, typename Second>
using Pair = std::pair<First, Second>;

and I'm glad to see it everything still compiles without any changes required

Edited by MarcusAseth

#### Share this post

##### Share on other sites
1 hour ago, MarcusAseth said:

Did I got this right?

Yes.

I'd vote for the first option, since about 80% of the time if you want the width you'll probably also want the height, and there really isn't much to worry about in terms of performance here.

Fixed, thanks

## Create an account or sign in to comment

You need to be a member in order to leave a comment

## Create an account

Sign up for a new account in our community. It's easy!

Register a new account

## Sign in

Already have an account? Sign in here.

Sign In Now

• Advertisement