The following code implements a miniature version of the mental ray standalone executable:
#include <stdio.h>
#include <shader.h>
#include <geoshader.h>
#include <mirelay.h>
static void memerror(void) { mi_fatal("out of memory"); }
static void imgerror(miImg_file * const ifp)
{ mi_fatal("file error, exiting."); }
int main(
int argc,
char *argv[])
{
int nthreads;
miBoolean resume = miFALSE;
if (!mi_raylib_attach_process())
return(1);
mi_mem_error_handler(memerror);
mi_img_err_handler(imgerror);
mi_mem_init();
mi_ntlib_init();
nthreads = mi_raylib_license_get(mi_msg_no_of_cpus());
mi_raylib_init(miFALSE, nthreads, miFALSE);
#ifdef _WIN32
mi_link_set_module_handle(GetModuleHandle("libray.dll"));
#endif
mi_mi_parse_rayrc(0, miFALSE);
while (mi_mi_parse(argv[1], resume, 0, 0, 0, getc, miFALSE, 0)) {
miTag root, caminst, cam, opt;
miInh_func inh;
mi_api_render_params(&root, &caminst, &cam, &opt, &inh);
resume = mi_rc_run(miRENDER_DEFAULT, 0, 0, root, caminst,
cam, opt, inh);
mi_api_render_release();
if (!resume)
break;
}
mi_raylib_license_release();
mi_raylib_exit();
mi_raylib_detach_process();
return(0);
}
The initialization and shutdown parts have already been discussed in this chapter. Four new functions were added: