vkoskiv / c-ray

c-ray is a small, simple path tracer written in C

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Can't find assets

mandyedi opened this issue · comments

Hi vkoskiv,
I built a release following your instructions and when I run

bin\Release\c-ray.exe input\scene.json

it gives the following errors:

': Invalid argument3:52:41]: Can't access 'input\//tonni.mtl
': Invalid argument3:52:41]: Can't access 'input\//newScene.mtl
': Invalid argument3:52:41]: Can't access 'input\//torus.mtl
': Invalid argument3:52:41]: Can't access 'input\//teapot.mtl
': Invalid argument3:52:41]: Can't access 'input\//teapot_green.mtl

If I run it from Visual Studio and set command line arguments to c:\github\c-ray\input\scene.json, it gives the following errors:

[WARN][2021-01-31 23:54:53]: Can't access '/tonni.obj': No such file or directory
[WARN][2021-01-31 23:54:53]: Can't access '/newScene.obj': No such file or directory
[WARN][2021-01-31 23:54:53]: Can't access '/torus.obj': No such file or directory
[WARN][2021-01-31 23:54:53]: Can't access '/teapot.obj': No such file or directory
[WARN][2021-01-31 23:54:53]: Can't access '/teapot_green.obj': No such file or directory
[INFO][2021-01-31 23:54:53]: Loading mesh 6/6
[WARN][2021-01-31 23:54:53]: Can't access '/teapot_blue.obj': No such file or directory

I started to debug it. Do you have any workaround or is it a known issue?

Hi! Thanks for reporting this.

Interesting! Looks like a regression, likely my fault for not checking the newer file loading code thoroughly on Windows.

I don't have a Windows box on hand to start debugging right now, but it looks like the issue is likely in getFilePath(), where it blindly appends a forward slash, assuming it'll be a UNIX filepath.

Specifically we get two forward slashes, since we reconstruct the full path to the mtl file in parseWavefront(), and then again grab the asset path from that full string in parseMTLFile().

Could you try substituting that getFilePath() function with this one below, and see if it works? I can test it myself later this week as well if you're busy.

char *getFilePath(const char *input) {
	char *dir = NULL;
#ifdef WINDOWS
	dir = calloc(256, sizeof(*dir));
	_splitpath_s(input, NULL, 0, dir, sizeof(dir), NULL, 0, NULL, 0);
	return dir;
#else
	char *inputCopy = stringCopy(input);
	dir = stringCopy(dirname(inputCopy));
	free(inputCopy);
	char *final = stringConcat(dir, "/");
	free(dir);
	return final;
#endif
}

Thank you for your reply. I tested with the given modification but still have the issue.
I also built and ran on Linux and got this:

': No such file or directory Can't access './input/tonni.mtl
': No such file or directory Can't access './input/newScene.mtl
': No such file or directory Can't access './input/torus.mtl
': No such file or directory Can't access './input/teapot.mtl
': No such file or directory Can't access './input/teapot_green.mtl

@mandyedi Is that under Visual Studio? If so, c-ray assumes you're using relative paths from the current working directory. Try setting the CWD to the project root directory.

The earlier invocation you showed:

bin\Release\c-ray.exe input\scene.json

from the command prompt looks to be doing this correctly already, so that should work.

+1 I have this same issue currently on Windows. It can't find the assets and crashes.

I fired up a Win10 VM and took a look. I think I resolved the file loading + crashing issue. Turns out, they were two unrelated problems.
Let me know if it works for you now.

Resolved by #101

I tested it and works fine.
Thank you!

Great to hear! Closing this as resolved, then.