Skip to content
This repository has been archived by the owner on Apr 15, 2023. It is now read-only.

Broken imports when using physac in module #12

Open
fschrofner opened this issue Apr 22, 2021 · 6 comments
Open

Broken imports when using physac in module #12

fschrofner opened this issue Apr 22, 2021 · 6 comments
Labels
bug Something isn't working

Comments

@fschrofner
Copy link

Sorry if it is an issue on my side, I'm still quite new to Nim and raylib.

When importing raylib as well as physac in my main class, everything is working fine and as expected.
When I tried to move physac into an own module, though, it seems that imports are broken.

In file included from /home/flosch/.cache/nim/main_d/@[email protected]:12:
/home/flosch/.nimble/pkgs/nimraylib_now-0.9.1/nimraylib_now/physac.h:147:5: error: unknown type name ‘Vector2’
  147 |     Vector2 positions[PHYSAC_MAX_VERTICES];     // Polygon vertex positions vectors
      |     ^~~~~~~
/home/flosch/.nimble/pkgs/nimraylib_now-0.9.1/nimraylib_now/physac.h:148:5: error: unknown type name ‘Vector2’
  148 |     Vector2 normals[PHYSAC_MAX_VERTICES];       // Polygon vertex normals vectors
      |     ^~~~~~~
/home/flosch/.nimble/pkgs/nimraylib_now-0.9.1/nimraylib_now/physac.h:162:5: error: unknown type name ‘Vector2’
  162 |     Vector2 position;                           // Physics body shape pivot
      |     ^~~~~~~
compilation terminated due to -fmax-errors=3.
Error: execution of an external compiler program 'gcc -c  -w -fmax-errors=3 -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -D_FORTIFY_SOURCE=2 -DPHYSAC_IMPLEMENTATION -DPHYSAC_NO_THREADS   -I/usr/lib/nim -I/home/flosch/Projects/nimraylib_now_issue -o /home/flosch/.cache/nim/main_d/@[email protected] /home/flosch/.cache/nim/main_d/@[email protected]' failed with exit code: 1

My setup looks like:

main.nim
module/module.nim

where main.nim imports:

import nimraylib_now/raylib
import module/module

and module.nim imports:

import nimraylib_now/raylib
import nimraylib_now/physac

When I then try to use physac like so in the module, i run into the issue above:

proc test*()=
    initPhysics()
    let body = createPhysicsBodyRectangle((0.0, 0.0), 32.0, 32.0, 10.0)

I created a git repository containing a minimal example, you can find it here

@greenfork
Copy link
Owner

That is a lot of input from your side, thank you!
I will take a look at it

@greenfork
Copy link
Owner

Could you please try this:

import nimraylib_now/raylib
import nimraylib_now/physac

proc test*()=
    discard RayWhite
    initPhysics()
    let body = createPhysicsBodyRectangle((0.0, 0.0), 32.0, 32.0, 10.0)

Here we add discard RayWhite so that nim compiler doesn't exclude "unneeded" nimraylib_now/raylib module because RayWhite is defined inside it.

I'm not sure what the correct fix should be to this situation. It doesn't work if I add it directly to physac.nim file. Nim thinks that we don't need this module because it is not used, but we still need it even if it is not used because this nim file also drags the .h file which has required type definitions.

I see that the only reason you add here raylib is to use its conversions tuples to vectors. I had ideas about moving converters to a separate file because they are generally considered broken and if what I said is true for, it will also have a utilitarian purpose.

@fschrofner
Copy link
Author

fschrofner commented Apr 24, 2021

You're right, this fixes the issue.

I see that the only reason you add here raylib is to use its conversions tuples to vectors.

In that minimal example, yes, but in my real project I also use some other methods from raylib.

I had ideas about moving converters to a separate file

This might be a good idea either way, but will it really help with this issue? As physac needs raylib for the Vector2 class, it will also fail in this example:

import nimraylib_now/physac

proc test*()=
    initPhysics()

So it's not just about tuple conversion. I'm kinda surprised, that Nim gets rid of the import although Vector2 is directly used in physac.nim.

@greenfork
Copy link
Owner

This looks like the issue is with the order of imports:

// /home/grfork/.cache/nim/main_d/@[email protected]

/* Generated by Nim Compiler v1.4.4 */
/*   (c) 2020 Andreas Rumpf */
/* The generated code is subject to the original license. */
/* Compiled for: Linux, amd64, gcc */
/* Command for C compiler:
   gcc -c  -w -fmax-errors=3 -DPHYSAC_IMPLEMENTATION -DPHYSAC_NO_THREADS   -I/home/grfork/.choosenim/toolchains/nim-1.4.4/lib -I/tmp/nimraylib_now_issue -o /home/grfork/.cache/nim/main_d/@[email protected] /home/grfork/.cache/nim/main_d/@[email protected] */
#define NIM_INTBITS 64

/* section: NIM_merge_HEADERS */

#include "nimbase.h"
#include "/home/grfork/reps/nimraylib_now/src/nimraylib_now/physac.h"
#include "/home/grfork/reps/nimraylib_now/src/nimraylib_now/raylib.h"
...

Raylib must be imported before physac. Let's see how's the resolution of #5 goes, it might solve this problem too. If not, we will try to somehow affect the order of importing.

@jeffmikels
Copy link

This problem exists on Mac too.

@greenfork
Copy link
Owner

One of the solutions to this problem is to create a single header file out of all other headers. This way we control the order of imports.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants