SFML community forums

Help => Graphics => Topic started by: Vovosunt on May 09, 2013, 04:38:29 pm

Title: Making 3D SFML
Post by: Vovosunt on May 09, 2013, 04:38:29 pm
Over the last month or so I have been trying to make a 3D SFML-like thing (with SFML as the base).

Today I ran into a problem with GLEW while making a 3D version of RenderTarget. I'm not sure which libraries to link/ not link.
Currently I'm only linking the extlibs/libs-msvc/glew.lib (and the standard sfml libs), but it still gives linker errors:

Error   2       error LNK2019: unresolved external symbol "void __cdecl sf::priv::ensureGlewInit(void)" (?ensureGlewInit@priv@sf@@YAXXZ) referenced in function "public: void __thiscall RenderTarget3::resetGLStates(void)" (?resetGLStates@RenderTarget3@@QAEXXZ)     C:\Users\SVS\documents\visual studio 11\Projects\Project1\Project1\RenderTarget3.obj    Project1

Error   3       error LNK2001: unresolved external symbol __imp____glewBlendEquation    C:\Users\SVS\documents\visual studio 11\Projects\Project1\Project1\RenderTarget3.obj    Project1

Error   4       error LNK2001: unresolved external symbol __imp____glewUseProgramObjectARB      C:\Users\SVS\documents\visual studio 11\Projects\Project1\Project1\RenderTarget3.obj    Project1

Error   5       error LNK2001: unresolved external symbol __imp____glewBlendFuncSeparateEXT     C:\Users\SVS\documents\visual studio 11\Projects\Project1\Project1\RenderTarget3.obj    Project1

Error   6       error LNK2001: unresolved external symbol __imp____GLEW_EXT_blend_func_separate C:\Users\SVS\documents\visual studio 11\Projects\Project1\Project1\RenderTarget3.obj    Project1

Error   7       error LNK1120: 5 unresolved externals   C:\Users\SVS\documents\visual studio 11\Projects\Project1\Debug\Project1.exe    Project1
 
Any help would be very appreciated :)
Title: Re: Making 3D SFML
Post by: Laurent on May 09, 2013, 04:44:39 pm
If you integrate the sources directly to your project, or link it statically, you must define the GLEW_STATIC macro in your preprocessor options.
Title: Re: Making 3D SFML
Post by: Vovosunt on May 09, 2013, 05:07:34 pm
That took care of errors 3-7, but error 2 (sf::priv::ensureGlewInit()) still pops up :(
Title: Re: Making 3D SFML
Post by: Laurent on May 09, 2013, 06:15:28 pm
That's a private (non exported) SFML function. You mustn't use it.
Title: Re: Making 3D SFML
Post by: Vovosunt on May 09, 2013, 10:00:24 pm
By removing the ensureGlewInit and by commenting out some openGL ARB functions I managed to get it working.
It's something I guess :P

What should I do with ensureGlewInit then? Try making my own? Is it even needed?
(During debugging I noticed that it's called like 4 or 5 times every time you draw something O.O)

And how can I get those ext ARB functions to work?
(I get a bad memory acces crash when it tries to use glBlendEquation or glUseProgramObjectARB)

BTW thanks Laurent! You're a goddamn wizard as always :D
Title: Re: Making 3D SFML
Post by: Laurent on May 09, 2013, 10:13:53 pm
Quote
What should I do with ensureGlewInit then? Try making my own? Is it even needed?
It's a private implementation detail, so... forget it, do your own stuff ;)

Quote
And how can I get those ext ARB functions to work?
Aren't you using GLEW for this purpose? Don't forget to call glewInit, and everything should work.
Title: Re: Making 3D SFML
Post by: Grimshaw on May 10, 2013, 06:40:30 pm
Yep, I do this too. I use sfml and yet I link to glew too and call glewInit after the window is initialized! :)

It works just fine even though its a little ugly to have the linker warnings all over me.. :)
Title: Re: Making 3D SFML
Post by: Laurent on May 11, 2013, 09:33:29 am
What warnings?
Title: Re: Making 3D SFML
Post by: Grimshaw on May 11, 2013, 02:31:23 pm
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewUseProgram imported
2>nephilim-d.lib(CGL.obj) : warning LNK4217: locally defined symbol _glewInit imported in function "void __cdecl cglPrepareExtensions(void)" (?cglPrepareExtensions@@YAXXZ)
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewGetActiveUniform imported
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewGetProgramiv imported
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewDeleteShader imported
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewGetShaderInfoLog imported
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewGetShaderiv imported
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewCompileShader imported
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewShaderSource imported
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewCreateShader imported
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewDeleteProgram imported
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewGetProgramInfoLog imported
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewLinkProgram imported
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewAttachShader imported
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewBindAttribLocation imported
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewCreateProgram imported
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewUniform1i imported
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewGetUniformLocation imported
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewUniformMatrix4fv imported
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewUniform4fv imported
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewUniform3fv imported
2>nephilim-d.lib(Shader.obj) : warning LNK4049: locally defined symbol ___glewUniform1f imported
 

But it is normal I believe as GLEW is being linked twice (statically)
Title: Re: Making 3D SFML
Post by: Vovosunt on May 11, 2013, 03:19:32 pm
Well this is weird... I'm not getting any errors/warnings at all.
Besides using multiple glewInit() should just redefine all the bools and function pointers.
The warnings you get are due to export and then reimport of GLEW "symbols" :
Quote from: "msdn"
This warning is generated by the linker when you declare a symbol by using the __declspec(dllexport) storage-class attribute in one object file and reference it by using the __declspec(dllimport) attribute in another.]



It's a private implementation detail, so... forget it, do your own stuff ;)
I don't really understand the point of making functions in glCheck private...
They're pretty simple and are just for error checking anyway :\

Now, ensureGLcontext is another thing :)
It's pretty damn complicated...
setActive is there to make SFML thread safe, istn it?  ???
Anyway...

glewInit() did the trick and it seems that everything is working fine :D
Thanks again Laurent!

BTW can I use GLresource for Vertex/Pixel buffer implementations?
It's basically a thread-safe counter for the openGL resources if I understand everything right.
Title: Re: Making 3D SFML
Post by: Laurent on May 11, 2013, 03:29:11 pm
Quote
BTW can I use GLresource for Vertex/Pixel buffer implementations?
Yes.