4#include <Wt/WApplication.h>
5#include <Wt/WMemoryResource.h>
89 if (mods == Wt::KeyboardModifier::Control)
93 else if (mods == Wt::KeyboardModifier::Shift)
97 else if (mods == Wt::KeyboardModifier::Alt)
107 this->setLayoutSizeAware(
true);
108 this->setStyleClass(
"remote-framebuffer");
109 this->resize(
"100%",
"100%");
111 this->mouseWentUp().preventDefaultAction(
true);
112 this->mouseWentDown().preventDefaultAction(
true);
113 this->mouseDragged().preventDefaultAction(
true);
114 this->touchStarted().preventDefaultAction(
true);
115 this->touchMoved().preventDefaultAction(
true);
116 this->touchEnded().preventDefaultAction(
true);
126 this->setAttributeValue(
"oncontextmenu",
"return false;");
128 mApp = Wt::WApplication::instance();
130 mImage = this->addNew<Wt::WImage>();
131 mImage->resize(
"100%",
"100%");
133 mImage->setJavaScriptMember(
"currURL",
"null");
134 mImage->setJavaScriptMember(
"nextURL",
"null");
135 mImage->setJavaScriptMember(
"onload",
137 "this.currURL = this.nextURL;"
138 "this.nextURL = null;"
139 "if (this.currURL != null) {"
140 "this.src = this.currURL;"
142 "}.bind(" +
mImage->jsRef() +
")");
143 mImage->setJavaScriptMember(
"onerror",
145 "this.currURL = this.nextURL;"
146 "this.nextURL = null;"
147 "if (this.currURL != null) {"
148 "this.src = this.currURL;"
150 "}.bind(" +
mImage->jsRef() +
")");
151 mImage->setJavaScriptMember(
"update",
153 "if (this.currURL == null) {"
154 "this.currURL = url;"
155 "this.src = this.currURL;"
157 "this.nextURL = url;"
159 "}.bind(" +
mImage->jsRef() +
")");
164 mJpegResource = std::make_unique<Wt::WMemoryResource>(
"image/jpeg");
192 Wt::log(
"warning") <<
"WSimulationCanvas destory";
200 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
201 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
202 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
203 glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
208 Wt::log(
"error") <<
"Failed to create OpenGL context!";
220 ImGui::StyleColorsDark();
223 float xscale, yscale;
224 glfwGetMonitorContentScale(glfwGetPrimaryMonitor(), &xscale, &yscale);
228 mImWindow.setEnableViewManipulate(
false);
240 const unsigned int GL_COLOR_ATTACHMENT0 = 0x8CE0;
242 unsigned int buffers[]{ GL_COLOR_ATTACHMENT0 };
251 if (glfwGetCurrentContext() !=
mContext)
257 glfwMakeContextCurrent(NULL);
271 WContainerWidget::layoutSizeChanged(
width,
height);
281 if (evt.button() == Wt::MouseButton::Right)
286 Wt::Coordinates coord = evt.widget();
287 mCamera->registerPoint(coord.x, coord.y);
296 auto mods = evt.modifiers();
300 Wt::Coordinates coord = evt.widget();
301 if (evt.button() == Wt::MouseButton::Left) {
302 mCamera->rotateToPoint(coord.x, coord.y);
304 else if (evt.button() == Wt::MouseButton::Middle) {
305 mCamera->translateToPoint(coord.x, coord.y);
307 else if (evt.button() == Wt::MouseButton::Right) {
309 cam->zoom(-0.005 *
float(evt.widget().x -
mtempCursorX));
319 if (!
mImGuiCtx->handleMouseReleased(evt))
329 mCamera->zoom(-1.0 * evt.wheelDelta());
335 Wt::log(
"Error") <<
"´¥·¢ÁË";
341 mScene->onKeyboardEvent(keyEvent);
372 mScene->updateGraphicsContext();
418 Wt::log(
"info") <<
mCamera->viewportWidth() <<
" x " <<
mCamera->viewportHeight()
419 <<
", JPG size: " <<
mJpegBuffer.size() / 1024 <<
" kb";
426 mImage->callJavaScriptMember(
"update", WWebWidget::jsStringLiteral(url));
PModifierBits mappingWtModifierBits(Wt::KeyboardModifier mods)
std::map< Wt::Key, PKeyboardType > WKeyMap
std::unique_ptr< Wt::WMemoryResource > mJpegResource
void render(Wt::WFlags< Wt::RenderFlag > flags) override
std::vector< unsigned char > mImageData
ImGuiBackendWt * mImGuiCtx
void onMouseDrag(const Wt::WMouseEvent &evt)
void onMouseWheeled(const Wt::WMouseEvent &evt)
std::shared_ptr< dyno::SceneGraph > mScene
void layoutSizeChanged(int width, int height) override
std::vector< unsigned char > mJpegBuffer
void onKeyWentUp(const Wt::WKeyEvent &evt)
dyno::Texture2D mFrameColor
void onMouseReleased(const Wt::WMouseEvent &evt)
std::unique_ptr< ImageEncoder > mJpegEncoder
void setScene(std::shared_ptr< dyno::SceneGraph > scene)
void onKeyWentDown(const Wt::WKeyEvent &evt)
dyno::Framebuffer mFramebuffer
void onMousePressed(const Wt::WMouseEvent &evt)
virtual std::shared_ptr< Camera > getCamera()
std::shared_ptr< Camera > mCamera
RenderParams mRenderParams
std::shared_ptr< RenderEngine > mRenderEngine
virtual void setWindowSize(int w, int h)
This is an implementation of AdditiveCCD based on peridyno.