ssloy / tinyrenderer

A brief computer graphics / rendering course
https://github.com/ssloy/tinyrenderer/wiki
Other
20.2k stars 1.96k forks source link

TGAColor expects an array and not integer arguments #142

Open tsadarsh opened 1 month ago

tsadarsh commented 1 month ago

Compiling my mesh.cpp throws the following error in at this line:

const TGAColor white = TGAColor(255, 255, 255, 255);
 error: no matching function for call to ‘TGAColor::TGAColor(int, int, int, int)’
    6 | const TGAColor white = TGAColor(255, 255, 255, 255);
tgaimage.h:23:8: note: candidate: ‘constexpr TGAColor::TGAColor()’
   23 | struct TGAColor {
      |        ^~~~~~~~
tgaimage.h:23:8: note:   candidate expects 0 arguments, 4 provided
tgaimage.h:23:8: note: candidate: ‘constexpr TGAColor::TGAColor(const TGAColor&)’
tgaimage.h:23:8: note:   candidate expects 1 argument, 4 provided
tgaimage.h:23:8: note: candidate: ‘constexpr TGAColor::TGAColor(TGAColor&&)’
tgaimage.h:23:8: note:   candidate expects 1 argument, 4 provided

Going through the definition of TGAColor in tgaimage.h it is very clear that it expects an array:

struct TGAColor {
    std::uint8_t bgra[4] = {0,0,0,0};
    std::uint8_t bytespp = 4;
    std::uint8_t& operator[](const int i) { return bgra[i]; }
};

So shouldn't TGAColor(255, 255, 255, 255); be changed to TGAColor({255, 255, 255, 255}); in the Wiki pages too?

Doing so compiles the program successfully without any errors. Is this an actual bug or am I not understanding something?

digitsensitive commented 1 month ago

Hello @tsadarsh The definition of the struct TGAColor looks different in the tgaimage.h I loaded up from the tinyrenderer repository. Which tgaimage.h are you using?

tsadarsh commented 1 month ago

I am referring to the current (master) branch. Here is the file tgaimage.h.

digitsensitive commented 1 month ago

@tsadarsh I see. So this is the problem, why the code does not work, because this is the wrong tgaimage.h file you are referring. If you look at the README.md file @ssloy writes:

... The entire code is available on github, and [here](https://github.com/ssloy/tinyrenderer/tree/909fe20934ba5334144d2c748805690a1fa4c89f) you will find the source code I give to my students.

So no, I do not think that the Wiki needs any changes. This just in case you meant the README.md file.

And yes, you are right with the code change. Just a detail: I think you should use curly brackets to init a struct, like this:

const TGAColor white = TGAColor{{255, 255, 255, 255}};
ssloy commented 1 month ago

It would make sense to add the corresponding constructor to the TGAColor class. Will once I have access to a computer

tsadarsh commented 1 month ago

Thank you @digitsensitive for the clarification.