Drop NACL platform
It's no longer maintained and Chrome-specific, so it's not a viable solution to deploy Godot games in browsers. The current prefered alternative is asm.js (platform/javascript), and we're looking forward to WebAssembly.
This commit is contained in:
parent
f368d380e7
commit
ec606f94dc
|
@ -1,30 +0,0 @@
|
|||
Import('env')
|
||||
|
||||
nacl_lib = [
|
||||
|
||||
'os_nacl.cpp',
|
||||
'audio_driver_nacl.cpp',
|
||||
'godot_nacl.cpp',
|
||||
#'pepper_main.cpp',
|
||||
'opengl_context.cpp',
|
||||
'godot_module.cpp',
|
||||
'geturl_handler.cpp',
|
||||
]
|
||||
|
||||
nacl_posix = [
|
||||
|
||||
'#drivers/unix/thread_posix.cpp',
|
||||
'#drivers/unix/mutex_posix.cpp',
|
||||
'#drivers/unix/semaphore_posix.cpp',
|
||||
]
|
||||
|
||||
posix_lib = []
|
||||
for f in nacl_posix:
|
||||
posix_lib.append(env.Object(f, CPPFLAGS = env['CPPFLAGS']+['-DUNIX_ENABLED'], OBJSUFFIX = '.posix'+env['OBJSUFFIX']))
|
||||
|
||||
prog = env.Program('#bin/godot_nacl', nacl_lib + posix_lib)
|
||||
|
||||
if (env['nacl_arch'] == 'i686'):
|
||||
env.Alias("nacl_32", prog)
|
||||
if (env['nacl_arch'] == 'x86_64'):
|
||||
env.Alias("nacl_64", prog)
|
|
@ -1,106 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* audio_driver_nacl.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* http://www.godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
#include "audio_driver_nacl.h"
|
||||
|
||||
#include "ppapi/cpp/instance.h"
|
||||
|
||||
extern pp::Instance* godot_instance;
|
||||
|
||||
const char* AudioDriverNacl::get_name() const {
|
||||
|
||||
return "Nacl";
|
||||
}
|
||||
|
||||
void AudioDriverNacl::output_callback(void* samples, uint32_t buffer_size, void* data) {
|
||||
|
||||
AudioDriverNacl* ad = (AudioDriverNacl*)data;
|
||||
int16_t* out = (int16_t*)samples;
|
||||
|
||||
ad->lock();
|
||||
ad->audio_server_process(ad->sample_frame_count_, ad->samples_in);
|
||||
ad->unlock();
|
||||
|
||||
for (int i=0; i<ad->sample_count; i++) {
|
||||
|
||||
out[i] = ad->samples_in[i]>>16;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
Error AudioDriverNacl::init(){
|
||||
|
||||
int frame_size = 4096;
|
||||
sample_frame_count_ = pp::AudioConfig::RecommendSampleFrameCount(godot_instance,PP_AUDIOSAMPLERATE_44100, frame_size);
|
||||
sample_count = sample_frame_count_ * 2;
|
||||
|
||||
audio_ = pp::Audio(godot_instance,
|
||||
pp::AudioConfig(godot_instance,
|
||||
PP_AUDIOSAMPLERATE_44100,
|
||||
sample_frame_count_),
|
||||
&AudioDriverNacl::output_callback,
|
||||
this);
|
||||
|
||||
samples_in = memnew_arr(int32_t, sample_frame_count_ * 2);
|
||||
|
||||
return OK;
|
||||
}
|
||||
void AudioDriverNacl::start(){
|
||||
|
||||
audio_.StartPlayback();
|
||||
}
|
||||
int AudioDriverNacl::get_mix_rate() const {
|
||||
|
||||
return 44100;
|
||||
}
|
||||
AudioDriverSW::OutputFormat AudioDriverNacl::get_output_format() const{
|
||||
|
||||
return OUTPUT_STEREO;
|
||||
}
|
||||
void AudioDriverNacl::lock(){
|
||||
|
||||
}
|
||||
void AudioDriverNacl::unlock() {
|
||||
|
||||
|
||||
}
|
||||
void AudioDriverNacl::finish(){
|
||||
|
||||
audio_.StopPlayback();
|
||||
}
|
||||
|
||||
|
||||
AudioDriverNacl::AudioDriverNacl() {
|
||||
}
|
||||
|
||||
AudioDriverNacl::~AudioDriverNacl() {
|
||||
|
||||
memdelete_arr(samples_in);
|
||||
}
|
||||
|
||||
|
|
@ -1,63 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* audio_driver_nacl.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* http://www.godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
#ifndef AUDIO_DRIVER_NACL_H
|
||||
#define AUDIO_DRIVER_NACL_H
|
||||
|
||||
#include "servers/audio/audio_server_sw.h"
|
||||
|
||||
#include "ppapi/cpp/audio.h"
|
||||
|
||||
class AudioDriverNacl : public AudioDriverSW {
|
||||
|
||||
static void output_callback(void* samples, uint32_t buffer_size, void* data);
|
||||
|
||||
int32_t* samples_in;
|
||||
int sample_frame_count_;
|
||||
int sample_count;
|
||||
pp::Audio audio_;
|
||||
|
||||
public:
|
||||
|
||||
virtual const char* get_name() const;
|
||||
|
||||
virtual Error init();
|
||||
virtual void start();
|
||||
virtual int get_mix_rate() const ;
|
||||
virtual OutputFormat get_output_format() const;
|
||||
virtual void lock();
|
||||
virtual void unlock();
|
||||
virtual void finish();
|
||||
|
||||
|
||||
AudioDriverNacl();
|
||||
~AudioDriverNacl();
|
||||
};
|
||||
|
||||
#endif // AUDIO_DRIVER_NACL_H
|
||||
|
|
@ -1,67 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* context_gl_nacl.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* http://www.godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
#include "context_gl_nacl.h"
|
||||
|
||||
#include <nacl/npapi.h>
|
||||
#include <nacl/npruntime.h>
|
||||
#include <nacl/npapi_extensions.h>
|
||||
#include <nacl/npupp.h>
|
||||
#include <pgl/pgl.h>
|
||||
#include <GLES2/gl2.h>
|
||||
|
||||
void ContextGLNacl::make_current() {
|
||||
|
||||
};
|
||||
|
||||
int ContextGLNacl::get_window_width() {
|
||||
|
||||
};
|
||||
|
||||
int ContextGLNacl::get_window_height() {
|
||||
|
||||
};
|
||||
|
||||
void ContextGLNacl::swap_buffers() {
|
||||
|
||||
};
|
||||
|
||||
Error ContextGLNacl::initialize() {
|
||||
|
||||
};
|
||||
|
||||
|
||||
ContextGLNacl::ContextGLNacl() {
|
||||
|
||||
|
||||
};
|
||||
|
||||
ContextGLNacl::~ContextGLNacl() {
|
||||
|
||||
};
|
||||
|
|
@ -1,58 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* context_gl_nacl.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* http://www.godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
#ifndef CONTEXT_GL_NACL_H
|
||||
#define CONTEXT_GL_NACL_H
|
||||
|
||||
#include "drivers/gl_context/context_gl.h"
|
||||
|
||||
class NPDevice;
|
||||
|
||||
class ContextGLNacl : public ContextGL {
|
||||
|
||||
enum {
|
||||
COMMAND_BUFFER_SIZE = 1024 * 1024,
|
||||
};
|
||||
|
||||
NPDevice* device3d_;
|
||||
|
||||
public:
|
||||
|
||||
virtual void make_current();
|
||||
|
||||
virtual int get_window_width();
|
||||
virtual int get_window_height();
|
||||
virtual void swap_buffers();
|
||||
|
||||
virtual Error initialize();
|
||||
|
||||
ContextGLNacl();
|
||||
~ContextGLNacl();
|
||||
};
|
||||
|
||||
#endif // CONTEXT_GL_NACL_H
|
|
@ -1,71 +0,0 @@
|
|||
import os
|
||||
import sys
|
||||
|
||||
def is_active():
|
||||
return True
|
||||
|
||||
def get_name():
|
||||
return "NaCl"
|
||||
|
||||
def can_build():
|
||||
|
||||
import os
|
||||
if not os.environ.has_key("NACLPATH"):
|
||||
return False
|
||||
return True
|
||||
|
||||
def get_opts():
|
||||
|
||||
return [
|
||||
('NACLPATH', 'the path to nacl', os.environ.get("NACLPATH", 0)),
|
||||
('nacl_arch', 'The architecture for Nacl build (can be i686 or x86_64', 'i686'),
|
||||
]
|
||||
|
||||
def get_flags():
|
||||
|
||||
return [
|
||||
('nedmalloc', 'no'),
|
||||
('tools', 'no'),
|
||||
]
|
||||
|
||||
|
||||
|
||||
def configure(env):
|
||||
|
||||
env.Append(CPPPATH=['#platform/nacl'])
|
||||
|
||||
env['OBJSUFFIX'] = ".nacl.${nacl_arch}.o"
|
||||
env['LIBSUFFIX'] = ".nacl.${nacl_arch}.a"
|
||||
env['PROGSUFFIX'] = ".${nacl_arch}.nexe"
|
||||
|
||||
env['ENV']['PATH'] = env['ENV']['PATH']+":"+env['NACLPATH']+"/toolchain/linux_x86_newlib/bin"
|
||||
|
||||
env['CC'] = '${nacl_arch}-nacl-gcc'
|
||||
env['CXX'] = '${nacl_arch}-nacl-g++'
|
||||
env['AR'] = '${nacl_arch}-nacl-ar'
|
||||
|
||||
env.Append(CCFLAGS=['-fexceptions', '-Wno-long-long', '-pthread', '-DXP_UNIX'])
|
||||
|
||||
env.Append(CPPPATH=env['NACLPATH'])
|
||||
|
||||
if (env["target"]=="release"):
|
||||
|
||||
env.Append(CCFLAGS=['-O2','-ffast-math','-fomit-frame-pointer', '-ffunction-sections', '-fdata-sections', '-fno-default-inline'])
|
||||
|
||||
elif (env["target"]=="debug"):
|
||||
|
||||
env.Append(CCFLAGS=['-g', '-O0', '-Wall','-DDEBUG_ENABLED'])
|
||||
|
||||
|
||||
elif (env["target"]=="profile"):
|
||||
|
||||
env.Append(CCFLAGS=['-g','-pg'])
|
||||
env.Append(LINKFLAGS=['-pg'])
|
||||
|
||||
env.Append(CCFLAGS=['-DNACL_ENABLED', '-DGLES2_ENABLED'])
|
||||
|
||||
env.Append(LIBFLAGS=['m32'])
|
||||
env.Append(LIBS=env.Split('ppapi ppapi_cpp pthread srpc ppapi_gles22'))
|
||||
|
||||
import methods
|
||||
env.Append( BUILDERS = { 'GLSL120GLES' : env.Builder(action = methods.build_gles2_headers, suffix = 'glsl.h',src_suffix = '.glsl') } )
|
|
@ -1,150 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* geturl_handler.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* http://www.godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
#include "geturl_handler.h"
|
||||
|
||||
#include "core/os/copymem.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "ppapi/c/pp_errors.h"
|
||||
#include "ppapi/c/ppb_instance.h"
|
||||
#include "ppapi/cpp/module.h"
|
||||
#include "ppapi/cpp/var.h"
|
||||
|
||||
void GetURLHandler::Start() {
|
||||
pp::CompletionCallback cc =
|
||||
cc_factory_.NewCallback(&GetURLHandler::OnOpen);
|
||||
url_loader_.Open(url_request_, cc);
|
||||
}
|
||||
|
||||
void GetURLHandler::OnOpen(int32_t result) {
|
||||
if (result != PP_OK) {
|
||||
status = STATUS_ERROR;
|
||||
return;
|
||||
}
|
||||
// Here you would process the headers. A real program would want to at least
|
||||
// check the HTTP code and potentially cancel the request.
|
||||
// pp::URLResponseInfo response = loader_.GetResponseInfo();
|
||||
|
||||
// Start streaming.
|
||||
ReadBody();
|
||||
}
|
||||
|
||||
void GetURLHandler::AppendDataBytes(const char* buffer, int32_t num_bytes) {
|
||||
if (num_bytes <= 0)
|
||||
return;
|
||||
// Make sure we don't get a buffer overrun.
|
||||
num_bytes = std::min(READ_BUFFER_SIZE, num_bytes);
|
||||
int ofs = data.size();
|
||||
data.resize(ofs + num_bytes);
|
||||
copymem(&data[ofs], buffer, num_bytes);
|
||||
}
|
||||
|
||||
void GetURLHandler::OnRead(int32_t result) {
|
||||
if (result == PP_OK) {
|
||||
// Streaming the file is complete.
|
||||
status = STATUS_COMPLETED;
|
||||
instance_->HandleMessage("package_finished");
|
||||
instance_->HandleMessage(0);
|
||||
printf("completed!\n");
|
||||
} else if (result > 0) {
|
||||
// The URLLoader just filled "result" number of bytes into our buffer.
|
||||
// Save them and perform another read.
|
||||
AppendDataBytes(buffer_, result);
|
||||
ReadBody();
|
||||
} else {
|
||||
// A read error occurred.
|
||||
status = STATUS_ERROR;
|
||||
ERR_FAIL_COND(result < 0);
|
||||
}
|
||||
}
|
||||
|
||||
void GetURLHandler::ReadBody() {
|
||||
// Note that you specifically want an "optional" callback here. This will
|
||||
// allow ReadBody() to return synchronously, ignoring your completion
|
||||
// callback, if data is available. For fast connections and large files,
|
||||
// reading as fast as we can will make a large performance difference
|
||||
// However, in the case of a synchronous return, we need to be sure to run
|
||||
// the callback we created since the loader won't do anything with it.
|
||||
pp::CompletionCallback cc =
|
||||
cc_factory_.NewOptionalCallback(&GetURLHandler::OnRead);
|
||||
int32_t result = PP_OK;
|
||||
do {
|
||||
result = url_loader_.ReadResponseBody(buffer_, sizeof(buffer_), cc);
|
||||
// Handle streaming data directly. Note that we *don't* want to call
|
||||
// OnRead here, since in the case of result > 0 it will schedule
|
||||
// another call to this function. If the network is very fast, we could
|
||||
// end up with a deeply recursive stack.
|
||||
if (result > 0) {
|
||||
AppendDataBytes(buffer_, result);
|
||||
}
|
||||
} while (result > 0);
|
||||
|
||||
if (result != PP_OK_COMPLETIONPENDING) {
|
||||
// Either we reached the end of the stream (result == PP_OK) or there was
|
||||
// an error. We want OnRead to get called no matter what to handle
|
||||
// that case, whether the error is synchronous or asynchronous. If the
|
||||
// result code *is* COMPLETIONPENDING, our callback will be called
|
||||
// asynchronously.
|
||||
cc.Run(result);
|
||||
}
|
||||
}
|
||||
|
||||
GetURLHandler::Status GetURLHandler::get_status() const {
|
||||
|
||||
return status;
|
||||
};
|
||||
|
||||
Vector<uint8_t> GetURLHandler::get_data() const {
|
||||
|
||||
return data;
|
||||
};
|
||||
|
||||
int GetURLHandler::get_bytes_read() const {
|
||||
|
||||
return data.size();
|
||||
};
|
||||
|
||||
GetURLHandler::GetURLHandler(pp::Instance* instance,
|
||||
const String& url)
|
||||
: instance_(instance),
|
||||
url_(url),
|
||||
url_request_(instance),
|
||||
url_loader_(instance),
|
||||
cc_factory_(this) {
|
||||
url_request_.SetURL(std::string(url.utf8().get_data()));
|
||||
url_request_.SetMethod("GET");
|
||||
status = STATUS_NONE;
|
||||
printf("url handler for url %ls!\n", url.c_str());
|
||||
}
|
||||
|
||||
GetURLHandler::~GetURLHandler() {
|
||||
}
|
||||
|
||||
|
|
@ -1,115 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* geturl_handler.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* http://www.godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
#ifndef EXAMPLES_GETURL_GETURL_HANDLER_H_
|
||||
#define EXAMPLES_GETURL_GETURL_HANDLER_H_
|
||||
|
||||
#include "core/ustring.h"
|
||||
#include "core/vector.h"
|
||||
#include "ppapi/cpp/completion_callback.h"
|
||||
#include "ppapi/cpp/url_loader.h"
|
||||
#include "ppapi/cpp/url_request_info.h"
|
||||
#include "ppapi/cpp/instance.h"
|
||||
#include "ppapi/utility/completion_callback_factory.h"
|
||||
|
||||
#define READ_BUFFER_SIZE 32768
|
||||
|
||||
// GetURLHandler is used to download data from |url|. When download is
|
||||
// finished or when an error occurs, it posts a message back to the browser
|
||||
// with the results encoded in the message as a string and self-destroys.
|
||||
//
|
||||
// EXAMPLE USAGE:
|
||||
// GetURLHandler* handler* = GetURLHandler::Create(instance,url);
|
||||
// handler->Start();
|
||||
//
|
||||
class GetURLHandler {
|
||||
|
||||
public:
|
||||
|
||||
enum Status {
|
||||
|
||||
STATUS_NONE,
|
||||
STATUS_IN_PROGRESS,
|
||||
STATUS_COMPLETED,
|
||||
STATUS_ERROR,
|
||||
};
|
||||
|
||||
private:
|
||||
|
||||
Status status;
|
||||
|
||||
// Callback fo the pp::URLLoader::Open().
|
||||
// Called by pp::URLLoader when response headers are received or when an
|
||||
// error occurs (in response to the call of pp::URLLoader::Open()).
|
||||
// Look at <ppapi/c/ppb_url_loader.h> and
|
||||
// <ppapi/cpp/url_loader.h> for more information about pp::URLLoader.
|
||||
void OnOpen(int32_t result);
|
||||
|
||||
// Callback fo the pp::URLLoader::ReadResponseBody().
|
||||
// |result| contains the number of bytes read or an error code.
|
||||
// Appends data from this->buffer_ to this->url_response_body_.
|
||||
void OnRead(int32_t result);
|
||||
|
||||
// Reads the response body (asynchronously) into this->buffer_.
|
||||
// OnRead() will be called when bytes are received or when an error occurs.
|
||||
void ReadBody();
|
||||
|
||||
// Append data bytes read from the URL onto the internal buffer. Does
|
||||
// nothing if |num_bytes| is 0.
|
||||
void AppendDataBytes(const char* buffer, int32_t num_bytes);
|
||||
|
||||
pp::Instance* instance_; // Weak pointer.
|
||||
String url_; // URL to be downloaded.
|
||||
pp::URLRequestInfo url_request_;
|
||||
pp::URLLoader url_loader_; // URLLoader provides an API to download URLs.
|
||||
char buffer_[READ_BUFFER_SIZE]; // Temporary buffer for reads.
|
||||
Vector<uint8_t> data; // Contains accumulated downloaded data.
|
||||
pp::CompletionCallbackFactory<GetURLHandler> cc_factory_;
|
||||
bool complete;
|
||||
|
||||
GetURLHandler(const GetURLHandler&);
|
||||
void operator=(const GetURLHandler&);
|
||||
|
||||
public:
|
||||
// Creates instance of GetURLHandler on the heap.
|
||||
// GetURLHandler objects shall be created only on the heap (they
|
||||
// self-destroy when all data is in).
|
||||
// Initiates page (URL) download.
|
||||
void Start();
|
||||
|
||||
Status get_status() const;
|
||||
Vector<uint8_t> get_data() const;
|
||||
|
||||
int get_bytes_read() const;
|
||||
|
||||
GetURLHandler(pp::Instance* instance_, const String& url);
|
||||
~GetURLHandler();
|
||||
};
|
||||
|
||||
#endif // EXAMPLES_GETURL_GETURL_HANDLER_H_
|
||||
|
|
@ -1,332 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* godot_module.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* http://www.godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
#include "opengl_context.h"
|
||||
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "ppapi/cpp/instance.h"
|
||||
#include "ppapi/cpp/module.h"
|
||||
#include "ppapi/gles2/gl2ext_ppapi.h"
|
||||
|
||||
#include "ppapi/cpp/rect.h"
|
||||
#include "ppapi/cpp/size.h"
|
||||
#include "ppapi/cpp/var.h"
|
||||
#include "geturl_handler.h"
|
||||
|
||||
#include "core/variant.h"
|
||||
#include "os_nacl.h"
|
||||
|
||||
extern int nacl_main(int argc, const char** argn, const char** argv);
|
||||
extern void nacl_cleanup();
|
||||
|
||||
static String pkg_url;
|
||||
|
||||
pp::Instance* godot_instance = NULL;
|
||||
|
||||
struct StateData {
|
||||
int arg_count;
|
||||
Array args;
|
||||
String method;
|
||||
};
|
||||
|
||||
extern OSNacl* os_nacl;
|
||||
|
||||
class GodotInstance : public pp::Instance {
|
||||
|
||||
enum State {
|
||||
STATE_METHOD,
|
||||
STATE_PARAM_COUNT,
|
||||
STATE_PARAMS,
|
||||
STATE_CALL,
|
||||
};
|
||||
|
||||
State state;
|
||||
StateData* sd;
|
||||
SharedOpenGLContext opengl_context_;
|
||||
int width;
|
||||
int height;
|
||||
|
||||
#define MAX_ARGS 64
|
||||
uint32_t init_argc;
|
||||
char* init_argn[MAX_ARGS];
|
||||
char* init_argv[MAX_ARGS];
|
||||
|
||||
bool package_loaded;
|
||||
GetURLHandler* package_pending;
|
||||
|
||||
public:
|
||||
explicit GodotInstance(PP_Instance instance) : pp::Instance(instance) {
|
||||
printf("GodotInstance!\n");
|
||||
state = STATE_METHOD;
|
||||
RequestInputEvents(PP_INPUTEVENT_CLASS_MOUSE | PP_INPUTEVENT_CLASS_KEYBOARD | PP_INPUTEVENT_CLASS_WHEEL | PP_INPUTEVENT_CLASS_TOUCH);
|
||||
sd = NULL;
|
||||
package_pending = NULL;
|
||||
package_loaded = false;
|
||||
godot_instance = this;
|
||||
}
|
||||
virtual ~GodotInstance() {
|
||||
|
||||
nacl_cleanup();
|
||||
}
|
||||
|
||||
/// Called by the browser to handle the postMessage() call in Javascript.
|
||||
/// Detects which method is being called from the message contents, and
|
||||
/// calls the appropriate function. Posts the result back to the browser
|
||||
/// asynchronously.
|
||||
/// @param[in] var_message The message posted by the browser. The possible
|
||||
/// messages are 'fortyTwo' and 'reverseText:Hello World'. Note that
|
||||
/// the 'reverseText' form contains the string to reverse following a ':'
|
||||
/// separator.
|
||||
virtual void HandleMessage(const pp::Var& var_message);
|
||||
|
||||
bool HandleInputEvent(const pp::InputEvent& event);
|
||||
|
||||
bool Init(uint32_t argc, const char* argn[], const char* argv[]) {
|
||||
|
||||
printf("******* init! %i, %p, %p\n", argc, argn, argv);
|
||||
fflush(stdout);
|
||||
if (opengl_context_ == NULL) {
|
||||
opengl_context_.reset(new OpenGLContext(this));
|
||||
};
|
||||
opengl_context_->InvalidateContext(this);
|
||||
opengl_context_->ResizeContext(pp::Size(0, 0));
|
||||
int current = opengl_context_->MakeContextCurrent(this);
|
||||
printf("current is %i\n", current);
|
||||
|
||||
os_nacl = new OSNacl;
|
||||
|
||||
pkg_url = "";
|
||||
for (uint32_t i=0; i<argc; i++) {
|
||||
if (strcmp(argn[i], "package") == 0) {
|
||||
pkg_url = argv[i];
|
||||
};
|
||||
};
|
||||
|
||||
sd = memnew(StateData);
|
||||
|
||||
if (pkg_url == "") {
|
||||
nacl_main(argc, argn, argv);
|
||||
} else {
|
||||
printf("starting package %ls\n", pkg_url.c_str());
|
||||
init_argc = MIN(argc, MAX_ARGS-1);
|
||||
for (uint32_t i=0; i<argc; i++) {
|
||||
|
||||
int nlen = strlen(argn[i]);
|
||||
init_argn[i] = (char*)memalloc(nlen+1);
|
||||
strcpy(init_argn[i], argn[i]);
|
||||
init_argn[i+1] = NULL;
|
||||
|
||||
int len = strlen(argv[i]);
|
||||
init_argv[i] = (char*)memalloc(len+1);
|
||||
strcpy(init_argv[i], argv[i]);
|
||||
init_argv[i+1] = NULL;
|
||||
};
|
||||
package_pending = memnew(GetURLHandler(this, pkg_url));
|
||||
package_pending->Start();
|
||||
};
|
||||
return true;
|
||||
};
|
||||
|
||||
// Called whenever the in-browser window changes size.
|
||||
virtual void DidChangeView(const pp::Rect& position, const pp::Rect& clip) {
|
||||
|
||||
if (position.size().width() == width &&
|
||||
position.size().height() == height)
|
||||
return; // Size didn't change, no need to update anything.
|
||||
|
||||
if (opengl_context_ == NULL) {
|
||||
opengl_context_.reset(new OpenGLContext(this));
|
||||
};
|
||||
opengl_context_->InvalidateContext(this);
|
||||
opengl_context_->ResizeContext(position.size());
|
||||
if (!opengl_context_->MakeContextCurrent(this))
|
||||
return;
|
||||
|
||||
width = position.size().width();
|
||||
height = position.size().height();
|
||||
// init gl here?
|
||||
OS::VideoMode vm;
|
||||
vm.width = width;
|
||||
vm.height = height;
|
||||
vm.resizable = false;
|
||||
vm.fullscreen = true;
|
||||
OS::get_singleton()->set_video_mode(vm, 0);
|
||||
|
||||
DrawSelf();
|
||||
};
|
||||
|
||||
// Called to draw the contents of the module's browser area.
|
||||
void DrawSelf() {
|
||||
|
||||
if (opengl_context_ == NULL)
|
||||
return;
|
||||
|
||||
opengl_context_->FlushContext();
|
||||
};
|
||||
};
|
||||
|
||||
static Variant to_variant(const pp::Var& p_var) {
|
||||
|
||||
if (p_var.is_undefined() || p_var.is_null())
|
||||
return Variant();
|
||||
if (p_var.is_bool())
|
||||
return Variant(p_var.AsBool());
|
||||
if (p_var.is_double())
|
||||
return Variant(p_var.AsDouble());
|
||||
if (p_var.is_int())
|
||||
return Variant((int64_t)p_var.AsInt());
|
||||
if (p_var.is_string())
|
||||
return Variant(String::utf8(p_var.AsString().c_str()));
|
||||
|
||||
return Variant();
|
||||
};
|
||||
|
||||
void GodotInstance::HandleMessage(const pp::Var& var_message) {
|
||||
|
||||
switch (state) {
|
||||
|
||||
case STATE_METHOD: {
|
||||
|
||||
ERR_FAIL_COND(!var_message.is_string());
|
||||
sd->method = var_message.AsString().c_str();
|
||||
state = STATE_PARAM_COUNT;
|
||||
} break;
|
||||
case STATE_PARAM_COUNT: {
|
||||
|
||||
ERR_FAIL_COND(!var_message.is_number());
|
||||
sd->arg_count = var_message.AsInt();
|
||||
state = sd->arg_count>0?STATE_PARAMS:STATE_CALL;
|
||||
|
||||
} break;
|
||||
case STATE_PARAMS: {
|
||||
|
||||
Variant p = to_variant(var_message);
|
||||
sd->args.push_back(p);
|
||||
if (sd->args.size() >= sd->arg_count)
|
||||
state = STATE_CALL;
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
|
||||
if (state == STATE_CALL) {
|
||||
|
||||
// call
|
||||
state = STATE_METHOD;
|
||||
|
||||
|
||||
if (sd->method == "package_finished") {
|
||||
|
||||
GetURLHandler::Status status = package_pending->get_status();
|
||||
printf("status is %i, %i, %i\n", status, GetURLHandler::STATUS_ERROR, GetURLHandler::STATUS_COMPLETED);
|
||||
if (status == GetURLHandler::STATUS_ERROR) {
|
||||
printf("Error fetching package!\n");
|
||||
};
|
||||
if (status == GetURLHandler::STATUS_COMPLETED) {
|
||||
|
||||
OSNacl* os = (OSNacl*)OS::get_singleton();
|
||||
os->add_package(pkg_url, package_pending->get_data());
|
||||
};
|
||||
memdelete(package_pending);
|
||||
package_pending = NULL;
|
||||
|
||||
package_loaded = true;
|
||||
|
||||
opengl_context_->MakeContextCurrent(this);
|
||||
nacl_main(init_argc, (const char**)init_argn, (const char**)init_argv);
|
||||
for (uint32_t i=0; i<init_argc; i++) {
|
||||
memfree(init_argn[i]);
|
||||
memfree(init_argv[i]);
|
||||
};
|
||||
};
|
||||
|
||||
if (sd->method == "get_package_status") {
|
||||
|
||||
if (package_loaded) {
|
||||
// post "loaded"
|
||||
PostMessage("loaded");
|
||||
} else if (package_pending == NULL) {
|
||||
// post "none"
|
||||
PostMessage("none");
|
||||
} else {
|
||||
// post package_pending->get_bytes_read();
|
||||
PostMessage(package_pending->get_bytes_read());
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
bool GodotInstance::HandleInputEvent(const pp::InputEvent& event) {
|
||||
|
||||
OSNacl* os = (OSNacl*)OS::get_singleton();
|
||||
os->handle_event(event);
|
||||
return true;
|
||||
};
|
||||
|
||||
class GodotModule : public pp::Module {
|
||||
public:
|
||||
GodotModule() : pp::Module() {}
|
||||
virtual ~GodotModule() {
|
||||
glTerminatePPAPI();
|
||||
}
|
||||
|
||||
/// Create and return a GodotInstance object.
|
||||
/// @param[in] instance a handle to a plug-in instance.
|
||||
/// @return a newly created GodotInstance.
|
||||
/// @note The browser is responsible for calling @a delete when done.
|
||||
virtual pp::Instance* CreateInstance(PP_Instance instance) {
|
||||
printf("CreateInstance! %x\n", instance);
|
||||
return new GodotInstance(instance);
|
||||
}
|
||||
|
||||
/// Called by the browser when the module is first loaded and ready to run.
|
||||
/// This is called once per module, not once per instance of the module on
|
||||
/// the page.
|
||||
virtual bool Init() {
|
||||
printf("GodotModule::init!\n");
|
||||
return glInitializePPAPI(get_browser_interface());
|
||||
}
|
||||
};
|
||||
|
||||
namespace pp {
|
||||
/// Factory function called by the browser when the module is first loaded.
|
||||
/// The browser keeps a singleton of this module. It calls the
|
||||
/// CreateInstance() method on the object you return to make instances. There
|
||||
/// is one instance per <embed> tag on the page. This is the main binding
|
||||
/// point for your NaCl module with the browser.
|
||||
/// @return new GodotModule.
|
||||
/// @note The browser is responsible for deleting returned @a Module.
|
||||
Module* CreateModule() {
|
||||
printf("CreateModule!\n");
|
||||
return new GodotModule();
|
||||
}
|
||||
} // namespace pp
|
|
@ -1,80 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* godot_nacl.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* http://www.godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
#include "os_nacl.h"
|
||||
#include "main/main.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
OSNacl* os_nacl = NULL;
|
||||
|
||||
int nacl_main(int argc, const char** argn, const char** argv) {
|
||||
|
||||
// os is created in GodotModule::Init for the nacl module
|
||||
printf("called with %i args, %p, %p\n", argc, argn, argv);
|
||||
char* nargv[64];
|
||||
int nargc = 1;
|
||||
nargv[0] = (char*)argv[0];
|
||||
for (int i=1; i<argc; i++) {
|
||||
|
||||
printf("arg %i is %s, %s\n", i, argn[i], argv[i]);
|
||||
if (strncmp(argn[i], "arg", 3) == 0) {
|
||||
|
||||
printf("using arg %i, %s\n", nargc, argv[i]);
|
||||
nargv[nargc++] = (char*)argv[i];
|
||||
};
|
||||
};
|
||||
printf("total %i\n", nargc);
|
||||
nargv[nargc] = 0;
|
||||
|
||||
printf("godot_nacl\n");
|
||||
for (int i=0; i<argc; i++) {
|
||||
printf("arg %i: %s\n", i, argv[i]);
|
||||
};
|
||||
|
||||
printf("os created\n");
|
||||
Error err = Main::setup("", nargc-1, &nargv[1]);
|
||||
printf("setup %i\n", err);
|
||||
if (err!=OK)
|
||||
return 255;
|
||||
|
||||
printf("calling start\n");
|
||||
Main::start();
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
|
||||
void nacl_cleanup() {
|
||||
|
||||
Main::cleanup();
|
||||
delete os_nacl;
|
||||
};
|
||||
|
||||
|
|
@ -1,178 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2011 The Native Client Authors. All rights reserved.
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileoverview This file provides a BrowserChecker Javascript class.
|
||||
* Users can create a BrowserChecker object, invoke checkBrowser(|version|),
|
||||
* and then use getIsValidBrowser() and getBrowserSupportStatus()
|
||||
* to determine if the browser version is greater than |version|
|
||||
* and if the Native Client plugin is found.
|
||||
*/
|
||||
|
||||
// Create a namespace object
|
||||
var browser_version = browser_version || {};
|
||||
|
||||
/**
|
||||
* Class to provide checking for version and NativeClient.
|
||||
* @param {integer} arg1 An argument that indicates major version of Chrome we
|
||||
* require, such as 14.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Constructor for the BrowserChecker. Sets the major version of
|
||||
* Chrome that is required to |minChromeVersion|.
|
||||
* @param minChromeVersion The earliest major version of chrome that
|
||||
* is supported. If the Chrome browser version is less than
|
||||
* |minChromeVersion| then |isValidBrowswer| will be set to false.
|
||||
* @param opt_maxChromeVersion Ignored. Retained for backwards compatibility.
|
||||
* @param appVersion The application version string.
|
||||
* @param plugins The plugins that exist in the browser.
|
||||
* @constructor
|
||||
*/
|
||||
browser_version.BrowserChecker = function(minChromeVersion,
|
||||
appVersion, plugins,
|
||||
opt_maxChromeVersion) {
|
||||
/**
|
||||
* Version specified by the user. This class looks to see if the browser
|
||||
* version is >= |minChromeVersion_|.
|
||||
* @type {integer}
|
||||
* @private
|
||||
*/
|
||||
this.minChromeVersion_ = minChromeVersion;
|
||||
|
||||
/**
|
||||
* List of Browser plugin objects.
|
||||
* @type {Ojbect array}
|
||||
* @private
|
||||
*/
|
||||
this.plugins_ = plugins;
|
||||
|
||||
/**
|
||||
* Application version string from the Browser.
|
||||
* @type {integer}
|
||||
* @private
|
||||
*/
|
||||
this.appVersion_ = appVersion;
|
||||
|
||||
/**
|
||||
* Flag used to indicate if the browser has Native Client and is if the
|
||||
* browser version is recent enough.
|
||||
* @type {boolean}
|
||||
* @private
|
||||
*/
|
||||
this.isValidBrowser_ = false;
|
||||
|
||||
/**
|
||||
* Actual major version of Chrome -- found by querying the browser.
|
||||
* @type {integer}
|
||||
* @private
|
||||
*/
|
||||
this.chromeVersion_ = null;
|
||||
|
||||
/**
|
||||
* Browser support status. This allows the user to get a detailed status
|
||||
* rather than using this.browserSupportMessage.
|
||||
*/
|
||||
this.browserSupportStatus_ =
|
||||
browser_version.BrowserChecker.StatusValues.UNKNOWN;
|
||||
}
|
||||
|
||||
/**
|
||||
* The values used for BrowserChecker status to indicate success or
|
||||
* a specific error.
|
||||
* @enum {id}
|
||||
*/
|
||||
browser_version.BrowserChecker.StatusValues = {
|
||||
UNKNOWN: 0,
|
||||
NACL_ENABLED: 1,
|
||||
UNKNOWN_BROWSER: 2,
|
||||
CHROME_VERSION_TOO_OLD: 3,
|
||||
NACL_NOT_ENABLED: 4,
|
||||
NOT_USING_SERVER: 5
|
||||
};
|
||||
|
||||
/**
|
||||
* Determines if the plugin with name |name| exists in the browser.
|
||||
* @param {string} name The name of the plugin.
|
||||
* @param {Object array} plugins The plugins in this browser.
|
||||
* @return {bool} |true| if the plugin is found.
|
||||
*/
|
||||
browser_version.BrowserChecker.prototype.pluginExists = function(name,
|
||||
plugins) {
|
||||
for (var index=0; index < plugins.length; index++) {
|
||||
var plugin = this.plugins_[index];
|
||||
var plugin_name = plugin['name'];
|
||||
// If the plugin is not found, you can use the Javascript console
|
||||
// to see the names of the plugins that were found when debugging.
|
||||
if (plugin_name.indexOf(name) != -1) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns browserSupportStatus_ which indicates if the browser supports
|
||||
* Native Client. Values are defined as literals in
|
||||
* browser_version.BrowserChecker.StatusValues.
|
||||
* @ return {int} Level of NaCl support.
|
||||
*/
|
||||
browser_version.BrowserChecker.prototype.getBrowserSupportStatus = function() {
|
||||
return this.browserSupportStatus_;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns isValidBrowser (true/false) to indicate if the browser supports
|
||||
* Native Client.
|
||||
* @ return {bool} If this browser has NativeClient and correct version.
|
||||
*/
|
||||
browser_version.BrowserChecker.prototype.getIsValidBrowser = function() {
|
||||
return this.isValidBrowser_;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks to see if this browser can support Native Client applications.
|
||||
* For Chrome browsers, checks to see if the "Native Client" plugin is
|
||||
* enabled.
|
||||
*/
|
||||
browser_version.BrowserChecker.prototype.checkBrowser = function() {
|
||||
var versionPatt = /Chrome\/(\d+)\.(\d+)\.(\d+)\.(\d+)/;
|
||||
var result = this.appVersion_.match(versionPatt);
|
||||
|
||||
// |result| stores the Chrome version number.
|
||||
if (!result) {
|
||||
this.isValidBrowser_ = false;
|
||||
this.browserSupportStatus_ =
|
||||
browser_version.BrowserChecker.StatusValues.UNKNOWN_BROWSER;
|
||||
} else {
|
||||
this.chromeVersion_ = result[1];
|
||||
// We know we have Chrome, check version and/or plugin named Native Client
|
||||
if (this.chromeVersion_ >= this.minChromeVersion_) {
|
||||
var found_nacl = this.pluginExists('Native Client', this.plugins_);
|
||||
if (found_nacl) {
|
||||
this.isValidBrowser_ = true;
|
||||
this.browserSupportStatus_ =
|
||||
browser_version.BrowserChecker.StatusValues.NACL_ENABLED;
|
||||
} else {
|
||||
this.isValidBrowser_ = false;
|
||||
this.browserSupportStatus_ =
|
||||
browser_version.BrowserChecker.StatusValues.NACL_NOT_ENABLED;
|
||||
}
|
||||
} else {
|
||||
// We are in a version that is less than |minChromeVersion_|
|
||||
this.isValidBrowser_ = false;
|
||||
this.browserSupportStatus_ =
|
||||
browser_version.BrowserChecker.StatusValues.CHROME_VERSION_TOO_OLD;
|
||||
}
|
||||
}
|
||||
var my_protocol = window.location.protocol;
|
||||
if (my_protocol.indexOf('file') == 0) {
|
||||
this.isValidBrowser_ = false;
|
||||
this.browserSupportStatus_ =
|
||||
browser_version.BrowserChecker.StatusValues.NOT_USING_SERVER;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
{
|
||||
"program": {
|
||||
"x86-64": {"url": "godot_nacl.x86_64.nexe"},
|
||||
"x86-32": {"url": "godot_nacl.i686.nexe"}
|
||||
}
|
||||
}
|
Binary file not shown.
Before Width: | Height: | Size: 11 KiB |
Binary file not shown.
Before Width: | Height: | Size: 828 B |
|
@ -1,258 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<!--
|
||||
Copyright (c) 2011 The Native Client Authors. All rights reserved.
|
||||
Use of this source code is governed by a BSD-style license that can be
|
||||
found in the LICENSE file.
|
||||
-->
|
||||
<head>
|
||||
<title>Load Progress Example</title>
|
||||
<script type="text/javascript" src="check_browser.js"></script>
|
||||
<script type="text/javascript">
|
||||
// Check for Native Client support in the browser before the DOM loads.
|
||||
var isValidBrowser = false;
|
||||
var browserSupportStatus = 0;
|
||||
var checker = new browser_version.BrowserChecker(
|
||||
14, // Minumum Chrome version.
|
||||
navigator["appVersion"],
|
||||
navigator["plugins"]);
|
||||
checker.checkBrowser();
|
||||
|
||||
loadProgressModule = null; // Global application object.
|
||||
statusText = 'NO-STATUS';
|
||||
|
||||
isValidBrowser = checker.getIsValidBrowser();
|
||||
browserSupportStatus = checker.getBrowserSupportStatus();
|
||||
|
||||
// Handler that gets called when the NaCl module starts loading. This
|
||||
// event is always triggered when an <EMBED> tag has a MIME type of
|
||||
// application/x-nacl.
|
||||
function moduleDidStartLoad() {
|
||||
appendToEventLog('loadstart');
|
||||
}
|
||||
|
||||
// Progress event handler. |event| contains a couple of interesting
|
||||
// properties that are used in this example:
|
||||
// total The size of the NaCl module in bytes. Note that this value
|
||||
// is 0 until |lengthComputable| is true. In particular, this
|
||||
// value is 0 for the first 'progress' event.
|
||||
// loaded The number of bytes loaded so far.
|
||||
// lengthComputable A boolean indicating that the |total| field
|
||||
// represents a valid length.
|
||||
//
|
||||
// event The ProgressEvent that triggered this handler.
|
||||
function moduleLoadProgress(event) {
|
||||
var loadPercent = 0.0;
|
||||
var loadPercentString;
|
||||
if (event.lengthComputable && event.total > 0) {
|
||||
loadPercent = event.loaded / event.total * 100.0;
|
||||
loadPercentString = loadPercent + '%';
|
||||
} else {
|
||||
// The total length is not yet known.
|
||||
loadPercent = -1.0;
|
||||
loadPercentString = 'Computing...';
|
||||
}
|
||||
//appendToEventLog('progress: ' + loadPercentString + ' (' + event.loaded + ' of ' + event.total + ' bytes)');
|
||||
updateStatus("Loading module : "+ Math.floor(event.loaded / event.total * 100.0) + "% complete");
|
||||
}
|
||||
|
||||
// Handler that gets called if an error occurred while loading the NaCl
|
||||
// module. Note that the event does not carry any meaningful data about
|
||||
// the error, you have to check lastError on the <EMBED> element to find
|
||||
// out what happened.
|
||||
function moduleLoadError() {
|
||||
appendToEventLog('error: ' + loadProgressModule.lastError);
|
||||
}
|
||||
|
||||
// Handler that gets called if the NaCl module load is aborted.
|
||||
function moduleLoadAbort() {
|
||||
appendToEventLog('abort');
|
||||
}
|
||||
|
||||
// When the NaCl module has loaded indicate success.
|
||||
function moduleDidLoad() {
|
||||
loadProgressModule = document.getElementById('load_progress');
|
||||
appendToEventLog('load');
|
||||
updateStatus('SUCCESS');
|
||||
}
|
||||
|
||||
function check_dl_status() {
|
||||
var module = document.getElementById('load_progress');
|
||||
module.postMessage("get_package_status");
|
||||
module.postMessage(0);
|
||||
};
|
||||
|
||||
// Handler that gets called when the NaCl module loading has completed.
|
||||
// You will always get one of these events, regardless of whether the NaCl
|
||||
// module loaded successfully or not. For example, if there is an error
|
||||
// during load, you will get an 'error' event and a 'loadend' event. Note
|
||||
// that if the NaCl module loads successfully, you will get both a 'load'
|
||||
// event and a 'loadend' event.
|
||||
function moduleDidEndLoad() {
|
||||
appendToEventLog('loadend');
|
||||
var lastError = event.target.lastError;
|
||||
if (lastError == undefined || lastError.length == 0) {
|
||||
lastError = '<none>';
|
||||
window.setTimeout(check_dl_status, 1000);
|
||||
}
|
||||
appendToEventLog('lastError: ' + lastError);
|
||||
}
|
||||
|
||||
|
||||
// Handle a message coming from the NaCl module.
|
||||
function handleMessage(message_event) {
|
||||
var data = message_event.data;
|
||||
if (data == "loaded") {
|
||||
updateStatus("Data Loaded!");
|
||||
} else if (data == "none") {
|
||||
// nothing
|
||||
updateStatus("Downloading package: connecting");
|
||||
window.setTimeout(check_dl_status, 1000);
|
||||
} else {
|
||||
updateStatus("Downloading package: " + data + " bytes");
|
||||
window.setTimeout(check_dl_status, 1000);
|
||||
};
|
||||
}
|
||||
|
||||
// Set the global status message. Updates the 'status_field' element with
|
||||
// the new text.
|
||||
// opt_message The message text. If this is null or undefined, then
|
||||
// attempt to set the element with id 'status_field' to the value of
|
||||
// |statusText|.
|
||||
function updateStatus(opt_message) {
|
||||
if (opt_message)
|
||||
statusText = opt_message;
|
||||
var statusField = document.getElementById('status_field');
|
||||
if (statusField) {
|
||||
statusField.innerHTML = statusText;
|
||||
}
|
||||
}
|
||||
|
||||
// Append an event name to the 'event_log_field' element. Event names
|
||||
// are separated by a <br> tag so they get listed one per line.
|
||||
// logMessage The message to append to the log.
|
||||
function appendToEventLog(logMessage) {
|
||||
var eventLogField = document.getElementById('event_log_field');
|
||||
if (eventLogField.innerHTML.length == 0) {
|
||||
eventLogField.innerHTML = logMessage;
|
||||
} else {
|
||||
eventLogField.innerHTML = eventLogField.innerHTML +
|
||||
'<br />' +
|
||||
logMessage;
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body bgcolor=#000000>
|
||||
|
||||
<font color=#FFFFFF>
|
||||
|
||||
<h1>Native Client Load Event Example</h1>
|
||||
|
||||
<h2>Status</h2>
|
||||
<div id="status_field">NO-STATUS</div>
|
||||
|
||||
<div id="listener">
|
||||
<script type="text/javascript">
|
||||
var listener = document.getElementById('listener');
|
||||
listener.addEventListener('loadstart', moduleDidStartLoad, true);
|
||||
listener.addEventListener('progress', moduleLoadProgress, true);
|
||||
listener.addEventListener('error', moduleLoadError, true);
|
||||
listener.addEventListener('abort', moduleLoadAbort, true);
|
||||
listener.addEventListener('load', moduleDidLoad, true);
|
||||
listener.addEventListener('loadend', moduleDidEndLoad, true);
|
||||
listener.addEventListener('message', handleMessage, true);
|
||||
|
||||
switch (browserSupportStatus) {
|
||||
case browser_version.BrowserChecker.StatusValues.NACL_ENABLED:
|
||||
appendToEventLog('Native Client plugin enabled.');
|
||||
break;
|
||||
case browser_version.BrowserChecker.StatusValues.UNKNOWN_BROWSER:
|
||||
updateStatus('UNKNOWN BROWSER');
|
||||
break;
|
||||
case browser_version.BrowserChecker.StatusValues.CHROME_VERSION_TOO_OLD:
|
||||
appendToEventLog(
|
||||
'Chrome too old: You must use Chrome version 14 or later.');
|
||||
updateStatus('NEED CHROME 14 OR LATER');
|
||||
break;
|
||||
case browser_version.BrowserChecker.StatusValues.NACL_NOT_ENABLED:
|
||||
appendToEventLog(
|
||||
'NaCl disabled: Native Client is not enabled.<br>' +
|
||||
'Please go to <b>chrome://plugins</b> and enable Native Client ' +
|
||||
'plugin.');
|
||||
updateStatus('NaCl NOT ENABLED');
|
||||
break;
|
||||
case browser_version.BrowserChecker.StatusValues.NOT_USING_SERVER:
|
||||
appendToEventLog(
|
||||
'file: URL detected, please use a web server to host Native ' +
|
||||
'Client applications.');
|
||||
updateStatus('NaCl NOT ENABLED');
|
||||
default:
|
||||
appendToEventLog('Unknown error: Unable to detect browser and/or ' +
|
||||
'Native Client support.');
|
||||
updateStatus('UNKNOWN ERROR');
|
||||
break;
|
||||
}
|
||||
</script>
|
||||
|
||||
<!-- Load the published .nexe. This includes the 'src' attribute which
|
||||
shows how to load multi-architecture modules. Each entry in the "nexes"
|
||||
object in the .nmf manifest file is a key-value pair: the key is the runtime
|
||||
('x86-32', 'x86-64', etc.); the value is a URL for the desired NaCl module.
|
||||
To load the debug versions of your .nexes, set the 'src' attribute to the
|
||||
_dbg.nmf version of the manifest file.
|
||||
|
||||
Note: The <EMBED> element is wrapped inside a <DIV>, which has both a 'load'
|
||||
and a 'message' event listener attached. This wrapping method is used
|
||||
instead of attaching the event listeners directly to the <EMBED> element to
|
||||
ensure that the listeners are active before the NaCl module 'load' event
|
||||
fires. This also allows you to use PPB_Messaging.PostMessage() (in C) or
|
||||
pp::Instance.PostMessage() (in C++) from within the initialization code in
|
||||
your NaCl module.
|
||||
-->
|
||||
<embed name="nacl_module"
|
||||
id="load_progress"
|
||||
width=1024 height=600
|
||||
src="godot_nacl.nmf"
|
||||
type="application/x-nacl"
|
||||
package="data.pcz"
|
||||
arg1="-path" arg2="."
|
||||
no_arg1="-test" no_arg2="gui" />
|
||||
|
||||
<script type="text/javascript">
|
||||
loadProgressModule = document.getElementById('load_progress');
|
||||
// Futher diagnose NaCl loading.
|
||||
if (loadProgressModule == null ||
|
||||
typeof loadProgressModule.readyState == 'undefined') {
|
||||
switch (browserSupportStatus) {
|
||||
case browser_version.BrowserChecker.StatusValues.NACL_ENABLED:
|
||||
// The NaCl plugin is enabled and running, it's likely that the flag
|
||||
// isn't set.
|
||||
appendToEventLog(
|
||||
'NaCl flag disabled: The Native Client flag is not enabled.<br>' +
|
||||
'Please go to <b>chrome://flags</b> enable Native Client and ' +
|
||||
'relaunch your browser. See also: ' +
|
||||
'<a href="http://code.google.com/chrome/nativeclient/docs/' +
|
||||
'running.html">Running Web Applications that Use Native Client' +
|
||||
'</a>');
|
||||
updateStatus('NaCl NOT ENABLED');
|
||||
break;
|
||||
case browser_version.BrowserChecker.StatusValues.UNKNOWN_BROWSER:
|
||||
appendToEventLog('Native Client applications are not supported by ' +
|
||||
'this browser.');
|
||||
break;
|
||||
default:
|
||||
appendToEventLog('Unknown error when loading Native Client ' +
|
||||
'application.');
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</div>
|
||||
|
||||
<h2>Event Log</h2>
|
||||
<div id="event_log_field">event log?</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
{
|
||||
"name": "Capsuleman's Castle Adventure",
|
||||
"description": "Capsuleman's Castle Adventure",
|
||||
"version": "1",
|
||||
"app": {
|
||||
"launch": {
|
||||
"local_path": "index.html"
|
||||
}
|
||||
},
|
||||
"icons": {
|
||||
"16": "icon_16.png",
|
||||
"128": "icon_128.png"
|
||||
},
|
||||
"permissions": [
|
||||
"unlimitedStorage",
|
||||
"notifications",
|
||||
"experimental"
|
||||
]
|
||||
}
|
Binary file not shown.
Before Width: | Height: | Size: 2.6 KiB |
|
@ -1,422 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* nacl_keycodes.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* http://www.godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
* Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com. All rights reserved.
|
||||
* Copyright (C) 2008, 2009 Google Inc.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF USE, DATA, OR
|
||||
* PROFITS, OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef BASE_KEYBOARD_CODES_POSIX_H_
|
||||
#define BASE_KEYBOARD_CODES_POSIX_H_
|
||||
#pragma once
|
||||
|
||||
#include "core/os/keyboard.h"
|
||||
|
||||
enum {
|
||||
VKEY_BACK = 0x08,
|
||||
VKEY_TAB = 0x09,
|
||||
VKEY_CLEAR = 0x0C,
|
||||
VKEY_RETURN = 0x0D,
|
||||
VKEY_SHIFT = 0x10,
|
||||
VKEY_CONTROL = 0x11,
|
||||
VKEY_MENU = 0x12,
|
||||
VKEY_PAUSE = 0x13,
|
||||
VKEY_CAPITAL = 0x14,
|
||||
VKEY_KANA = 0x15,
|
||||
VKEY_HANGUL = 0x15,
|
||||
VKEY_JUNJA = 0x17,
|
||||
VKEY_FINAL = 0x18,
|
||||
VKEY_HANJA = 0x19,
|
||||
VKEY_KANJI = 0x19,
|
||||
VKEY_ESCAPE = 0x1B,
|
||||
VKEY_CONVERT = 0x1C,
|
||||
VKEY_NONCONVERT = 0x1D,
|
||||
VKEY_ACCEPT = 0x1E,
|
||||
VKEY_MODECHANGE = 0x1F,
|
||||
VKEY_SPACE = 0x20,
|
||||
VKEY_PRIOR = 0x21,
|
||||
VKEY_NEXT = 0x22,
|
||||
VKEY_END = 0x23,
|
||||
VKEY_HOME = 0x24,
|
||||
VKEY_LEFT = 0x25,
|
||||
VKEY_UP = 0x26,
|
||||
VKEY_RIGHT = 0x27,
|
||||
VKEY_DOWN = 0x28,
|
||||
VKEY_SELECT = 0x29,
|
||||
VKEY_PRINT = 0x2A,
|
||||
VKEY_EXECUTE = 0x2B,
|
||||
VKEY_SNAPSHOT = 0x2C,
|
||||
VKEY_INSERT = 0x2D,
|
||||
VKEY_DELETE = 0x2E,
|
||||
VKEY_HELP = 0x2F,
|
||||
VKEY_0 = 0x30,
|
||||
VKEY_1 = 0x31,
|
||||
VKEY_2 = 0x32,
|
||||
VKEY_3 = 0x33,
|
||||
VKEY_4 = 0x34,
|
||||
VKEY_5 = 0x35,
|
||||
VKEY_6 = 0x36,
|
||||
VKEY_7 = 0x37,
|
||||
VKEY_8 = 0x38,
|
||||
VKEY_9 = 0x39,
|
||||
VKEY_A = 0x41,
|
||||
VKEY_B = 0x42,
|
||||
VKEY_C = 0x43,
|
||||
VKEY_D = 0x44,
|
||||
VKEY_E = 0x45,
|
||||
VKEY_F = 0x46,
|
||||
VKEY_G = 0x47,
|
||||
VKEY_H = 0x48,
|
||||
VKEY_I = 0x49,
|
||||
VKEY_J = 0x4A,
|
||||
VKEY_K = 0x4B,
|
||||
VKEY_L = 0x4C,
|
||||
VKEY_M = 0x4D,
|
||||
VKEY_N = 0x4E,
|
||||
VKEY_O = 0x4F,
|
||||
VKEY_P = 0x50,
|
||||
VKEY_Q = 0x51,
|
||||
VKEY_R = 0x52,
|
||||
VKEY_S = 0x53,
|
||||
VKEY_T = 0x54,
|
||||
VKEY_U = 0x55,
|
||||
VKEY_V = 0x56,
|
||||
VKEY_W = 0x57,
|
||||
VKEY_X = 0x58,
|
||||
VKEY_Y = 0x59,
|
||||
VKEY_Z = 0x5A,
|
||||
VKEY_LWIN = 0x5B,
|
||||
VKEY_COMMAND = VKEY_LWIN, // Provide the Mac name for convenience.
|
||||
VKEY_RWIN = 0x5C,
|
||||
VKEY_APPS = 0x5D,
|
||||
VKEY_SLEEP = 0x5F,
|
||||
VKEY_NUMPAD0 = 0x60,
|
||||
VKEY_NUMPAD1 = 0x61,
|
||||
VKEY_NUMPAD2 = 0x62,
|
||||
VKEY_NUMPAD3 = 0x63,
|
||||
VKEY_NUMPAD4 = 0x64,
|
||||
VKEY_NUMPAD5 = 0x65,
|
||||
VKEY_NUMPAD6 = 0x66,
|
||||
VKEY_NUMPAD7 = 0x67,
|
||||
VKEY_NUMPAD8 = 0x68,
|
||||
VKEY_NUMPAD9 = 0x69,
|
||||
VKEY_MULTIPLY = 0x6A,
|
||||
VKEY_ADD = 0x6B,
|
||||
VKEY_SEPARATOR = 0x6C,
|
||||
VKEY_SUBTRACT = 0x6D,
|
||||
VKEY_DECIMAL = 0x6E,
|
||||
VKEY_DIVIDE = 0x6F,
|
||||
VKEY_F1 = 0x70,
|
||||
VKEY_F2 = 0x71,
|
||||
VKEY_F3 = 0x72,
|
||||
VKEY_F4 = 0x73,
|
||||
VKEY_F5 = 0x74,
|
||||
VKEY_F6 = 0x75,
|
||||
VKEY_F7 = 0x76,
|
||||
VKEY_F8 = 0x77,
|
||||
VKEY_F9 = 0x78,
|
||||
VKEY_F10 = 0x79,
|
||||
VKEY_F11 = 0x7A,
|
||||
VKEY_F12 = 0x7B,
|
||||
VKEY_F13 = 0x7C,
|
||||
VKEY_F14 = 0x7D,
|
||||
VKEY_F15 = 0x7E,
|
||||
VKEY_F16 = 0x7F,
|
||||
VKEY_F17 = 0x80,
|
||||
VKEY_F18 = 0x81,
|
||||
VKEY_F19 = 0x82,
|
||||
VKEY_F20 = 0x83,
|
||||
VKEY_F21 = 0x84,
|
||||
VKEY_F22 = 0x85,
|
||||
VKEY_F23 = 0x86,
|
||||
VKEY_F24 = 0x87,
|
||||
VKEY_NUMLOCK = 0x90,
|
||||
VKEY_SCROLL = 0x91,
|
||||
VKEY_LSHIFT = 0xA0,
|
||||
VKEY_RSHIFT = 0xA1,
|
||||
VKEY_LCONTROL = 0xA2,
|
||||
VKEY_RCONTROL = 0xA3,
|
||||
VKEY_LMENU = 0xA4,
|
||||
VKEY_RMENU = 0xA5,
|
||||
VKEY_BROWSER_BACK = 0xA6,
|
||||
VKEY_BROWSER_FORWARD = 0xA7,
|
||||
VKEY_BROWSER_REFRESH = 0xA8,
|
||||
VKEY_BROWSER_STOP = 0xA9,
|
||||
VKEY_BROWSER_SEARCH = 0xAA,
|
||||
VKEY_BROWSER_FAVORITES = 0xAB,
|
||||
VKEY_BROWSER_HOME = 0xAC,
|
||||
VKEY_VOLUME_MUTE = 0xAD,
|
||||
VKEY_VOLUME_DOWN = 0xAE,
|
||||
VKEY_VOLUME_UP = 0xAF,
|
||||
VKEY_MEDIA_NEXT_TRACK = 0xB0,
|
||||
VKEY_MEDIA_PREV_TRACK = 0xB1,
|
||||
VKEY_MEDIA_STOP = 0xB2,
|
||||
VKEY_MEDIA_PLAY_PAUSE = 0xB3,
|
||||
VKEY_MEDIA_LAUNCH_MAIL = 0xB4,
|
||||
VKEY_MEDIA_LAUNCH_MEDIA_SELECT = 0xB5,
|
||||
VKEY_MEDIA_LAUNCH_APP1 = 0xB6,
|
||||
VKEY_MEDIA_LAUNCH_APP2 = 0xB7,
|
||||
VKEY_OEM_1 = 0xBA,
|
||||
VKEY_OEM_PLUS = 0xBB,
|
||||
VKEY_OEM_COMMA = 0xBC,
|
||||
VKEY_OEM_MINUS = 0xBD,
|
||||
VKEY_OEM_PERIOD = 0xBE,
|
||||
VKEY_OEM_2 = 0xBF,
|
||||
VKEY_OEM_3 = 0xC0,
|
||||
VKEY_OEM_4 = 0xDB,
|
||||
VKEY_OEM_5 = 0xDC,
|
||||
VKEY_OEM_6 = 0xDD,
|
||||
VKEY_OEM_7 = 0xDE,
|
||||
VKEY_OEM_8 = 0xDF,
|
||||
VKEY_OEM_102 = 0xE2,
|
||||
VKEY_PROCESSKEY = 0xE5,
|
||||
VKEY_PACKET = 0xE7,
|
||||
VKEY_ATTN = 0xF6,
|
||||
VKEY_CRSEL = 0xF7,
|
||||
VKEY_EXSEL = 0xF8,
|
||||
VKEY_EREOF = 0xF9,
|
||||
VKEY_PLAY = 0xFA,
|
||||
VKEY_ZOOM = 0xFB,
|
||||
VKEY_NONAME = 0xFC,
|
||||
VKEY_PA1 = 0xFD,
|
||||
VKEY_OEM_CLEAR = 0xFE,
|
||||
VKEY_UNKNOWN = 0
|
||||
};
|
||||
|
||||
static uint32_t godot_key(uint32_t p_key, bool& is_char) {
|
||||
|
||||
is_char = false;
|
||||
|
||||
switch (p_key) {
|
||||
|
||||
case VKEY_BACK: return KEY_BACKSPACE;
|
||||
case VKEY_TAB: return KEY_TAB;
|
||||
case VKEY_CLEAR: return KEY_CLEAR;
|
||||
case VKEY_RETURN: return KEY_RETURN;
|
||||
case VKEY_SHIFT: return KEY_SHIFT;
|
||||
case VKEY_CONTROL: return KEY_CONTROL;
|
||||
case VKEY_MENU: return KEY_MENU;
|
||||
case VKEY_PAUSE: return KEY_PAUSE;
|
||||
// case VKEY_CAPITAL: return KEY_CAPITAL;
|
||||
// case VKEY_KANA: return KEY_KANA;
|
||||
// case VKEY_HANGUL: return KEY_HANGUL;
|
||||
// case VKEY_JUNJA: return KEY_JUNJA;
|
||||
// case VKEY_FINAL: return KEY_FINAL;
|
||||
// case VKEY_HANJA: return KEY_HANJA;
|
||||
// case VKEY_KANJI: return KEY_KANJI;
|
||||
case VKEY_ESCAPE: return KEY_ESCAPE;
|
||||
// case VKEY_CONVERT: return KEY_CONVERT;
|
||||
// case VKEY_NONCONVERT: return KEY_NONCONVERT;
|
||||
// case VKEY_ACCEPT: return KEY_ACCEPT;
|
||||
// case VKEY_MODECHANGE: return KEY_MODECHANGE;
|
||||
// case VKEY_PRIOR: return KEY_PRIOR;
|
||||
// case VKEY_NEXT: return KEY_NEXT;
|
||||
case VKEY_END: return KEY_END;
|
||||
case VKEY_HOME: return KEY_HOME;
|
||||
case VKEY_LEFT: return KEY_LEFT;
|
||||
case VKEY_UP: return KEY_UP;
|
||||
case VKEY_RIGHT: return KEY_RIGHT;
|
||||
case VKEY_DOWN: return KEY_DOWN;
|
||||
// case VKEY_SELECT: return KEY_SELECT;
|
||||
case VKEY_PRINT: return KEY_PRINT;
|
||||
// case VKEY_EXECUTE: return KEY_EXECUTE;
|
||||
// case VKEY_SNAPSHOT: return KEY_SNAPSHOT;
|
||||
case VKEY_INSERT: return KEY_INSERT;
|
||||
case VKEY_DELETE: return KEY_DELETE;
|
||||
case VKEY_HELP: return KEY_HELP;
|
||||
// case VKEY_LWIN: return KEY_LWIN;
|
||||
// case VKEY_RWIN: return KEY_RWIN;
|
||||
// case VKEY_APPS: return KEY_APPS;
|
||||
// case VKEY_SLEEP: return KEY_SLEEP;
|
||||
case VKEY_NUMPAD0: return KEY_KP_0;
|
||||
case VKEY_NUMPAD1: return KEY_KP_1;
|
||||
case VKEY_NUMPAD2: return KEY_KP_2;
|
||||
case VKEY_NUMPAD3: return KEY_KP_3;
|
||||
case VKEY_NUMPAD4: return KEY_KP_4;
|
||||
case VKEY_NUMPAD5: return KEY_KP_5;
|
||||
case VKEY_NUMPAD6: return KEY_KP_6;
|
||||
case VKEY_NUMPAD7: return KEY_KP_7;
|
||||
case VKEY_NUMPAD8: return KEY_KP_8;
|
||||
case VKEY_NUMPAD9: return KEY_KP_9;
|
||||
case VKEY_MULTIPLY: return KEY_KP_MULTIPLY;
|
||||
case VKEY_ADD: return KEY_KP_ADD;
|
||||
// case VKEY_SEPARATOR: return KEY_SEPARATOR;
|
||||
case VKEY_SUBTRACT: return KEY_KP_SUBTRACT;
|
||||
case VKEY_DECIMAL: return KEY_KP_PERIOD;
|
||||
case VKEY_DIVIDE: return KEY_KP_DIVIDE;
|
||||
case VKEY_F1: return KEY_F1;
|
||||
case VKEY_F2: return KEY_F2;
|
||||
case VKEY_F3: return KEY_F3;
|
||||
case VKEY_F4: return KEY_F4;
|
||||
case VKEY_F5: return KEY_F5;
|
||||
case VKEY_F6: return KEY_F6;
|
||||
case VKEY_F7: return KEY_F7;
|
||||
case VKEY_F8: return KEY_F8;
|
||||
case VKEY_F9: return KEY_F9;
|
||||
case VKEY_F10: return KEY_F10;
|
||||
case VKEY_F11: return KEY_F11;
|
||||
case VKEY_F12: return KEY_F12;
|
||||
case VKEY_F13: return KEY_F13;
|
||||
case VKEY_F14: return KEY_F14;
|
||||
case VKEY_F15: return KEY_F15;
|
||||
case VKEY_F16: return KEY_F16;
|
||||
/*
|
||||
case VKEY_F17: return KEY_F17;
|
||||
case VKEY_F18: return KEY_F18;
|
||||
case VKEY_F19: return KEY_F19;
|
||||
case VKEY_F20: return KEY_F20;
|
||||
case VKEY_F21: return KEY_F21;
|
||||
case VKEY_F22: return KEY_F22;
|
||||
case VKEY_F23: return KEY_F23;
|
||||
case VKEY_F24: return KEY_F24;
|
||||
*/
|
||||
case VKEY_NUMLOCK: return KEY_NUMLOCK;
|
||||
case VKEY_SCROLL: return KEY_SCROLLLOCK;
|
||||
case VKEY_LSHIFT: return KEY_SHIFT;
|
||||
case VKEY_RSHIFT: return KEY_SHIFT;
|
||||
case VKEY_LCONTROL: return KEY_CONTROL;
|
||||
case VKEY_RCONTROL: return KEY_CONTROL;
|
||||
case VKEY_LMENU: return KEY_MENU;
|
||||
case VKEY_RMENU: return KEY_MENU;
|
||||
case VKEY_BROWSER_BACK: return KEY_BACK;
|
||||
case VKEY_BROWSER_FORWARD: return KEY_FORWARD;
|
||||
case VKEY_BROWSER_REFRESH: return KEY_REFRESH;
|
||||
case VKEY_BROWSER_STOP: return KEY_STOP;
|
||||
case VKEY_BROWSER_SEARCH: return KEY_SEARCH;
|
||||
case VKEY_BROWSER_FAVORITES: return KEY_FAVORITES;
|
||||
case VKEY_BROWSER_HOME: return KEY_HOMEPAGE;
|
||||
case VKEY_VOLUME_MUTE: return KEY_VOLUMEMUTE;
|
||||
case VKEY_VOLUME_DOWN: return KEY_VOLUMEDOWN;
|
||||
case VKEY_VOLUME_UP: return KEY_VOLUMEUP;
|
||||
case VKEY_MEDIA_NEXT_TRACK: return KEY_MEDIANEXT;
|
||||
case VKEY_MEDIA_PREV_TRACK: return KEY_MEDIAPREVIOUS;
|
||||
case VKEY_MEDIA_STOP: return KEY_MEDIASTOP;
|
||||
case VKEY_MEDIA_PLAY_PAUSE: return KEY_MEDIAPLAY;
|
||||
case VKEY_MEDIA_LAUNCH_MAIL: return KEY_LAUNCHMAIL;
|
||||
case VKEY_MEDIA_LAUNCH_MEDIA_SELECT: return KEY_LAUNCHMEDIA; // FUCKING USELESS KEYS, HOW DO THEY WORK?
|
||||
case VKEY_MEDIA_LAUNCH_APP1: return KEY_LAUNCH0;
|
||||
case VKEY_MEDIA_LAUNCH_APP2: return KEY_LAUNCH0;
|
||||
// case VKEY_OEM_102: return KEY_OEM_102;
|
||||
// case VKEY_PROCESSKEY: return KEY_PROCESSKEY;
|
||||
// case VKEY_PACKET: return KEY_PACKET;
|
||||
// case VKEY_ATTN: return KEY_ATTN;
|
||||
// case VKEY_CRSEL: return KEY_CRSEL;
|
||||
// case VKEY_EXSEL: return KEY_EXSEL;
|
||||
// case VKEY_EREOF: return KEY_EREOF;
|
||||
// case VKEY_PLAY: return KEY_PLAY;
|
||||
// case VKEY_ZOOM: return KEY_ZOOM;
|
||||
// case VKEY_NONAME: return KEY_NONAME;
|
||||
// case VKEY_PA1: return KEY_PA1;
|
||||
// case VKEY_OEM_CLEAR: return KEY_OEM_CLEAR;
|
||||
|
||||
default: break;
|
||||
};
|
||||
|
||||
is_char = true;
|
||||
|
||||
switch (p_key) {
|
||||
|
||||
case VKEY_SPACE: return KEY_SPACE;
|
||||
case VKEY_0: return KEY_0;
|
||||
case VKEY_1: return KEY_1;
|
||||
case VKEY_2: return KEY_2;
|
||||
case VKEY_3: return KEY_3;
|
||||
case VKEY_4: return KEY_4;
|
||||
case VKEY_5: return KEY_5;
|
||||
case VKEY_6: return KEY_6;
|
||||
case VKEY_7: return KEY_7;
|
||||
case VKEY_8: return KEY_8;
|
||||
case VKEY_9: return KEY_9;
|
||||
case VKEY_A: return KEY_A;
|
||||
case VKEY_B: return KEY_B;
|
||||
case VKEY_C: return KEY_C;
|
||||
case VKEY_D: return KEY_D;
|
||||
case VKEY_E: return KEY_E;
|
||||
case VKEY_F: return KEY_F;
|
||||
case VKEY_G: return KEY_G;
|
||||
case VKEY_H: return KEY_H;
|
||||
case VKEY_I: return KEY_I;
|
||||
case VKEY_J: return KEY_J;
|
||||
case VKEY_K: return KEY_K;
|
||||
case VKEY_L: return KEY_L;
|
||||
case VKEY_M: return KEY_M;
|
||||
case VKEY_N: return KEY_N;
|
||||
case VKEY_O: return KEY_O;
|
||||
case VKEY_P: return KEY_P;
|
||||
case VKEY_Q: return KEY_Q;
|
||||
case VKEY_R: return KEY_R;
|
||||
case VKEY_S: return KEY_S;
|
||||
case VKEY_T: return KEY_T;
|
||||
case VKEY_U: return KEY_U;
|
||||
case VKEY_V: return KEY_V;
|
||||
case VKEY_W: return KEY_W;
|
||||
case VKEY_X: return KEY_X;
|
||||
case VKEY_Y: return KEY_Y;
|
||||
case VKEY_Z: return KEY_Z;
|
||||
/*
|
||||
case VKEY_OEM_PLUS: return KEY_PLUS;
|
||||
case VKEY_OEM_COMMA: return KEY_COMMA;
|
||||
case VKEY_OEM_MINUS: return KEY_MINUS;
|
||||
case VKEY_OEM_PERIOD: return KEY_PERIOD;
|
||||
case VKEY_OEM_1: return KEY_OEM_1;
|
||||
case VKEY_OEM_2: return KEY_OEM_2;
|
||||
case VKEY_OEM_3: return KEY_OEM_3;
|
||||
case VKEY_OEM_4: return KEY_OEM_4;
|
||||
case VKEY_OEM_5: return KEY_OEM_5;
|
||||
case VKEY_OEM_6: return KEY_OEM_6;
|
||||
case VKEY_OEM_7: return KEY_OEM_7;
|
||||
case VKEY_OEM_8: return KEY_OEM_8;
|
||||
*/
|
||||
default: break;
|
||||
|
||||
};
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
#endif // BASE_KEYBOARD_CODES_POSIX_H_
|
|
@ -1,123 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* opengl_context.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* http://www.godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
#include "opengl_context.h"
|
||||
|
||||
#include <pthread.h>
|
||||
#include "ppapi/gles2/gl2ext_ppapi.h"
|
||||
#include "os_nacl.h"
|
||||
#include "ppapi/cpp/instance.h"
|
||||
#include "ppapi/cpp/module.h"
|
||||
#include "ppapi/cpp/completion_callback.h"
|
||||
#include "ppapi/utility/completion_callback_factory.h"
|
||||
|
||||
|
||||
namespace {
|
||||
// This is called by the brower when the 3D context has been flushed to the
|
||||
// browser window.
|
||||
void FlushCallback(void* data, int32_t result) {
|
||||
static_cast<OpenGLContext*>(data)->set_flush_pending(false);
|
||||
static_cast<OpenGLContext*>(data)->FlushContext();
|
||||
}
|
||||
} // namespace
|
||||
|
||||
OpenGLContext::OpenGLContext(pp::Instance* p_instance)
|
||||
: pp::Graphics3DClient(p_instance),
|
||||
flush_pending_(false) {
|
||||
|
||||
instance = p_instance;
|
||||
pp::Module* module = pp::Module::Get();
|
||||
assert(module);
|
||||
gles2_interface_ = static_cast<const struct PPB_OpenGLES2_Dev*>(
|
||||
module->GetBrowserInterface(PPB_OPENGLES2_INTERFACE));
|
||||
assert(gles2_interface_);
|
||||
}
|
||||
|
||||
OpenGLContext::~OpenGLContext() {
|
||||
glSetCurrentContextPPAPI(0);
|
||||
}
|
||||
|
||||
bool OpenGLContext::MakeContextCurrent(pp::Instance* instance) {
|
||||
|
||||
if (instance == NULL) {
|
||||
glSetCurrentContextPPAPI(0);
|
||||
return false;
|
||||
}
|
||||
// Lazily create the Pepper context.
|
||||
if (context_.is_null()) {
|
||||
int32_t attribs[] = {
|
||||
PP_GRAPHICS3DATTRIB_ALPHA_SIZE, 8,
|
||||
PP_GRAPHICS3DATTRIB_DEPTH_SIZE, 24,
|
||||
PP_GRAPHICS3DATTRIB_STENCIL_SIZE, 8,
|
||||
PP_GRAPHICS3DATTRIB_SAMPLES, 0,
|
||||
PP_GRAPHICS3DATTRIB_SAMPLE_BUFFERS, 0,
|
||||
PP_GRAPHICS3DATTRIB_WIDTH, width,
|
||||
PP_GRAPHICS3DATTRIB_HEIGHT, height,
|
||||
PP_GRAPHICS3DATTRIB_NONE
|
||||
};
|
||||
|
||||
context_ = pp::Graphics3D(instance, pp::Graphics3D(), attribs);
|
||||
if (context_.is_null()) {
|
||||
glSetCurrentContextPPAPI(0);
|
||||
return false;
|
||||
}
|
||||
instance->BindGraphics(context_);
|
||||
}
|
||||
glSetCurrentContextPPAPI(context_.pp_resource());
|
||||
return true;
|
||||
}
|
||||
|
||||
void OpenGLContext::ResizeContext(const pp::Size& size) {
|
||||
|
||||
width = size.width();
|
||||
height = size.height();
|
||||
|
||||
if (!context_.is_null()) {
|
||||
context_.ResizeBuffers(size.width(), size.height());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void OpenGLContext::InvalidateContext(pp::Instance* instance) {
|
||||
glSetCurrentContextPPAPI(0);
|
||||
}
|
||||
|
||||
void OpenGLContext::FlushContext() {
|
||||
if (flush_pending()) {
|
||||
// A flush is pending so do nothing; just drop this flush on the floor.
|
||||
return;
|
||||
}
|
||||
set_flush_pending(true);
|
||||
|
||||
OSNacl* os = (OSNacl*)OS::get_singleton();
|
||||
MakeContextCurrent(instance);
|
||||
os->iterate();
|
||||
|
||||
context_.SwapBuffers(pp::CompletionCallback(&FlushCallback, this));
|
||||
}
|
||||
|
|
@ -1,124 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* opengl_context.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* http://www.godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
#ifndef EXAMPLES_TUMBLER_OPENGL_CONTEXT_H_
|
||||
#define EXAMPLES_TUMBLER_OPENGL_CONTEXT_H_
|
||||
|
||||
///
|
||||
/// @file
|
||||
/// OpenGLContext manages the OpenGL context in the browser that is associated
|
||||
/// with a @a pp::Instance instance.
|
||||
///
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <string>
|
||||
|
||||
#include "ppapi/c/ppb_opengles2.h"
|
||||
//#include "ppapi/cpp/dev/context_3d_dev.h"
|
||||
#include "ppapi/cpp/graphics_3d_client.h"
|
||||
#include "ppapi/cpp/graphics_3d.h"
|
||||
//#include "ppapi/cpp/dev/surface_3d_dev.h"
|
||||
#include "ppapi/cpp/instance.h"
|
||||
#include "ppapi/cpp/size.h"
|
||||
|
||||
// A convenience wrapper for a shared OpenGLContext pointer type. As other
|
||||
// smart pointer types are needed, add them here.
|
||||
|
||||
#include <tr1/memory>
|
||||
|
||||
class OpenGLContext;
|
||||
|
||||
typedef std::tr1::shared_ptr<OpenGLContext> SharedOpenGLContext;
|
||||
|
||||
/// OpenGLContext manages an OpenGL rendering context in the browser.
|
||||
///
|
||||
class OpenGLContext : public pp::Graphics3DClient {
|
||||
public:
|
||||
explicit OpenGLContext(pp::Instance* instance);
|
||||
|
||||
/// Release all the in-browser resources used by this context, and make this
|
||||
/// context invalid.
|
||||
virtual ~OpenGLContext();
|
||||
|
||||
/// The Graphics3DClient interfcace.
|
||||
virtual void Graphics3DContextLost() {
|
||||
assert(!"Unexpectedly lost graphics context");
|
||||
}
|
||||
|
||||
/// Make @a this the current 3D context in @a instance.
|
||||
/// @param instance The instance of the NaCl module that will receive the
|
||||
/// the current 3D context.
|
||||
/// @return success.
|
||||
bool MakeContextCurrent(pp::Instance* instance);
|
||||
|
||||
/// Flush the contents of this context to the browser's 3D device.
|
||||
void FlushContext();
|
||||
|
||||
/// Make the underlying 3D device invalid, so that any subsequent rendering
|
||||
/// commands will have no effect. The next call to MakeContextCurrent() will
|
||||
/// cause the underlying 3D device to get rebound and start receiving
|
||||
/// receiving rendering commands again. Use InvalidateContext(), for
|
||||
/// example, when resizing the context's viewing area.
|
||||
void InvalidateContext(pp::Instance* instance);
|
||||
|
||||
void ResizeContext(const pp::Size& size);
|
||||
|
||||
/// The OpenGL ES 2.0 interface.
|
||||
const struct PPB_OpenGLES2_Dev* gles2() const {
|
||||
return gles2_interface_;
|
||||
}
|
||||
|
||||
/// The PP_Resource needed to make GLES2 calls through the Pepper interface.
|
||||
const PP_Resource gl_context() const {
|
||||
return context_.pp_resource();
|
||||
}
|
||||
|
||||
/// Indicate whether a flush is pending. This can only be called from the
|
||||
/// main thread; it is not thread safe.
|
||||
bool flush_pending() const {
|
||||
return flush_pending_;
|
||||
}
|
||||
void set_flush_pending(bool flag) {
|
||||
flush_pending_ = flag;
|
||||
}
|
||||
|
||||
private:
|
||||
pp::Graphics3D context_;
|
||||
bool flush_pending_;
|
||||
|
||||
int width, height;
|
||||
|
||||
pp::Instance* instance;
|
||||
|
||||
const struct PPB_OpenGLES2_Dev* gles2_interface_;
|
||||
};
|
||||
|
||||
#endif // EXAMPLES_TUMBLER_OPENGL_CONTEXT_H_
|
||||
|
|
@ -1,566 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* os_nacl.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* http://www.godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
#include "os_nacl.h"
|
||||
|
||||
#include "drivers/unix/memory_pool_static_malloc.h"
|
||||
#include "os/memory_pool_dynamic_static.h"
|
||||
#include "main/main.h"
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "io/file_access_memory.h"
|
||||
#include "core/io/file_access_pack.h"
|
||||
#include "scene/io/scene_loader.h"
|
||||
#include "scene/main/scene_main_loop.h"
|
||||
|
||||
#include "servers/visual/visual_server_raster.h"
|
||||
|
||||
#include "drivers/gles2/rasterizer_gles2.h"
|
||||
#include "nacl_keycodes.h"
|
||||
|
||||
#include "core/globals.h"
|
||||
#include "core/input_map.h"
|
||||
|
||||
#include <ppapi/cpp/point.h>
|
||||
#include <ppapi/cpp/var.h>
|
||||
|
||||
#define UNIX_ENABLED
|
||||
#include "drivers/unix/thread_posix.h"
|
||||
#include "drivers/unix/semaphore_posix.h"
|
||||
#include "drivers/unix/mutex_posix.h"
|
||||
|
||||
|
||||
int OSNacl::get_video_driver_count() const {
|
||||
|
||||
return 1;
|
||||
};
|
||||
const char * OSNacl::get_video_driver_name(int p_driver) const {
|
||||
|
||||
return "GLES2";
|
||||
};
|
||||
|
||||
OS::VideoMode OSNacl::get_default_video_mode() const {
|
||||
|
||||
return OS::VideoMode(800,600,false);
|
||||
};
|
||||
|
||||
int OSNacl::get_audio_driver_count() const {
|
||||
|
||||
return 1;
|
||||
};
|
||||
|
||||
const char * OSNacl::get_audio_driver_name(int p_driver) const {
|
||||
|
||||
return "nacl_audio";
|
||||
};
|
||||
|
||||
static MemoryPoolStaticMalloc *mempool_static=NULL;
|
||||
static MemoryPoolDynamicStatic *mempool_dynamic=NULL;
|
||||
|
||||
void OSNacl::initialize_core() {
|
||||
|
||||
ticks_start=0;
|
||||
ticks_start=get_ticks_usec();
|
||||
};
|
||||
|
||||
void OSNacl::initialize(const VideoMode& p_desired,int p_video_driver,int p_audio_driver) {
|
||||
|
||||
rasterizer = memnew( RasterizerGLES2 );
|
||||
visual_server = memnew( VisualServerRaster(rasterizer) );
|
||||
visual_server->init();
|
||||
visual_server->cursor_set_visible(false, 0);
|
||||
|
||||
audio_driver = memnew(AudioDriverNacl);
|
||||
audio_driver->set_singleton();
|
||||
audio_driver->init();
|
||||
|
||||
sample_manager = memnew( SampleManagerMallocSW );
|
||||
audio_server = memnew( AudioServerSW(sample_manager) );
|
||||
audio_server->set_mixer_params(AudioMixerSW::INTERPOLATION_LINEAR,false);
|
||||
audio_server->init();
|
||||
|
||||
spatial_sound_server = memnew( SpatialSoundServerSW );
|
||||
spatial_sound_server->init();
|
||||
|
||||
spatial_sound_2d_server = memnew( SpatialSound2DServerSW );
|
||||
spatial_sound_2d_server->init();
|
||||
|
||||
//
|
||||
physics_server = memnew( PhysicsServerSW );
|
||||
physics_server->init();
|
||||
|
||||
physics_2d_server = memnew( Physics2DServerSW );
|
||||
physics_2d_server->init();
|
||||
|
||||
input = memnew(InputDefault);
|
||||
};
|
||||
|
||||
void OSNacl::set_main_loop( MainLoop * p_main_loop ) {
|
||||
|
||||
main_loop = p_main_loop;
|
||||
input->set_main_loop(p_main_loop);
|
||||
main_loop->init();
|
||||
};
|
||||
|
||||
void OSNacl::delete_main_loop() {
|
||||
|
||||
if (main_loop)
|
||||
memdelete(main_loop);
|
||||
};
|
||||
|
||||
void OSNacl::finalize() {
|
||||
|
||||
|
||||
};
|
||||
void OSNacl::finalize_core() {
|
||||
|
||||
if (mempool_dynamic)
|
||||
memdelete( mempool_dynamic );
|
||||
delete mempool_static;
|
||||
|
||||
};
|
||||
|
||||
void OSNacl::alert(const String& p_alert,const String& p_title) {
|
||||
|
||||
fprintf(stderr,"ERROR: %s\n",p_alert.utf8().get_data());
|
||||
};
|
||||
|
||||
void OSNacl::vprint(const char* p_format, va_list p_list, bool p_strerr) {
|
||||
|
||||
vprintf(p_format,p_list);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
|
||||
String OSNacl::get_stdin_string(bool p_block) {
|
||||
|
||||
char buff[1024];
|
||||
return fgets(buff,1024,stdin);
|
||||
};
|
||||
|
||||
void OSNacl::set_mouse_show(bool p_show) {
|
||||
|
||||
};
|
||||
|
||||
void OSNacl::set_mouse_grab(bool p_grab) {
|
||||
|
||||
};
|
||||
|
||||
bool OSNacl::is_mouse_grab_enabled() const {
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
int OSNacl::get_mouse_button_state() const {
|
||||
|
||||
return mouse_mask;
|
||||
};
|
||||
|
||||
|
||||
Point2 OSNacl::get_mouse_pos() const {
|
||||
|
||||
return Point2();
|
||||
};
|
||||
|
||||
void OSNacl::set_window_title(const String& p_title) {
|
||||
};
|
||||
|
||||
void OSNacl::set_video_mode(const VideoMode& p_video_mode, int p_screen) {
|
||||
|
||||
video_mode = p_video_mode;
|
||||
};
|
||||
|
||||
OS::VideoMode OSNacl::get_video_mode(int p_screen) const {
|
||||
|
||||
return video_mode;
|
||||
};
|
||||
|
||||
void OSNacl::get_fullscreen_mode_list(List<VideoMode> *p_list,int p_screen) const {
|
||||
|
||||
};
|
||||
|
||||
Error OSNacl::execute(const String& p_path, const List<String>& p_arguments,bool p_blocking, OS::ProcessID *r_child_id, String* r_pipe, int *r_exitcode) {
|
||||
|
||||
return ERR_UNAVAILABLE;
|
||||
};
|
||||
|
||||
Error OSNacl::kill(const ProcessID& p_pid) {
|
||||
|
||||
return ERR_UNAVAILABLE;
|
||||
};
|
||||
|
||||
bool OSNacl::has_environment(const String& p_var) const {
|
||||
|
||||
return getenv(p_var.utf8().get_data())!=NULL;
|
||||
};
|
||||
|
||||
String OSNacl::get_environment(const String& p_var) const {
|
||||
|
||||
if (getenv(p_var.utf8().get_data()))
|
||||
return getenv(p_var.utf8().get_data());
|
||||
return "";
|
||||
};
|
||||
|
||||
String OSNacl::get_name() {
|
||||
|
||||
return "NaCl";
|
||||
};
|
||||
|
||||
MainLoop *OSNacl::get_main_loop() const {
|
||||
|
||||
return main_loop;
|
||||
};
|
||||
|
||||
OS::Date OSNacl::get_date(bool utc) const {
|
||||
|
||||
time_t t=time(NULL);
|
||||
struct tm *lt;
|
||||
if (utc)
|
||||
lt=gmtime(&t);
|
||||
else
|
||||
lt=localtime(&t);
|
||||
Date ret;
|
||||
ret.year=lt->tm_year;
|
||||
|
||||
// Index starting at 1 to match OS_Unix::get_date
|
||||
// and Windows SYSTEMTIME and tm_mon follows the typical structure
|
||||
// of 0-11, noted here: http://www.cplusplus.com/reference/ctime/tm/
|
||||
ret.month=(Month)(lt->tm_mon+1);
|
||||
ret.day=lt->tm_mday;
|
||||
ret.weekday=(Weekday)lt->tm_wday;
|
||||
ret.dst=lt->tm_isdst;
|
||||
|
||||
return ret;
|
||||
};
|
||||
|
||||
OS::Time OSNacl::get_time(bool utc) const {
|
||||
|
||||
time_t t=time(NULL);
|
||||
struct tm *lt;
|
||||
if (utc)
|
||||
lt=gmtime(&t);
|
||||
else
|
||||
lt=localtime(&t);
|
||||
Time ret;
|
||||
ret.hour=lt->tm_hour;
|
||||
ret.min=lt->tm_min;
|
||||
ret.sec=lt->tm_sec;
|
||||
return ret;
|
||||
};
|
||||
|
||||
OS::TimeZoneInfo OS_Unix::get_time_zone_info() const {
|
||||
time_t t = time(NULL);
|
||||
struct tm *lt = localtime(&t);
|
||||
char name[16];
|
||||
strftime(name, 16, "%Z", lt);
|
||||
name[15] = 0;
|
||||
TimeZoneInfo ret;
|
||||
ret.name = name;
|
||||
|
||||
char bias_buf[16];
|
||||
strftime(bias_buf, 16, "%z", lt);
|
||||
int bias;
|
||||
bias_buf[15] = 0;
|
||||
sscanf(bias_buf, "%d", &bias);
|
||||
|
||||
// convert from ISO 8601 (1 minute=1, 1 hour=100) to minutes
|
||||
int hour = (int)bias / 100;
|
||||
int minutes = bias % 100;
|
||||
if (bias < 0)
|
||||
ret.bias = hour * 60 - minutes;
|
||||
else
|
||||
ret.bias = hour * 60 + minutes;
|
||||
|
||||
return ret;
|
||||
};
|
||||
|
||||
void OSNacl::delay_usec(uint32_t p_usec) const {
|
||||
|
||||
//usleep(p_usec);
|
||||
};
|
||||
|
||||
uint64_t OSNacl::get_ticks_usec() const {
|
||||
|
||||
struct timeval tv_now;
|
||||
gettimeofday(&tv_now,NULL);
|
||||
|
||||
uint64_t longtime = (uint64_t)tv_now.tv_usec + (uint64_t)tv_now.tv_sec*1000000L;
|
||||
longtime-=ticks_start;
|
||||
|
||||
return longtime;
|
||||
};
|
||||
|
||||
bool OSNacl::can_draw() const {
|
||||
|
||||
return minimized != true;
|
||||
};
|
||||
|
||||
void OSNacl::queue_event(const InputEvent& p_event) {
|
||||
|
||||
ERR_FAIL_INDEX( event_count, MAX_EVENTS );
|
||||
|
||||
event_queue[event_count++] = p_event;
|
||||
};
|
||||
|
||||
void OSNacl::add_package(String p_name, Vector<uint8_t> p_data) {
|
||||
|
||||
FileAccessMemory::register_file(p_name, p_data);
|
||||
FileAccess::make_default<FileAccessMemory>(FileAccess::ACCESS_RESOURCES);
|
||||
FileAccess::make_default<FileAccessMemory>(FileAccess::ACCESS_USERDATA);
|
||||
FileAccess::make_default<FileAccessMemory>(FileAccess::ACCESS_FILESYSTEM);
|
||||
|
||||
if (!PackedData::get_singleton())
|
||||
memnew(PackedData);
|
||||
|
||||
printf("adding package %ls, %x\n", p_name.c_str(), PackedData::get_singleton());
|
||||
PackedData::get_singleton()->set_disabled(true);
|
||||
PackedData::get_singleton()->add_pack(p_name);
|
||||
PackedData::get_singleton()->set_disabled(false);
|
||||
printf("added\n");
|
||||
};
|
||||
|
||||
void OSNacl::set_cursor_shape(CursorShape p_shape) {
|
||||
|
||||
|
||||
};
|
||||
|
||||
String OSNacl::get_resource_dir() const {
|
||||
|
||||
return ".";
|
||||
};
|
||||
|
||||
static int mouse_button(int p_nacl_but) {
|
||||
|
||||
switch (p_nacl_but) {
|
||||
|
||||
case PP_INPUTEVENT_MOUSEBUTTON_LEFT:
|
||||
return BUTTON_LEFT;
|
||||
case PP_INPUTEVENT_MOUSEBUTTON_MIDDLE:
|
||||
return BUTTON_MIDDLE;
|
||||
case PP_INPUTEVENT_MOUSEBUTTON_RIGHT:
|
||||
return BUTTON_RIGHT;
|
||||
};
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
static InputModifierState modifier(uint32_t p_mod) {
|
||||
|
||||
InputModifierState mod_mask;
|
||||
|
||||
mod_mask.shift = p_mod & PP_INPUTEVENT_MODIFIER_SHIFTKEY;
|
||||
mod_mask.alt = p_mod & PP_INPUTEVENT_MODIFIER_ALTKEY;
|
||||
mod_mask.control = p_mod & PP_INPUTEVENT_MODIFIER_CONTROLKEY;
|
||||
mod_mask.meta = p_mod & PP_INPUTEVENT_MODIFIER_METAKEY;
|
||||
|
||||
return mod_mask;
|
||||
};
|
||||
|
||||
|
||||
|
||||
void OSNacl::handle_event(const pp::InputEvent& p_event) {
|
||||
|
||||
int type = p_event.GetType();
|
||||
switch (type) {
|
||||
|
||||
case PP_INPUTEVENT_TYPE_MOUSEDOWN:
|
||||
case PP_INPUTEVENT_TYPE_MOUSEUP:
|
||||
case PP_INPUTEVENT_TYPE_WHEEL: {
|
||||
|
||||
InputEvent event;
|
||||
event.ID=++event_id;
|
||||
event.type = InputEvent::MOUSE_BUTTON;
|
||||
event.device=0;
|
||||
|
||||
pp::MouseInputEvent mevent(p_event);
|
||||
if (type == PP_INPUTEVENT_TYPE_WHEEL) {
|
||||
|
||||
pp::WheelInputEvent wevent(p_event);;
|
||||
float ticks = wevent.GetTicks().y();
|
||||
if (ticks == 0)
|
||||
break; // whut?
|
||||
|
||||
event.mouse_button.pressed = true;
|
||||
event.mouse_button.button_index = ticks > 0 ? BUTTON_WHEEL_UP : BUTTON_WHEEL_DOWN;
|
||||
event.mouse_button.doubleclick = false;
|
||||
|
||||
} else {
|
||||
|
||||
event.mouse_button.pressed = (type == PP_INPUTEVENT_TYPE_MOUSEDOWN);
|
||||
event.mouse_button.button_index = mouse_button(mevent.GetButton());
|
||||
event.mouse_button.doubleclick = (mevent.GetClickCount() % 2) == 0;
|
||||
|
||||
mouse_mask &= ~(1<< (event.mouse_button.button_index - 1));
|
||||
mouse_mask |= (event.mouse_button.pressed << (event.mouse_button.button_index - 1));
|
||||
};
|
||||
pp::Point pos = mevent.GetPosition();
|
||||
event.mouse_button.button_mask = mouse_mask;
|
||||
event.mouse_button.global_x = pos.x();
|
||||
event.mouse_button.x = pos.x();
|
||||
event.mouse_button.global_y = pos.y();
|
||||
event.mouse_button.y = pos.y();
|
||||
event.mouse_button.pointer_index = 0;
|
||||
event.mouse_button.mod = modifier(p_event.GetModifiers());
|
||||
queue_event(event);
|
||||
|
||||
} break;
|
||||
|
||||
case PP_INPUTEVENT_TYPE_MOUSEMOVE: {
|
||||
|
||||
pp::MouseInputEvent mevent(p_event);
|
||||
pp::Point pos = mevent.GetPosition();
|
||||
|
||||
InputEvent event;
|
||||
event.ID=++event_id;
|
||||
event.type = InputEvent::MOUSE_MOTION;
|
||||
event.mouse_motion.pointer_index = 0;
|
||||
event.mouse_motion.global_x = pos.x();
|
||||
event.mouse_motion.global_y = pos.y();
|
||||
event.mouse_motion.x = pos.x();
|
||||
event.mouse_motion.y = pos.y();
|
||||
event.mouse_motion.button_mask = mouse_mask;
|
||||
event.mouse_motion.mod = modifier(p_event.GetModifiers());
|
||||
|
||||
event.mouse_motion.relative_x = pos.x() - mouse_last_x;
|
||||
event.mouse_motion.relative_y = pos.y() - mouse_last_y;
|
||||
mouse_last_x = pos.x();
|
||||
mouse_last_y = pos.y();
|
||||
|
||||
queue_event(event);
|
||||
|
||||
} break;
|
||||
|
||||
case PP_INPUTEVENT_TYPE_RAWKEYDOWN:
|
||||
case PP_INPUTEVENT_TYPE_KEYDOWN:
|
||||
case PP_INPUTEVENT_TYPE_KEYUP: {
|
||||
|
||||
pp::KeyboardInputEvent kevent(p_event);
|
||||
bool is_char;
|
||||
uint32_t key = godot_key(kevent.GetKeyCode(), is_char);
|
||||
if (type != PP_INPUTEVENT_TYPE_KEYUP && is_char) {
|
||||
|
||||
last_scancode = key;
|
||||
break;
|
||||
};
|
||||
|
||||
InputEvent event;
|
||||
event.ID=++event_id;
|
||||
event.type = InputEvent::KEY;
|
||||
event.key.pressed = (type != PP_INPUTEVENT_TYPE_KEYUP);
|
||||
event.key.scancode = key;
|
||||
event.key.unicode = key;
|
||||
|
||||
event.key.echo = p_event.GetModifiers() & PP_INPUTEVENT_MODIFIER_ISAUTOREPEAT;
|
||||
event.key.mod = modifier(p_event.GetModifiers());
|
||||
queue_event(event);
|
||||
} break;
|
||||
|
||||
case PP_INPUTEVENT_TYPE_CHAR: {
|
||||
|
||||
pp::KeyboardInputEvent kevent(p_event);
|
||||
InputEvent event;
|
||||
event.ID = ++event_id;
|
||||
event.type = InputEvent::KEY;
|
||||
event.key.pressed = true;
|
||||
event.key.scancode = last_scancode;
|
||||
event.key.unicode = kevent.GetCharacterText().AsString().c_str()[0];
|
||||
event.key.mod = modifier(p_event.GetModifiers());
|
||||
event.key.echo = p_event.GetModifiers() & PP_INPUTEVENT_MODIFIER_ISAUTOREPEAT;
|
||||
queue_event(event);
|
||||
|
||||
} break;
|
||||
|
||||
/*
|
||||
case NPEventType_Minimize: {
|
||||
|
||||
minimized = p_event->u.minimize.value == 1;
|
||||
|
||||
} break;
|
||||
|
||||
|
||||
case NPEventType_Focus: {
|
||||
|
||||
if (p_event->u.focus.value == 1) {
|
||||
main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN);
|
||||
} else {
|
||||
main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT);
|
||||
};
|
||||
} break;
|
||||
|
||||
*/
|
||||
|
||||
default:
|
||||
;
|
||||
};
|
||||
};
|
||||
|
||||
bool OSNacl::iterate() {
|
||||
|
||||
if (!main_loop) {
|
||||
event_count = 0;
|
||||
return true;
|
||||
};
|
||||
|
||||
for (int i=0; i<event_count; i++) {
|
||||
|
||||
input->parse_input_event(event_queue[i]);
|
||||
};
|
||||
|
||||
event_count = 0;
|
||||
|
||||
return Main::iteration();
|
||||
};
|
||||
|
||||
|
||||
OSNacl::OSNacl() {
|
||||
|
||||
main_loop=NULL;
|
||||
mempool_dynamic = NULL;
|
||||
mempool_static = NULL;
|
||||
mouse_last_x = 0;
|
||||
mouse_last_y = 0;
|
||||
event_count = 0;
|
||||
event_id = 0;
|
||||
mouse_mask = 0;
|
||||
video_mode = get_default_video_mode();
|
||||
last_scancode = 0;
|
||||
minimized = false;
|
||||
|
||||
ThreadPosix::make_default();
|
||||
SemaphorePosix::make_default();
|
||||
MutexPosix::make_default();
|
||||
mempool_static = new MemoryPoolStaticMalloc;
|
||||
mempool_dynamic = memnew( MemoryPoolDynamicStatic );
|
||||
};
|
||||
|
||||
OSNacl::~OSNacl() {
|
||||
|
||||
};
|
|
@ -1,156 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* os_nacl.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* http://www.godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
#ifndef OS_NACL_H
|
||||
#define OS_NACL_H
|
||||
|
||||
#include "core/os/os.h"
|
||||
|
||||
#include "servers/visual_server.h"
|
||||
#include "servers/visual/rasterizer.h"
|
||||
#include "servers/physics/physics_server_sw.h"
|
||||
#include "servers/spatial_sound/spatial_sound_server_sw.h"
|
||||
#include "servers/spatial_sound_2d/spatial_sound_2d_server_sw.h"
|
||||
#include "servers/audio/audio_server_sw.h"
|
||||
#include "servers/physics_2d/physics_2d_server_sw.h"
|
||||
#include "audio_driver_nacl.h"
|
||||
#include "os/input.h"
|
||||
|
||||
|
||||
#include <ppapi/cpp/input_event.h>
|
||||
|
||||
class OSNacl : OS {
|
||||
|
||||
uint64_t ticks_start;
|
||||
|
||||
protected:
|
||||
|
||||
enum {
|
||||
MAX_EVENTS = 64,
|
||||
};
|
||||
|
||||
MainLoop *main_loop;
|
||||
|
||||
Rasterizer *rasterizer;
|
||||
VisualServer *visual_server;
|
||||
PhysicsServer *physics_server;
|
||||
SpatialSoundServerSW *spatial_sound_server;
|
||||
|
||||
AudioServerSW *audio_server;
|
||||
SampleManagerMallocSW *sample_manager;
|
||||
SpatialSound2DServerSW *spatial_sound_2d_server;
|
||||
Physics2DServer *physics_2d_server;
|
||||
AudioDriverNacl* audio_driver;
|
||||
|
||||
|
||||
// functions used by main to initialize/deintialize the OS
|
||||
virtual int get_video_driver_count() const;
|
||||
virtual const char * get_video_driver_name(int p_driver) const;
|
||||
|
||||
virtual VideoMode get_default_video_mode() const;
|
||||
|
||||
virtual int get_audio_driver_count() const;
|
||||
virtual const char * get_audio_driver_name(int p_driver) const;
|
||||
|
||||
void vprint(const char* p_format, va_list p_list, bool p_stderr);
|
||||
|
||||
virtual void initialize_core();
|
||||
virtual void initialize(const VideoMode& p_desired,int p_video_driver,int p_audio_driver);
|
||||
|
||||
virtual void set_main_loop( MainLoop * p_main_loop );
|
||||
virtual void delete_main_loop();
|
||||
|
||||
virtual void finalize();
|
||||
virtual void finalize_core();
|
||||
|
||||
int mouse_last_x, mouse_last_y;
|
||||
|
||||
InputEvent event_queue[MAX_EVENTS];
|
||||
int event_count;
|
||||
void queue_event(const InputEvent& p_event);
|
||||
|
||||
int event_id;
|
||||
uint32_t mouse_mask;
|
||||
|
||||
uint32_t last_scancode;
|
||||
|
||||
bool minimized;
|
||||
|
||||
VideoMode video_mode;
|
||||
|
||||
InputDefault *input;
|
||||
|
||||
public:
|
||||
|
||||
void add_package(String p_name, Vector<uint8_t> p_data);
|
||||
|
||||
void handle_event(const pp::InputEvent& p_event);
|
||||
|
||||
virtual void alert(const String& p_alert,const String& p_title);
|
||||
virtual String get_stdin_string(bool p_block);
|
||||
|
||||
virtual void set_mouse_show(bool p_show);
|
||||
virtual void set_mouse_grab(bool p_grab);
|
||||
virtual bool is_mouse_grab_enabled() const;
|
||||
virtual Point2 get_mouse_pos() const;
|
||||
virtual int get_mouse_button_state() const;
|
||||
virtual void set_window_title(const String& p_title);
|
||||
|
||||
virtual void set_video_mode(const VideoMode& p_video_mode,int p_screen);
|
||||
virtual VideoMode get_video_mode(int p_screen) const;
|
||||
virtual void get_fullscreen_mode_list(List<VideoMode> *p_list,int p_screen) const;
|
||||
|
||||
virtual Error execute(const String& p_path, const List<String>& p_arguments,bool p_blocking,ProcessID *r_child_id=NULL,String* r_pipe=NULL,int *r_exitcode=NULL);
|
||||
virtual Error kill(const ProcessID& p_pid);
|
||||
|
||||
virtual bool has_environment(const String& p_var) const;
|
||||
virtual String get_environment(const String& p_var) const;
|
||||
|
||||
virtual void set_cursor_shape(CursorShape p_shape);
|
||||
|
||||
virtual String get_name();
|
||||
|
||||
virtual MainLoop *get_main_loop() const;
|
||||
|
||||
virtual Date get_date(bool utc) const;
|
||||
virtual Time get_time(bool utc) const;
|
||||
|
||||
virtual void delay_usec(uint32_t p_usec) const;
|
||||
virtual uint64_t get_ticks_usec() const;
|
||||
|
||||
virtual String get_resource_dir() const;
|
||||
|
||||
virtual bool can_draw() const;
|
||||
|
||||
bool iterate();
|
||||
|
||||
OSNacl();
|
||||
~OSNacl();
|
||||
};
|
||||
|
||||
#endif // OS_NACL_H
|
|
@ -1,541 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* pepper_main.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* http://www.godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
|
||||
("Apple") in consideration of your agreement to the following terms, and
|
||||
your use, installation, modification or redistribution of this Apple software
|
||||
constitutes acceptance of these terms. If you do not agree with these terms,
|
||||
please do not use, install, modify or redistribute this Apple software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and
|
||||
subject to these terms, Apple grants you a personal, non-exclusive license,
|
||||
under Apple's copyrights in this original Apple software
|
||||
(the "Apple Software"), to use, reproduce, modify and redistribute the Apple
|
||||
Software, with or without modifications, in source and/or binary forms;
|
||||
provided that if you redistribute the Apple Software in its entirety and
|
||||
without modifications, you must retain this notice and the following text and
|
||||
disclaimers in all such redistributions of the Apple Software. Neither the
|
||||
name, trademarks, service marks or logos of Apple Computer, Inc. may be used
|
||||
to endorse or promote products derived from the Apple Software without
|
||||
specific prior written permission from Apple. Except as expressly stated in
|
||||
this notice, no other rights or licenses, express or implied, are granted by
|
||||
Apple herein, including but not limited to any patent rights that may be
|
||||
infringed by your derivative works or by other works in which the Apple
|
||||
Software may be incorporated.
|
||||
|
||||
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
|
||||
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
|
||||
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
|
||||
COMBINATION WITH YOUR PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION
|
||||
AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER
|
||||
THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR
|
||||
OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "os_nacl.h"
|
||||
#include <GLES2/gl2.h>
|
||||
|
||||
#include <nacl/npupp.h>
|
||||
#include <pgl/pgl.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
|
||||
static NPNetscapeFuncs kBrowserFuncs = { 0 };
|
||||
static NPNetscapeFuncs* browser = &kBrowserFuncs;
|
||||
|
||||
static NPDevice* device3d_ = NULL;
|
||||
static PGLContext pgl_context_;
|
||||
static NPDeviceContext3D context3d_;
|
||||
static int width_;
|
||||
static int height_;
|
||||
|
||||
extern int nacl_main(int argc, char** argn, char** argv);
|
||||
extern void nacl_cleanup();
|
||||
|
||||
NPExtensions* extensions = NULL;
|
||||
static NPP npp_;
|
||||
|
||||
const int32_t kCommandBufferSize = 1024 * 1024;
|
||||
|
||||
// Plugin entry points
|
||||
extern "C" {
|
||||
|
||||
// Plugin entry points
|
||||
|
||||
// Entrypoints -----------------------------------------------------------------
|
||||
|
||||
NPError NP_GetEntryPoints(NPPluginFuncs* plugin_funcs) {
|
||||
plugin_funcs->version = 11;
|
||||
plugin_funcs->size = sizeof(plugin_funcs);
|
||||
plugin_funcs->newp = NPP_New;
|
||||
plugin_funcs->destroy = NPP_Destroy;
|
||||
plugin_funcs->setwindow = NPP_SetWindow;
|
||||
plugin_funcs->newstream = NPP_NewStream;
|
||||
plugin_funcs->destroystream = NPP_DestroyStream;
|
||||
plugin_funcs->asfile = NPP_StreamAsFile;
|
||||
plugin_funcs->writeready = NPP_WriteReady;
|
||||
plugin_funcs->write = (NPP_WriteUPP)NPP_Write;
|
||||
plugin_funcs->print = NPP_Print;
|
||||
plugin_funcs->event = NPP_HandleEvent;
|
||||
plugin_funcs->urlnotify = NPP_URLNotify;
|
||||
plugin_funcs->getvalue = NPP_GetValue;
|
||||
plugin_funcs->setvalue = NPP_SetValue;
|
||||
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
NPError NP_Shutdown() {
|
||||
pglTerminate();
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
NPError NP_GetValue(void* instance, NPPVariable variable, void* value);
|
||||
char* NP_GetMIMEDescription();
|
||||
|
||||
NPError NP_Initialize(NPNetscapeFuncs* browser_funcs,
|
||||
NPPluginFuncs* plugin_funcs) {
|
||||
printf("NPP_Initialize\n");
|
||||
memcpy(&kBrowserFuncs, browser_funcs, sizeof(kBrowserFuncs));
|
||||
pglInitialize();
|
||||
return NP_GetEntryPoints(plugin_funcs);
|
||||
}
|
||||
|
||||
|
||||
} // extern "C"
|
||||
|
||||
void Initialize3D() {
|
||||
// Initialize a 3D context.
|
||||
NPDeviceContext3DConfig config;
|
||||
config.commandBufferSize = kCommandBufferSize;
|
||||
NPError err = device3d_->initializeContext(npp_, &config, &context3d_);
|
||||
if (err != NPERR_NO_ERROR) {
|
||||
printf("Failed to initialize 3D context\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Create a PGL context.
|
||||
pgl_context_ = pglCreateContext(npp_, device3d_, &context3d_);
|
||||
|
||||
// Initialize the demo GL state.
|
||||
//pglMakeCurrent(pgl_context_);
|
||||
//GLFromCPPInit();
|
||||
//pglMakeCurrent(NULL);
|
||||
}
|
||||
|
||||
NPError NPP_New(NPMIMEType pluginType,
|
||||
NPP instance,
|
||||
uint16_t mode,
|
||||
int16_t argc, char* argn[], char* argv[],
|
||||
NPSavedData* saved) {
|
||||
printf("NPP_New\n");
|
||||
if (browser->version >= 14) {
|
||||
|
||||
npp_ = instance;
|
||||
if (!extensions) {
|
||||
browser->getvalue(npp_, NPNVPepperExtensions,
|
||||
reinterpret_cast<void*>(&extensions));
|
||||
// CHECK(extensions);
|
||||
}
|
||||
|
||||
printf("%s: %i\n", __FUNCTION__, __LINE__);
|
||||
|
||||
device3d_ = extensions->acquireDevice(npp_, NPPepper3DDevice);
|
||||
if (device3d_ == NULL) {
|
||||
printf("Failed to acquire 3DDevice\n");
|
||||
exit(1);
|
||||
}
|
||||
printf("%s: %i\n", __FUNCTION__, __LINE__);
|
||||
|
||||
/*
|
||||
deviceaudio_ = extensions->acquireDevice(npp_, NPPepperAudioDevice);
|
||||
if (deviceaudio_ == NULL) {
|
||||
printf("Failed to acquire AudioDevice\n");
|
||||
exit(1);
|
||||
}
|
||||
*/
|
||||
Initialize3D();
|
||||
pglMakeCurrent(pgl_context_);
|
||||
nacl_main(argc, argn, argv);
|
||||
pglMakeCurrent(NULL);
|
||||
};
|
||||
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
NPError NPP_Destroy(NPP instance, NPSavedData** save) {
|
||||
|
||||
nacl_cleanup();
|
||||
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
void Destroy3D() {
|
||||
printf("destroy 3d\n");
|
||||
// Destroy the PGL context.
|
||||
pglDestroyContext(pgl_context_);
|
||||
pgl_context_ = NULL;
|
||||
|
||||
// Destroy the Device3D context.
|
||||
device3d_->destroyContext(npp_, &context3d_);
|
||||
}
|
||||
|
||||
static void iteration(void* data) {
|
||||
|
||||
(void)data;
|
||||
OSNacl* os = (OSNacl*)OS::get_singleton();
|
||||
|
||||
if (!pglMakeCurrent(pgl_context_) && pglGetError() == PGL_CONTEXT_LOST) {
|
||||
printf("******* Lost context! :O\n");
|
||||
Destroy3D();
|
||||
Initialize3D();
|
||||
pglMakeCurrent(pgl_context_);
|
||||
}
|
||||
|
||||
glViewport(0, 0, width_, height_);
|
||||
|
||||
os->iterate();
|
||||
|
||||
pglSwapBuffers();
|
||||
pglMakeCurrent(NULL);
|
||||
|
||||
browser->pluginthreadasynccall(npp_, iteration, NULL);
|
||||
};
|
||||
|
||||
NPError NPP_SetWindow(NPP instance, NPWindow* window) {
|
||||
|
||||
width_ = window->width;
|
||||
height_ = window->height;
|
||||
|
||||
if (!pgl_context_)
|
||||
Initialize3D();
|
||||
|
||||
// Schedule the first call to Draw.
|
||||
OSNacl* os = (OSNacl*)OS::get_singleton();
|
||||
OS::VideoMode vm;
|
||||
vm.width = width_;
|
||||
vm.height = height_;
|
||||
vm.resizable = false;
|
||||
vm.fullscreen = false;
|
||||
os->set_video_mode(vm);
|
||||
|
||||
browser->pluginthreadasynccall(npp_, iteration, NULL);
|
||||
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
NPError NPP_NewStream(NPP instance,
|
||||
NPMIMEType type,
|
||||
NPStream* stream,
|
||||
NPBool seekable,
|
||||
uint16_t* stype) {
|
||||
*stype = NP_ASFILEONLY;
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason) {
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
void NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname) {
|
||||
}
|
||||
|
||||
int32_t NPP_Write(NPP instance,
|
||||
NPStream* stream,
|
||||
int32_t offset,
|
||||
int32_t len,
|
||||
void* buffer) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t NPP_WriteReady(NPP instance, NPStream* stream) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void NPP_Print(NPP instance, NPPrint* platformPrint) {
|
||||
}
|
||||
|
||||
int16_t NPP_HandleEvent(NPP instance, void* event) {
|
||||
|
||||
OSNacl* os = (OSNacl*)OS::get_singleton();
|
||||
os->handle_event(event);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void NPP_URLNotify(NPP instance,
|
||||
const char* url,
|
||||
NPReason reason,
|
||||
void* notify_data) {
|
||||
// PluginObject* obj = static_cast<PluginObject*>(instance->pdata);
|
||||
}
|
||||
|
||||
static NPObject* Allocate(NPP npp, NPClass* npclass) {
|
||||
return new NPObject;
|
||||
}
|
||||
|
||||
static void Deallocate(NPObject* object) {
|
||||
delete object;
|
||||
}
|
||||
|
||||
// Return |true| if |method_name| is a recognized method.
|
||||
static bool HasMethod(NPObject* obj, NPIdentifier method_name) {
|
||||
|
||||
char *name = NPN_UTF8FromIdentifier(method_name);
|
||||
bool is_method = false;
|
||||
if (strcmp((const char *)name, "start_package") == 0) {
|
||||
is_method = true;
|
||||
} else if (strcmp((const char*)name, "add_package_chunk") == 0) {
|
||||
is_method = true;
|
||||
} else if (strcmp((const char*)name, "end_package") == 0) {
|
||||
is_method = true;
|
||||
} else if (strcmp((const char*)name, "start_scene") == 0) {
|
||||
is_method = true;
|
||||
}
|
||||
NPN_MemFree(name);
|
||||
return is_method;
|
||||
}
|
||||
|
||||
// I don't know what this is
|
||||
static bool InvokeDefault(NPObject *obj, const NPVariant *args,
|
||||
uint32_t argCount, NPVariant *result) {
|
||||
if (result) {
|
||||
NULL_TO_NPVARIANT(*result);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static uint8_t* mem = NULL;
|
||||
static int pkg_size = 0;
|
||||
static String pkgname;
|
||||
|
||||
static bool variant_is_number(const NPVariant& v) {
|
||||
|
||||
switch (v.type) {
|
||||
|
||||
case NPVariantType_Int32:
|
||||
case NPVariantType_Double:
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
static double variant_as_number(const NPVariant& v) {
|
||||
|
||||
switch (v.type) {
|
||||
|
||||
case NPVariantType_Int32:
|
||||
return (double)v.value.intValue;
|
||||
case NPVariantType_Double:
|
||||
return (double)v.value.doubleValue;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
// Invoke() is called by the browser to invoke a function object whose name
|
||||
// is |method_name|.
|
||||
static bool Invoke(NPObject* obj,
|
||||
NPIdentifier method_name,
|
||||
const NPVariant *args,
|
||||
uint32_t arg_count,
|
||||
NPVariant *result) {
|
||||
NULL_TO_NPVARIANT(*result);
|
||||
char *name = NPN_UTF8FromIdentifier(method_name);
|
||||
if (name == NULL)
|
||||
return false;
|
||||
bool rval = false;
|
||||
|
||||
OSNacl* os = (OSNacl*)OS::get_singleton();
|
||||
|
||||
if (strcmp(name, "start_package") == 0) {
|
||||
|
||||
printf("arg count is %i\n", arg_count);
|
||||
for (int i=0; i<arg_count; i++) {
|
||||
printf("type for %i is %i\n", i, args[i].type);
|
||||
}
|
||||
if (arg_count != 2) {
|
||||
return false; // assuming "false" means error
|
||||
};
|
||||
|
||||
if (args[0].type != NPVariantType_String) {
|
||||
printf("arg 0 not string type %i\n", args[1].type);
|
||||
return false;
|
||||
};
|
||||
|
||||
if (!variant_is_number(args[1])) {
|
||||
|
||||
printf("arg 1 not number, type %i\n", args[1].type);
|
||||
return false;
|
||||
};
|
||||
|
||||
pkgname = String::utf8(args[0].value.stringValue.UTF8Characters, args[0].value.stringValue.UTF8Length);
|
||||
pkg_size = (int)variant_as_number(args[1]);
|
||||
mem = (uint8_t*)malloc(pkg_size);
|
||||
|
||||
printf("args %ls, %lf\n", pkgname.c_str(), variant_as_number(args[1]));
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
if (strcmp(name, "add_package_chunk") == 0) {
|
||||
|
||||
if (arg_count != 3) { // assuming arg_count starts from 1
|
||||
return false; // assuming "false" means error
|
||||
};
|
||||
|
||||
if (!variant_is_number(args[0])) return false;
|
||||
if (args[1].type != NPVariantType_String) return false;
|
||||
if (!variant_is_number(args[2])) return false;
|
||||
|
||||
if (!mem)
|
||||
return false;
|
||||
|
||||
int ofs = variant_as_number(args[0]);
|
||||
int len = variant_as_number(args[2]);
|
||||
|
||||
String s;
|
||||
if (s.parse_utf8(args[1].value.stringValue.UTF8Characters, args[1].value.stringValue.UTF8Length)) {
|
||||
printf("error parsing?\n");
|
||||
};
|
||||
uint8_t* dst = mem + ofs;
|
||||
for (int i=0; i<len; i++) {
|
||||
|
||||
dst[i] = s[i];
|
||||
};
|
||||
|
||||
//memcpy(mem + ofs, args[1].value.stringValue.UTF8Characters, len);
|
||||
return true;
|
||||
};
|
||||
|
||||
if (strcmp(name, "end_package") == 0) {
|
||||
|
||||
os->add_package(pkgname, mem, pkg_size);
|
||||
return true;
|
||||
};
|
||||
|
||||
|
||||
if (strcmp(name, "start_scene") == 0) {
|
||||
printf("start_scene!\n");
|
||||
if (arg_count != 1) {
|
||||
return false;
|
||||
};
|
||||
|
||||
if (args[0].type != NPVariantType_String) return false;
|
||||
printf("calling with param %s\n", args[0].value.stringValue.UTF8Characters);
|
||||
|
||||
printf("pepper iteration\n");
|
||||
if (!pglMakeCurrent(pgl_context_) && pglGetError() == PGL_CONTEXT_LOST) {
|
||||
printf("******* Lost context! :O\n");
|
||||
Destroy3D();
|
||||
Initialize3D();
|
||||
pglMakeCurrent(pgl_context_);
|
||||
}
|
||||
os->start_scene(String::utf8(args[0].value.stringValue.UTF8Characters));
|
||||
pglSwapBuffers();
|
||||
pglMakeCurrent(NULL);
|
||||
|
||||
printf("returning true\n");
|
||||
return true;
|
||||
};
|
||||
|
||||
NPN_MemFree(name);
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
|
||||
static NPClass GodotClass = {
|
||||
NP_CLASS_STRUCT_VERSION,
|
||||
Allocate,
|
||||
Deallocate,
|
||||
NULL, // Invalidate is not implemented
|
||||
HasMethod,
|
||||
Invoke,
|
||||
InvokeDefault,
|
||||
NULL, // HasProperty is not implemented
|
||||
NULL, // GetProperty is not implemented
|
||||
NULL, // SetProperty is not implemented
|
||||
};
|
||||
|
||||
static NPObject* npobject = NULL;
|
||||
|
||||
NPError NPP_GetValue(NPP instance, NPPVariable variable, void* value) {
|
||||
NPError err = NPERR_NO_ERROR;
|
||||
|
||||
switch (variable) {
|
||||
case NPPVpluginNameString:
|
||||
*(reinterpret_cast<const char**>(value)) = "Pepper Test PlugIn";
|
||||
break;
|
||||
case NPPVpluginDescriptionString:
|
||||
*(reinterpret_cast<const char**>(value)) =
|
||||
"Simple Pepper plug-in for manual testing.";
|
||||
break;
|
||||
case NPPVpluginNeedsXEmbed:
|
||||
*(reinterpret_cast<NPBool*>(value)) = 1;
|
||||
break;
|
||||
case NPPVpluginScriptableNPObject: {
|
||||
if (npobject == NULL) {
|
||||
npobject = NPN_CreateObject(instance, &GodotClass);
|
||||
} else {
|
||||
NPN_RetainObject(npobject);
|
||||
};
|
||||
void** v = reinterpret_cast<void**>(value);
|
||||
*v = npobject;
|
||||
} break;
|
||||
default:
|
||||
fprintf(stderr, "Unhandled variable to NPP_GetValue\n");
|
||||
err = NPERR_GENERIC_ERROR;
|
||||
break;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
NPError NPP_SetValue(NPP instance, NPNVariable variable, void* value) {
|
||||
return NPERR_GENERIC_ERROR;
|
||||
}
|
||||
|
||||
NPError NP_GetValue(void* instance, NPPVariable variable, void* value) {
|
||||
return NPP_GetValue(reinterpret_cast<NPP>(instance), variable, value);
|
||||
}
|
||||
|
||||
char* NP_GetMIMEDescription() {
|
||||
return const_cast<char*>("pepper-application/x-pepper-test-plugin;");
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* platform_config.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* http://www.godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
#include <alloca.h>
|
Loading…
Reference in New Issue