Add the code in emscripten hello_worldd which was missing in last 2 check-ins (sorry).
- Add a function to check for canvas resizes - Switch to WebGL1 driver git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@5508 dfc29bdd-3216-0410-991c-e03cc46cb475master
parent
60d2798d9d
commit
7f190b80cd
|
@ -40,8 +40,8 @@ all_win32 clean_win32 static_win32: SUF=.exe
|
|||
all_emscripten clean_emscripten: SUF=.html
|
||||
all_emscripten: CXXFLAGS += -fno-exceptions -fno-rtti -fstrict-aliasing -std=gnu++11 -U__STRICT_ANSI__
|
||||
all_emscripten: LDFLAGS += -lGL -lSDL --preload-file ../../media@/media -s ALLOW_MEMORY_GROWTH=1 -s NO_EXIT_RUNTIME=1
|
||||
# You have to check yourself if oyu need FULL_ES2 or not (it's slower sometimes, but some stuff simply won't work yet without this)
|
||||
all_emscripten: LDFLAGS += -s FULL_ES2=1
|
||||
# You need the FULL_ES2 when using EDT_OGLES2 driver
|
||||
#all_emscripten: LDFLAGS += -s FULL_ES2=1
|
||||
static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_
|
||||
all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm
|
||||
static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2
|
||||
|
|
|
@ -11,7 +11,7 @@ You have to setup the emscripten environment on your system first to use this.
|
|||
|
||||
/*
|
||||
The code in here is mostly similar to the usual HelloWorld.
|
||||
You can find more information about it there. Here we mainly document the
|
||||
You can find more information about it there. Here we mainly document the
|
||||
differences needed for emscripten.
|
||||
*/
|
||||
|
||||
|
@ -23,7 +23,7 @@ using namespace io;
|
|||
using namespace gui;
|
||||
|
||||
/*
|
||||
This part not necessary for emscripten, only useful to keep it in
|
||||
This part not necessary for emscripten, only useful to keep it in
|
||||
in case you want to run the same code on Windows with VS as well.
|
||||
*/
|
||||
#ifdef _MSC_VER
|
||||
|
@ -40,23 +40,52 @@ IVideoDriver* driver = 0;
|
|||
ISceneManager* smgr = 0;
|
||||
IGUIEnvironment* guienv = 0;
|
||||
|
||||
ICameraSceneNode* camera = 0;
|
||||
dimension2d<u32> screenSize(640, 480);
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
/*
|
||||
Handle changes in canvas size which are done with html/js.
|
||||
Note that it's only OK for windowed so far,
|
||||
the switch to fullscreen not yet working.
|
||||
*/
|
||||
void checkCanvasResize()
|
||||
{
|
||||
int w, h, fs;
|
||||
emscripten_get_canvas_size(&w, &h, &fs);
|
||||
const core::dimension2d<u32> canvasDim(w,h);
|
||||
if ( canvasDim != screenSize )
|
||||
{
|
||||
screenSize = canvasDim;
|
||||
driver->OnResize(canvasDim);
|
||||
driver->setViewPort(irr::core::rect<irr::s32>(0,0,w,h));
|
||||
|
||||
irr::f32 aspect = (irr::f32)w / (irr::f32)h;
|
||||
camera->setAspectRatio(aspect);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
emscripten can't run things in an endless-loop or otherwise the browse will consider
|
||||
the script to hang.
|
||||
*/
|
||||
#ifdef __EMSCRIPTEN__
|
||||
void one_iter()
|
||||
{
|
||||
if(!device->run())
|
||||
if(!device->run())
|
||||
{
|
||||
// Could clean up here in theory, but not sure if it makes a difference
|
||||
|
||||
|
||||
/*
|
||||
This tells emscripten to not run any further code.
|
||||
*/
|
||||
emscripten_cancel_main_loop();
|
||||
return;
|
||||
}
|
||||
|
||||
// In case you have a resizeable canvas (resized from html)
|
||||
checkCanvasResize();
|
||||
|
||||
driver->beginScene(ECBF_COLOR | ECBF_DEPTH, SColor(255,100,101,140));
|
||||
|
||||
smgr->drawAll();
|
||||
|
@ -73,24 +102,21 @@ void one_iter()
|
|||
int main()
|
||||
{
|
||||
/*
|
||||
Create device flags for emscripten are still experimental
|
||||
Create device flags for emscripten are still experimental
|
||||
and might not all work.
|
||||
|
||||
- deviceType: You have to use video::EDT_OGLES2 which will be translated
|
||||
to WebGL by emscripten.
|
||||
It can be useful to have EDT_OGLES2 or EDT_OGLES1 for comparison for
|
||||
testing on the desktop.
|
||||
|
||||
- deviceType: You can to use EDT_OGLES2 or EDT_WEBGL1 on emscripten.
|
||||
EDT_WEBGL1 is better optimized but does not yet support all options.
|
||||
EDT_OGLES2 needs -s FULL_ES2=1 as linker flag in the Makefile.
|
||||
*/
|
||||
#ifndef __EMSCRIPTEN__
|
||||
device =
|
||||
createDevice( video::EDT_OGLES1, dimension2d<u32>(640, 480), 16,
|
||||
false, false, false, 0);
|
||||
video::E_DRIVER_TYPE deviceType = EDT_OGLES2;
|
||||
#else //__EMSCRIPTEN__
|
||||
device =
|
||||
createDevice(video::EDT_OGLES2, dimension2d<u32>(640, 480), 16,
|
||||
false, false, false, 0);
|
||||
video::E_DRIVER_TYPE deviceType = EDT_WEBGL1;
|
||||
#endif //__EMSCRIPTEN__
|
||||
|
||||
device = createDevice(deviceType, screenSize, 16, false, false, false, 0);
|
||||
|
||||
if (!device)
|
||||
return 1;
|
||||
|
||||
|
@ -118,10 +144,10 @@ int main()
|
|||
rect<s32>(10,10,260,22), true);
|
||||
|
||||
/*
|
||||
Get a media path dedicated for your platform.
|
||||
Get a media path dedicated for your platform.
|
||||
We tell emscripten to copy the media folder in the Makefile with:
|
||||
"--preload-file ../../media@/media"
|
||||
That copies our ../../media folder in a .data
|
||||
That copies our ../../media folder in a .data
|
||||
file which is loaded by the browser. It can then be accessed there
|
||||
by "/media" name (that's the parameter after the '@').
|
||||
Note that usually you would try to copy only as many files
|
||||
|
@ -141,10 +167,10 @@ int main()
|
|||
IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh );
|
||||
|
||||
/*
|
||||
Disable lighting because we do not have a dynamic light in here, and
|
||||
the mesh would be totally black otherwise.
|
||||
Set the frame loop such that the predefined STAND animation is used.
|
||||
Add a texture to the model.
|
||||
Disable lighting because we do not have a dynamic light in here, and
|
||||
the mesh would be totally black otherwise.
|
||||
Set the frame loop such that the predefined STAND animation is used.
|
||||
Add a texture to the model.
|
||||
*/
|
||||
if (node)
|
||||
{
|
||||
|
@ -158,11 +184,11 @@ int main()
|
|||
(0, 30, -40). The camera looks from there to (0,5,0), which is
|
||||
approximately the place where our md2 model is.
|
||||
*/
|
||||
smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));
|
||||
camera = smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));
|
||||
|
||||
#ifndef __EMSCRIPTEN__ // this part only so you can run the same code on desktop
|
||||
/*
|
||||
On desktop we run and endless loop until the user closes the window or
|
||||
On desktop we run and endless loop until the user closes the window or
|
||||
presses ALT+F4 (or whatever keycode closes a window).
|
||||
*/
|
||||
while(device->run())
|
||||
|
@ -175,20 +201,20 @@ int main()
|
|||
driver->endScene();
|
||||
}
|
||||
device->drop();
|
||||
|
||||
|
||||
#else // __EMSCRIPTEN__
|
||||
|
||||
|
||||
/*
|
||||
Setting fps to 0 or a negative value will use the browser’s
|
||||
requestAnimationFrame mechanism to call the main loop function.
|
||||
Emscripten documentation recommends to do that, but you can also set
|
||||
another fps value and the browser will try to call the main-loop
|
||||
Setting fps to 0 or a negative value will use the browser’s
|
||||
requestAnimationFrame mechanism to call the main loop function.
|
||||
Emscripten documentation recommends to do that, but you can also set
|
||||
another fps value and the browser will try to call the main-loop
|
||||
fps times per second.
|
||||
The simulate_infinite_loop tells emscripten that this is an application
|
||||
which will simulate an infinite loop. There is also a flag in the
|
||||
which will simulate an infinite loop. There is also a flag in the
|
||||
Makefile about that: -s NO_EXIT_RUNTIME=1
|
||||
*/
|
||||
int fps = 0;
|
||||
int fps = 0;
|
||||
int simulate_infinite_loop = 1;
|
||||
emscripten_set_main_loop(one_iter, fps, simulate_infinite_loop);
|
||||
#endif //__EMSCRIPTEN__
|
||||
|
|
Loading…
Reference in New Issue