Ejemplo n.º 1
0
	void end_frame()
	{
#ifdef GRAPHICS
		draw_ui_scale();
		//renderGraph(vg, 5, 5, &fps_graph);
		//renderGraph(vg, 5 + 200 + 5, 5, &cpu_graph);
		if (gpu_timer.supported)
			renderGraph(vg, 5 + 200 + 5 + 200 + 5, 5, &gpu_graph);
		draw_world_scale();
		nvgEndFrame(vg);

		cpu_time = glfwGetTime() - render_start_time;

		updateGraph(&fps_graph, delta_time);
		updateGraph(&cpu_graph, cpu_time);

		float gpu_times[3];
		int n = stopGPUTimer(&gpu_timer, gpu_times, 3);
		for (int i = 0; i < n; i++)
			updateGraph(&gpu_graph, gpu_times[i]);

		glfwSwapBuffers(window);
		glfwPollEvents();
#endif
	}
Ejemplo n.º 2
0
void CorrespondenceEvaluate::generateInbetween(double t)
{
	auto scheduler = QSharedPointer<Scheduler>(new Scheduler);
	auto blender = QSharedPointer<TopoBlender>(new TopoBlender(GraphCorr, scheduler.data()));
	auto synthManager = QSharedPointer<SynthesisManager>(new SynthesisManager(GraphCorr, scheduler.data(), blender.data(), 1000));
	synthManager->genSynData();
	scheduler->timeStep = 1.0 / 100.0;
	scheduler->defaultSchedule();
	scheduler->executeAll();
	auto blendedModel = scheduler->allGraphs[t * (scheduler->allGraphs.size() - 1)];
	synthManager->renderGraph(*blendedModel, "test", false, 5);
}
Ejemplo n.º 3
0
void
StateGraphViewerPanel::show(std::shared_ptr<StateAccessToken> Access,
                            seec::cm::ProcessState const &Process,
                            seec::cm::ThreadState const &Thread)
{
  CurrentAccess = std::move(Access);
  CurrentProcess = &Process;
  MouseOver.reset();
  
  WebView->RunScript(wxString("InvalidateState();"));
  
  if (!WebView || PathToDot.empty())
    return;
  
  renderGraph();

  // Add special highlighting for values associated with the active Stmt.
  //
  if (!Thread.getCallStack().empty()) {
    seec::cm::FunctionState const &Fn = Thread.getCallStack().back();
    if (auto const Stmt = Fn.getActiveStmt()) {
      if (auto const Value = Fn.getStmtValue(Stmt)) {
        wxString Script("MarkActiveStmtValue(");
        Script << reinterpret_cast<uintptr_t>(Value.get()) << ");";

        if (auto const Ptr = llvm::dyn_cast<seec::cm::ValueOfPointer>
                                           (Value.get()))
        {
          if (Ptr->getDereferenceIndexLimit()) {
            if (auto const Pointee = Ptr->getDereferenced(0)) {
              Script << "MarkActiveStmtValue("
                     << reinterpret_cast<uintptr_t>(Pointee.get()) << ");";
            }
          }
        }

        WebView->RunScript(Script);
      }
    }
  }
}
Ejemplo n.º 4
0
void AutoBlend::doBlend()
{
	auto selected = gallery->getSelected();
	if (selected.size() < 2) return;

    for(auto t : results->items) t->deleteLater();
    results->items.clear();

    ((GraphicsScene*)scene())->showPopup("Please wait..");

    for(int shapeI = 0; shapeI < selected.size(); shapeI++)
    {
        for(int shapeJ = shapeI + 1; shapeJ < selected.size(); shapeJ++)
        {
            //auto sourceName = selected.front()->data["targetName"].toString();
            //auto targetName = selected.back()->data["targetName"].toString();

            auto sourceName = selected[shapeI]->data.value("targetName").toString();
            auto targetName = selected[shapeJ]->data.value("targetName").toString();

            auto cacheSource = document->cacheModel(sourceName);
            auto cacheTarget = document->cacheModel(targetName);

            if(cacheSource == nullptr || cacheTarget == nullptr) continue;

            auto source = QSharedPointer<Structure::Graph>(cacheSource->cloneAsShapeGraph());
			auto target = QSharedPointer<Structure::Graph>(cacheTarget->cloneAsShapeGraph());

			auto gcorr = QSharedPointer<GraphCorresponder>(new GraphCorresponder(source.data(), target.data()));

			// Apply computed correspondence
            //if (false) // enable/disable auto correspondence
			{
                QVector<QPair<QString, QString> > all_pairs;

                for(auto n : source->nodes)
                {
                    if (!document->datasetCorr[sourceName][n->id][targetName].empty())
                    {
                        for(auto nj : document->datasetCorr[sourceName][n->id][targetName])
                        {
                            all_pairs << qMakePair(n->id, nj);
                        }
                    }
                }

                ResolveCorrespondence(source.data(), target.data(), all_pairs, gcorr.data());
			}

            gcorr->computeCorrespondences();

            // Schedule blending sequence
            auto scheduler = QSharedPointer<Scheduler>(new Scheduler);
            auto blender = QSharedPointer<TopoBlender>(new TopoBlender(gcorr.data(), scheduler.data()));

            // Sample geometries
            int numSamples = 100;
            int reconLevel = 4;

            int LOD = widget->levelDetails->currentIndex();
            switch (LOD){
                case 0: numSamples = 100; reconLevel = 4; break;
                case 1: numSamples = 1000; reconLevel = 5; break;
                case 2: numSamples = 10000; reconLevel = 7; break;
            }

            /// Visualize schedule:
            if (false)
            {
                blender->parentWidget = new QMainWindow();
                blender->parentWidget->show();
                blender->setupUI();

                QStringList corr;
                for(auto n : scheduler->activeGraph->nodes){
                    corr << QString("%1-%2").arg(n->id, n->property["correspond"].toString());
                }

                QMessageBox::information(blender->parentWidget, "Correspondence", corr.join("\n"));
            }

            auto synthManager = QSharedPointer<SynthesisManager>(new SynthesisManager(gcorr.data(), scheduler.data(), blender.data(), numSamples));
            synthManager->genSynData();

            // Compute blending
            scheduler->timeStep = 1.0 / 100.0;
            scheduler->defaultSchedule();
            scheduler->executeAll();

            int numResults = widget->count->value();

            for (int i = 0; i < numResults; i++)
            {
                double a = ((double(i) / (numResults - 1)) * 0.9) + 0.05;
                auto blendedModel = scheduler->allGraphs[a * (scheduler->allGraphs.size() - 1)];

                synthManager->renderGraph(*blendedModel, "", false, reconLevel );

                auto t = results->addTextItem("");
                t->setCamera(cameraPos, cameraMatrix);

                QVariantMap data;
                data["name"] = QString("%1_%2").arg(sourceName).arg(targetName);
                t->setData(data);

                // Add parts of target shape
                for (auto n : blendedModel->nodes){
                    t->addAuxMesh(toBasicMesh(blendedModel->getMesh(n->id), n->vis_property["color"].value<QColor>()));
                }
            }
        }
    }

    ((GraphicsScene*)scene())->hidePopup();
}
Ejemplo n.º 5
0
int main()
{
	GLFWwindow* window;
	struct DemoData data;
	struct NVGcontext* vg = NULL;
	struct PerfGraph fps;
	double prevt = 0;

	if (!glfwInit()) {
		printf("Failed to init GLFW.");
		return -1;
	}

	initGraph(&fps, GRAPH_RENDER_FPS, "Frame Time");

	glfwSetErrorCallback(errorcb);

	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
#ifdef DEMO_MSAA
	glfwWindowHint(GLFW_SAMPLES, 4);
#endif

    window = glfwCreateWindow(1000, 600, "NanoVG", NULL, NULL);
//	window = glfwCreateWindow(1000, 600, "NanoVG", glfwGetPrimaryMonitor(), NULL);
	if (!window) {
		glfwTerminate();
		return -1;
	}

	glfwSetKeyCallback(window, key);

	glfwMakeContextCurrent(window);
#ifdef NANOVG_GLEW
    if(glewInit() != GLEW_OK) {
		printf("Could not init glew.\n");
		return -1;
	}
#endif

#ifdef DEMO_MSAA
	vg = nvgCreateGL2(512, 512, 0);
#else
	vg = nvgCreateGL2(512, 512, NVG_ANTIALIAS);
#endif
	if (vg == NULL) {
		printf("Could not init nanovg.\n");
		return -1;
	}

	if (loadDemoData(vg, &data) == -1)
		return -1;

	glfwSwapInterval(0);

	glfwSetTime(0);
	prevt = glfwGetTime();

	while (!glfwWindowShouldClose(window))
	{
		double mx, my, t, dt;
		int winWidth, winHeight;
		int fbWidth, fbHeight;
		float pxRatio;

		t = glfwGetTime();
		dt = t - prevt;
		prevt = t;
		updateGraph(&fps, dt);

		glfwGetCursorPos(window, &mx, &my);
		glfwGetWindowSize(window, &winWidth, &winHeight);
		glfwGetFramebufferSize(window, &fbWidth, &fbHeight);

		// Calculate pixel ration for hi-dpi devices.
		pxRatio = (float)fbWidth / (float)winWidth;

		// Update and render
		glViewport(0, 0, fbWidth, fbHeight);
		if (premult)
			glClearColor(0,0,0,0);
		else
			glClearColor(0.3f, 0.3f, 0.32f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);

		nvgBeginFrame(vg, winWidth, winHeight, pxRatio, premult ? NVG_PREMULTIPLIED_ALPHA : NVG_STRAIGHT_ALPHA);

		renderDemo(vg, mx,my, winWidth,winHeight, t, blowup, &data);
		renderGraph(vg, 5,5, &fps);

		nvgEndFrame(vg);

		if (screenshot) {
			screenshot = 0;
			saveScreenShot(fbWidth, fbHeight, premult, "dump.png");
		}
		
		glfwSwapBuffers(window);
		glfwPollEvents();
	}

	freeDemoData(vg, &data);

	nvgDeleteGL2(vg);

	glfwTerminate();
	return 0;
}
Ejemplo n.º 6
0
int main()
{
	GLFWwindow* window;
	struct DemoData data;
	struct NVGcontext* vg = NULL;
	struct GPUtimer gpuTimer;
	struct PerfGraph fps, cpuGraph, gpuGraph;
	double prevt = 0, cpuTime = 0;

	if (!glfwInit()) {
		printf("Failed to init GLFW.");
		return -1;
	}

	initGraph(&fps, GRAPH_RENDER_FPS, "Frame Time");
	initGraph(&cpuGraph, GRAPH_RENDER_MS, "CPU Time");
	initGraph(&gpuGraph, GRAPH_RENDER_MS, "GPU Time");

	glfwSetErrorCallback(errorcb);
#ifndef _WIN32 // don't require this on win32, and works with more cards
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
	glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#endif

#ifdef DEMO_MSAA
	glfwWindowHint(GLFW_SAMPLES, 4);
#endif
	window = glfwCreateWindow(1000, 600, "NanoVG", NULL, NULL);
//	window = glfwCreateWindow(1000, 600, "NanoVG", glfwGetPrimaryMonitor(), NULL);
	if (!window) {
		glfwTerminate();
		return -1;
	}

	glfwSetKeyCallback(window, key);

	glfwMakeContextCurrent(window);
#ifdef NANOVG_GLEW
	glewExperimental = GL_TRUE;
	if(glewInit() != GLEW_OK) {
		printf("Could not init glew.\n");
		return -1;
	}
#endif

#ifdef DEMO_MSAA
	vg = nvgCreateGL3(512, 512, 0);
#else
	vg = nvgCreateGL3(512, 512, NVG_ANTIALIAS);
#endif
	if (vg == NULL) {
		printf("Could not init nanovg.\n");
		return -1;
	}

	if (loadDemoData(vg, &data) == -1)
		return -1;

	glfwSwapInterval(0);

	initGPUTimer(&gpuTimer);

	glfwSetTime(0);
	prevt = glfwGetTime();

	while (!glfwWindowShouldClose(window))
	{
		double mx, my, t, dt;
		int winWidth, winHeight;
		int fbWidth, fbHeight;
		float pxRatio;
		float gpuTimes[3];
		int i, n;

		t = glfwGetTime();
		dt = t - prevt;
		prevt = t;

		startGPUTimer(&gpuTimer);

		glfwGetCursorPos(window, &mx, &my);
		glfwGetWindowSize(window, &winWidth, &winHeight);
		glfwGetFramebufferSize(window, &fbWidth, &fbHeight);
		// Calculate pixel ration for hi-dpi devices.
		pxRatio = (float)fbWidth / (float)winWidth;

		// Update and render
		glViewport(0, 0, fbWidth, fbHeight);
		if (premult)
			glClearColor(0,0,0,0);
		else
			glClearColor(0.3f, 0.3f, 0.32f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);

		glEnable(GL_BLEND);
		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
		glEnable(GL_CULL_FACE);
		glDisable(GL_DEPTH_TEST);

		nvgBeginFrame(vg, winWidth, winHeight, pxRatio, premult ? NVG_PREMULTIPLIED_ALPHA : NVG_STRAIGHT_ALPHA);

		renderDemo(vg, mx,my, winWidth,winHeight, t, blowup, &data);

		renderGraph(vg, 5,5, &fps);
		renderGraph(vg, 5+200+5,5, &cpuGraph);
		if (gpuTimer.supported)
			renderGraph(vg, 5+200+5+200+5,5, &gpuGraph);

		nvgEndFrame(vg);

		glEnable(GL_DEPTH_TEST);

		// Measure the CPU time taken excluding swap buffers (as the swap may wait for GPU)
		cpuTime = glfwGetTime() - t;

		updateGraph(&fps, dt);
		updateGraph(&cpuGraph, cpuTime);

		// We may get multiple results.
		n = stopGPUTimer(&gpuTimer, gpuTimes, 3);
		for (i = 0; i < n; i++)
			updateGraph(&gpuGraph, gpuTimes[i]);

		if (screenshot) {
			screenshot = 0;
			saveScreenShot(fbWidth, fbHeight, premult, "dump.png");
		}

		glfwSwapBuffers(window);
		glfwPollEvents();
	}

	freeDemoData(vg, &data);

	nvgDeleteGL3(vg);

	printf("Average Frame Time: %.2f ms\n", getGraphAverage(&fps) * 1000.0f);
	printf("          CPU Time: %.2f ms\n", getGraphAverage(&cpuGraph) * 1000.0f);
	printf("          GPU Time: %.2f ms\n", getGraphAverage(&gpuGraph) * 1000.0f);

	glfwTerminate();
	return 0;
}
Ejemplo n.º 7
0
int main()
{
	GLFWwindow* window;
	DemoData data;
	NVGcontext* vg = NULL;
	PerfGraph fps;
	double prevt = 0;

	if (!glfwInit()) {
		printf("Failed to init GLFW.");
		return -1;
	}

	initGraph(&fps, GRAPH_RENDER_FPS, "Frame Time");

	glfwSetErrorCallback(errorcb);

	glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);

	window = glfwCreateWindow(1000, 600, "NanoVG", NULL, NULL);
//	window = glfwCreateWindow(1000, 600, "NanoVG", glfwGetPrimaryMonitor(), NULL);
	if (!window) {
		glfwTerminate();
		return -1;
	}

	glfwSetKeyCallback(window, key);

	glfwMakeContextCurrent(window);

	vg = nvgCreateGLES2(NVG_ANTIALIAS | NVG_STENCIL_STROKES | NVG_DEBUG);
	if (vg == NULL) {
		printf("Could not init nanovg.\n");
		return -1;
	}

	if (loadDemoData(vg, &data) == -1)
		return -1;

	glfwSwapInterval(0);

	glfwSetTime(0);
	prevt = glfwGetTime();

	while (!glfwWindowShouldClose(window))
	{
		double mx, my, t, dt;
		int winWidth, winHeight;
		int fbWidth, fbHeight;
		float pxRatio;

		t = glfwGetTime();
		dt = t - prevt;
		prevt = t;
		updateGraph(&fps, dt);

		glfwGetCursorPos(window, &mx, &my);
		glfwGetWindowSize(window, &winWidth, &winHeight);
		glfwGetFramebufferSize(window, &fbWidth, &fbHeight);
		// Calculate pixel ration for hi-dpi devices.
		pxRatio = (float)fbWidth / (float)winWidth;

		// Update and render
		glViewport(0, 0, fbWidth, fbHeight);
		if (premult)
			glClearColor(0,0,0,0);
		else
			glClearColor(0.3f, 0.3f, 0.32f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);

		glEnable(GL_BLEND);
		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
		glEnable(GL_CULL_FACE);
		glDisable(GL_DEPTH_TEST);

		nvgBeginFrame(vg, winWidth, winHeight, pxRatio);

		renderDemo(vg, mx,my, winWidth,winHeight, t, blowup, &data);
		renderGraph(vg, 5,5, &fps);

		nvgEndFrame(vg);

		if (screenshot) {
			screenshot = 0;
			saveScreenShot(fbWidth, fbHeight, premult, "dump.png");
		}
		
		glEnable(GL_DEPTH_TEST);

		glfwSwapBuffers(window);
		glfwPollEvents();
	}

	freeDemoData(vg, &data);

	nvgDeleteGLES2(vg);

	glfwTerminate();
	return 0;
}
Ejemplo n.º 8
0
    void Camera::operator ()()
    {
        if (!pContext->getContext()->isValid())
            return;
        pContext->makeCurrent();

        CHECK_GL();

        if (ptex)
        {
            if (pContext->getTextureID(ptex) != fbo->getColorTexture())
                fbo->setColorTarget(GL_TEXTURE_2D, pContext->getTextureID(ptex), ptex->getTextureWidth(), ptex->getTextureHeight());
        }

        fbo->bind();
        CHECK_GL();
        glClearColor(0,0,0,0);
        CHECK_GL();
        glClear(GL_COLOR_BUFFER_BIT);
        CHECK_GL();

        if (background)     // background image
        {
            glClear(GL_DEPTH_BUFFER_BIT);
            CHECK_GL();
            glMatrixMode(GL_PROJECTION);
            CHECK_GL();
            glLoadIdentity();
            CHECK_GL();
            gluOrtho2D(0.0, 1.0, 1.0, 0.0);
            CHECK_GL();
            glMatrixMode(GL_MODELVIEW);
            CHECK_GL();
            glLoadIdentity();
            CHECK_GL();

            const GLuint pid = pContext->getProgramID(background_program);
            glUseProgram(pid);
            glUniform1i(glGetUniformLocation(pid, "tex"), 0);
            const osg::Matrixf mat(viewMatrix);
            glUniformMatrix4fv(glGetUniformLocation(pid, "viewMatrix"), 1, GL_FALSE, mat.ptr());
            glUniform1f(glGetUniformLocation(pid, "fov"), fov * M_PI / 180.0);
            glUniform1f(glGetUniformLocation(pid, "aspectRatio"), aspectRatio);

            glActiveTexture(GL_TEXTURE0);
            CHECK_GL();
            glDisable(GL_TEXTURE_CUBE_MAP);
            CHECK_GL();
            glEnable(GL_TEXTURE_2D);
            CHECK_GL();
            glBindTexture(GL_TEXTURE_2D, pContext->getTextureID(background));
            CHECK_GL();
            glDisable(GL_CULL_FACE);
            CHECK_GL();

            glBegin(GL_QUADS);
            glVertex2f(0.f,0.f);
            glVertex2f(1.f,0.f);
            glVertex2f(1.f,1.f);
            glVertex2f(0.f,1.f);
            glEnd();

            glUseProgram(0);
        }
        else if (starmap)   // background star map
        {
            glClear(GL_DEPTH_BUFFER_BIT);
            CHECK_GL();
            glMatrixMode(GL_PROJECTION);
            CHECK_GL();
            projectionMatrix = Matrixd::perspective(fov, aspectRatio, 0.5f, 2.f);
            glLoadMatrixd(projectionMatrix.ptr());
            CHECK_GL();
            glMatrixMode(GL_MODELVIEW);
            CHECK_GL();
            glLoadMatrixd(viewMatrix.ptr());
            CHECK_GL();

            const GLuint pid = pContext->getProgramID(background_program);
            glUseProgram(pid);
            CHECK_GL();

            glActiveTexture(GL_TEXTURE0);
            CHECK_GL();
            glDisable(GL_TEXTURE_CUBE_MAP);
            CHECK_GL();
            glDisable(GL_TEXTURE_2D);
            CHECK_GL();
            glDisable(GL_CULL_FACE);
            CHECK_GL();

            glEnableClientState(GL_VERTEX_ARRAY);
            CHECK_GL();
            glEnableClientState(GL_COLOR_ARRAY);
            CHECK_GL();
            glDisableClientState(GL_NORMAL_ARRAY);
            CHECK_GL();
            glDisableClientState(GL_TEXTURE_COORD_ARRAY);
            CHECK_GL();
            if (pContext->hasVBOSupport())
            {
                glBindBuffer(GL_ARRAY_BUFFER, pContext->getDataVBOID(starmap->getDataPointer(), starmap->getTotalDataSize()));
                CHECK_GL();
                glVertexPointer(3,GL_FLOAT,12,0);
                CHECK_GL();
                glColorPointer(3,GL_FLOAT,12,(const GLvoid*)12);
                CHECK_GL();
            }
            else
            {
                glVertexPointer(3,GL_FLOAT,12,starmap->getDataPointer());
                CHECK_GL();
                glColorPointer(3,GL_FLOAT,12,(const char*)(starmap->getDataPointer()) + 12);
                CHECK_GL();
            }

            glEnable(GL_COLOR_MATERIAL);
            CHECK_GL();
            glEnable(GL_POINT_SPRITE);
            CHECK_GL();
            glPointSize(4.0f);
            CHECK_GL();

            glDrawArrays(GL_POINTS, 0, starmap->size() / 2);
            CHECK_GL();

            glDisableClientState(GL_COLOR_ARRAY);
            CHECK_GL();
            glPointSize(1.0f);
            CHECK_GL();
            glDisable(GL_POINT_SPRITE);
            CHECK_GL();
            glDisable(GL_COLOR_MATERIAL);
            CHECK_GL();

            if (pContext->hasVBOSupport())
            {
                glBindBuffer(GL_ARRAY_BUFFER, 0);
                CHECK_GL();
            }

            glUseProgram(0);
        }

        std::vector<std::pair<double, double> > depthRange;
        qMatrix.clear();
        qMatrix.push_back(viewMatrix);

        computeDepthRanges(scene, depthRange);
        computeMinimumRanges(depthRange);

        for(std::vector<std::pair<double, double> >::const_iterator range = depthRange.begin()
            ; range != depthRange.end()
            ; ++range)
        {
            glClear(GL_DEPTH_BUFFER_BIT);
            CHECK_GL();
            glMatrixMode(GL_PROJECTION);
            CHECK_GL();
            projectionMatrix = Matrixd::perspective(fov, aspectRatio, range->first, range->second);
            glLoadMatrixd(projectionMatrix.ptr());
            CHECK_GL();

            znear = range->first;
            zfar = range->second;

            glMatrixMode(GL_MODELVIEW);
            CHECK_GL();
            clearMatrixStack();
            CHECK_GL();

            glDisable(GL_TEXTURE_2D);
            CHECK_GL();
            glDisable(GL_TEXTURE_CUBE_MAP);
            CHECK_GL();
            glDisable(GL_COLOR_MATERIAL);
            CHECK_GL();
            glColor4ub(0xFF, 0xFF, 0xFF, 0xFF);
            CHECK_GL();
            glDisable(GL_BLEND);
            CHECK_GL();
            glDisable(GL_LIGHTING);
            CHECK_GL();
            glDisable(GL_CULL_FACE);
            CHECK_GL();
            glShadeModel(GL_SMOOTH);
            CHECK_GL();
            glEnable(GL_DEPTH_TEST);
            CHECK_GL();
            glDepthFunc(GL_LESS);
            CHECK_GL();

            qStateSet.clear();
            qStateSet.push_back(StateSet());
            /** Cubemaps cannot be used to override the background texture
              * which is a GL_TEXTURE_2D so we just render to a GL_TEXTURE_2D,
              * use it as background texture and copy it to the cubemap
              */
            if (ptexcube)
                qStateSet.back().setTexture(7, GL_TEXTURE_2D, fbo->getColorTexture(), osg::StateAttribute::OVERRIDE);

            renderGraph(scene);
        }
        glDisableClientState(GL_COLOR_ARRAY);
        CHECK_GL();

        if (ptexcube)
        {
            glBindTexture(GL_TEXTURE_CUBE_MAP, pContext->getTextureID(ptexcube));
            CHECK_GL();
            glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + cube_face_id, 0, 0, 0, 0, 0, fbo->getWidth(), fbo->getHeight());
            CHECK_GL();
        }

        fbo->release();

        glUseProgram(0);
        CHECK_GL();
        for(int i = 15 ; i >= 0 ; --i)
        {
            glActiveTexture(GL_TEXTURE0 + i);
            CHECK_GL();
            glDisable(GL_TEXTURE_2D);
            CHECK_GL();
            glDisable(GL_TEXTURE_CUBE_MAP);
            CHECK_GL();
        }
    }
Ejemplo n.º 9
0
    void Camera::renderGraph(const Node *graph)
    {
        if (!graph || dynamic_cast<const osg::Camera*>(graph))
            return;

        const osg::BoundingSphered &bound = computeBoundsOf(graph);
        const double r = bound.radius();
        const Vec3d view_center = bound.center() * qMatrix.back();
        if (-view_center.z() + r < znear || -view_center.z() - r > zfar)
            return;

        bool bPopMatrix = false;

        const osg::StateSet *stateset = graph->getStateSet();
        if (stateset)
        {
            qStateSet.push_back(qStateSet.back());
            processStateSet(stateset, qStateSet.back());
        }

        const PositionAttitudeTransform *ptrans = dynamic_cast<const PositionAttitudeTransform*>(graph);
        if (ptrans)
        {
            const Matrixd mat = Matrixd::translate(-ptrans->getPivotPoint())
                               * Matrixd::rotate(ptrans->getAttitude())
                               * Matrixd::scale(ptrans->getScale())
                               * Matrixd::translate(ptrans->getPosition());
            pushMatrix(mat);
            bPopMatrix = true;
        }
        const MatrixTransform *mtrans = dynamic_cast<const MatrixTransform*>(graph);
        if (mtrans)
        {
            pushMatrix(mtrans->getMatrix());
            bPopMatrix = true;
        }

        const Switch* sgroup = dynamic_cast<const Switch*>(graph);
        if (sgroup)
        {
            for(unsigned int i = 0, nb = sgroup->getNumChildren() ; i < nb ; ++i)
                if (sgroup->getValue(i))
                    renderGraph(sgroup->getChild(i));
        }
        else
        {
            const Group* group = dynamic_cast<const Group*>(graph);
            if (group)
            {
                for(unsigned int i = 0, nb = group->getNumChildren() ; i < nb ; ++i)
                    renderGraph(group->getChild(i));
            }
        }

        const Geode *geode = dynamic_cast<const Geode*>(graph);
        if (geode)
        {
            glEnableClientState(GL_VERTEX_ARRAY);
            CHECK_GL();
            bool bParentStateApplied = false;
            for(unsigned int i = 0, nb = geode->getNumDrawables() ; i < nb ; ++i)
            {
                const Geometry * const geom = geode->getDrawable(i)->asGeometry();
                if (!geom)
                {
                    LOG_ERROR() << "[Camera] unsupported drawable : " << geode->getDrawable(i)->className() << std::endl;
                    continue;
                }

                const Array * const vtx = geom->getVertexArray();
                const Array * const normals = geom->getNormalArray();
                const Array * const tcoord = geom->getTexCoordArray(0);

                if (!vtx)
                {
                    LOG_ERROR() << "[Camera] no vertex array in Geometry object" << std::endl;
                    continue;
                }

                StateSet *local_state = NULL;
                char tmp[sizeof(StateSet)];     //! Avoid dynamic allocation
                const osg::StateSet *geom_state = geom->getStateSet();

                if (geom_state)
                {
                    local_state = new(tmp) StateSet(qStateSet.back());
                    processStateSet(geom_state, *local_state);
                }

                if (local_state)
                {
                    local_state->apply();
                    bParentStateApplied = false;
                }
                else if (!bParentStateApplied)
                {
                    bParentStateApplied = true;
                    qStateSet.back().apply();
                }

                if (bDoublePrecisionMode)
                {
                    if (processed_vertex_array.size() < vtx->getNumElements())
                        processed_vertex_array.resize(vtx->getNumElements());
                    const void * const ptr = vtx->getDataPointer();
                    const osg::Matrixd &mat = qMatrix.back() * projectionMatrix;
                    switch(vtx->getDataType())
                    {
                    case GL_FLOAT:
                        if (vtx->getDataSize() == 4)
                        {
                            const size_t nb = vtx->getNumElements();
                            for(size_t i = 0 ; i < nb ; ++i)
                            {
                                const Vec4d &p = Vec4d(((const Vec4f*)ptr)[i]) * mat;
                                processed_vertex_array[i] = p / p.w();
                            }
                        }
                        else if (vtx->getDataSize() == 3)
                        {
                            const size_t nb = vtx->getNumElements();
                            for(size_t i = 0 ; i < nb ; ++i)
                            {
                                const Vec4d &p = Vec4d(((const Vec3f*)ptr)[i], 1.0) * mat;
                                processed_vertex_array[i] = p / p.w();
                            }
                        }
                        break;
                    }

                    glEnableClientState(GL_COLOR_ARRAY);
                    CHECK_GL();
                    if (pContext->hasVBOSupport())
                    {
                        glBindBuffer(GL_ARRAY_BUFFER, 0);
                        CHECK_GL();
                    }
                    glColorPointer(4, GL_FLOAT, 0, &(processed_vertex_array.front()));
                    CHECK_GL();
                }

                if (pContext->hasVBOSupport())
                {
                    glBindBuffer(GL_ARRAY_BUFFER, pContext->getDataVBOID(vtx->getDataPointer(), vtx->getTotalDataSize()));
                    CHECK_GL();
                    glVertexPointer(vtx->getDataSize(), vtx->getDataType(), 0, 0);
                    CHECK_GL();
                    if (normals)
                    {
                        glEnableClientState(GL_NORMAL_ARRAY);
                        CHECK_GL();
                        glBindBuffer(GL_ARRAY_BUFFER, pContext->getDataVBOID(normals->getDataPointer(), normals->getTotalDataSize()));
                        CHECK_GL();
                        glNormalPointer(normals->getDataType(), 0, 0);
                        CHECK_GL();
                    }
                    else
                    {
                        glDisableClientState(GL_NORMAL_ARRAY);
                        CHECK_GL();
                    }
                    if (tcoord)
                    {
                        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
                        CHECK_GL();
                        glBindBuffer(GL_ARRAY_BUFFER, pContext->getDataVBOID(tcoord->getDataPointer(), tcoord->getTotalDataSize()));
                        CHECK_GL();
                        glTexCoordPointer(tcoord->getDataSize(), tcoord->getDataType(), 0, 0);
                        CHECK_GL();
                    }
                    else
                    {
                        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
                        CHECK_GL();
                    }

                    const size_t nb_prim_set = geom->getNumPrimitiveSets();
                    for(size_t j = 0 ; j < nb_prim_set ; ++j)
                    {
                        const PrimitiveSet * const pset = geom->getPrimitiveSet(j);
                        const DrawElements * const elts = pset->getDrawElements();
                        switch(pset->getType())
                        {
                        case DrawElements::PrimitiveType:
                            break;
                        case DrawElements::DrawArraysPrimitiveType:
                            glDrawArrays(pset->getMode(), pset->index(0), pset->getNumIndices());
                            CHECK_GL();
                            break;
                        case DrawElements::DrawArrayLengthsPrimitiveType:   break;
                        case DrawElements::DrawElementsUBytePrimitiveType:
                            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, pContext->getIndexVBOID(elts->getDataPointer(), elts->getTotalDataSize()));
                            CHECK_GL();
                            glDrawRangeElements(elts->getMode(), 0, vtx->getNumElements() - 1, elts->getNumIndices(), GL_UNSIGNED_BYTE, 0);
                            CHECK_GL();
                            break;
                        case DrawElements::DrawElementsUShortPrimitiveType:
                            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, pContext->getIndexVBOID(elts->getDataPointer(), elts->getTotalDataSize()));
                            CHECK_GL();
                            glDrawRangeElements(elts->getMode(), 0, vtx->getNumElements() - 1, elts->getNumIndices(), GL_UNSIGNED_SHORT, 0);
                            CHECK_GL();
                            break;
                        case DrawElements::DrawElementsUIntPrimitiveType:
                            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, pContext->getIndexVBOID(elts->getDataPointer(), elts->getTotalDataSize()));
                            CHECK_GL();
                            glDrawRangeElements(elts->getMode(), 0, vtx->getNumElements() - 1, elts->getNumIndices(), GL_UNSIGNED_INT, 0);
                            CHECK_GL();
                            break;
                        }
                    }
                }
                else
                {
                    glVertexPointer(vtx->getDataSize(), vtx->getDataType(), 0, vtx->getDataPointer());
                    CHECK_GL();
                    if (normals)
                    {
                        glEnableClientState(GL_NORMAL_ARRAY);
                        CHECK_GL();
                        glNormalPointer(normals->getDataType(), 0, normals->getDataPointer());
                        CHECK_GL();
                    }
                    else
                    {
                        glDisableClientState(GL_NORMAL_ARRAY);
                        CHECK_GL();
                    }
                    if (tcoord)
                    {
                        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
                        CHECK_GL();
                        glTexCoordPointer(tcoord->getDataSize(), tcoord->getDataType(), 0, tcoord->getDataPointer());
                        CHECK_GL();
                    }
                    else
                    {
                        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
                        CHECK_GL();
                    }

                    const size_t nb_prim_set = geom->getNumPrimitiveSets();
                    for(size_t j = 0 ; j < nb_prim_set ; ++j)
                    {
                        const PrimitiveSet * const pset = geom->getPrimitiveSet(j);
                        const DrawElements * const elts = pset->getDrawElements();
                        switch(pset->getType())
                        {
                        case DrawElements::PrimitiveType:
                            break;
                        case DrawElements::DrawArraysPrimitiveType:
                            glDrawArrays(pset->getMode(), pset->index(0), pset->getNumIndices());
                            CHECK_GL();
                            break;
                        case DrawElements::DrawArrayLengthsPrimitiveType:   break;
                        case DrawElements::DrawElementsUBytePrimitiveType:
                            glDrawRangeElements(elts->getMode(), 0, vtx->getNumElements() - 1, elts->getNumIndices(), GL_UNSIGNED_BYTE, elts->getDataPointer());
                            CHECK_GL();
                            break;
                        case DrawElements::DrawElementsUShortPrimitiveType:
                            glDrawRangeElements(elts->getMode(), 0, vtx->getNumElements() - 1, elts->getNumIndices(), GL_UNSIGNED_SHORT, elts->getDataPointer());
                            CHECK_GL();
                            break;
                        case DrawElements::DrawElementsUIntPrimitiveType:
                            glDrawRangeElements(elts->getMode(), 0, vtx->getNumElements() - 1, elts->getNumIndices(), GL_UNSIGNED_INT, elts->getDataPointer());
                            CHECK_GL();
                            break;
                        }
                    }
                }
                if (local_state)
                    local_state->~StateSet();
            }
        }

        if (bPopMatrix)
            popMatrix();
        if (stateset)
            qStateSet.pop_back();
    }
Ejemplo n.º 10
0
int main()
{
	GLFWwindow* window;
	NVGcontext* vg = NULL;
	GPUtimer gpuTimer;
	PerfGraph fps, cpuGraph, gpuGraph;
	double prevt = 0, cpuTime = 0;
	NVGLUframebuffer* fb = NULL;
	int winWidth, winHeight;
	int fbWidth, fbHeight;
	float pxRatio;

	if (!glfwInit()) {
		printf("Failed to init GLFW.");
		return -1;
	}

	initGraph(&fps, GRAPH_RENDER_FPS, "Frame Time");
	initGraph(&cpuGraph, GRAPH_RENDER_MS, "CPU Time");
	initGraph(&gpuGraph, GRAPH_RENDER_MS, "GPU Time");

	glfwSetErrorCallback(errorcb);
#ifndef _WIN32 // don't require this on win32, and works with more cards
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
	glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#endif
	glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, 1);

#ifdef DEMO_MSAA
	glfwWindowHint(GLFW_SAMPLES, 4);
#endif
	window = glfwCreateWindow(1000, 600, "NanoVG", NULL, NULL);
//	window = glfwCreateWindow(1000, 600, "NanoVG", glfwGetPrimaryMonitor(), NULL);
	if (!window) {
		glfwTerminate();
		return -1;
	}

	glfwSetKeyCallback(window, key);

	glfwMakeContextCurrent(window);
#ifdef NANOVG_GLEW
	glewExperimental = GL_TRUE;
	if(glewInit() != GLEW_OK) {
		printf("Could not init glew.\n");
		return -1;
	}
	// GLEW generates GL error because it calls glGetString(GL_EXTENSIONS), we'll consume it here.
	glGetError();
#endif

#ifdef DEMO_MSAA
	vg = nvgCreateGL3(NVG_STENCIL_STROKES | NVG_DEBUG);
#else
	vg = nvgCreateGL3(NVG_ANTIALIAS | NVG_STENCIL_STROKES | NVG_DEBUG);
#endif
	if (vg == NULL) {
		printf("Could not init nanovg.\n");
		return -1;
	}

	// Create hi-dpi FBO for hi-dpi screens.
	glfwGetWindowSize(window, &winWidth, &winHeight);
	glfwGetFramebufferSize(window, &fbWidth, &fbHeight);
	// Calculate pixel ration for hi-dpi devices.
	pxRatio = (float)fbWidth / (float)winWidth;

	// The image pattern is tiled, set repeat on x and y.
	fb = nvgluCreateFramebuffer(vg, (int)(100*pxRatio), (int)(100*pxRatio), NVG_IMAGE_REPEATX | NVG_IMAGE_REPEATY);
	if (fb == NULL) {
		printf("Could not create FBO.\n");
		return -1;
	}

	if (loadFonts(vg) == -1) {
		printf("Could not load fonts\n");
		return -1;
	}

	glfwSwapInterval(0);

	initGPUTimer(&gpuTimer);

	glfwSetTime(0);
	prevt = glfwGetTime();

	while (!glfwWindowShouldClose(window))
	{
		double mx, my, t, dt;
		float gpuTimes[3];
		int i, n;

		t = glfwGetTime();
		dt = t - prevt;
		prevt = t;

		startGPUTimer(&gpuTimer);

		glfwGetCursorPos(window, &mx, &my);
		glfwGetWindowSize(window, &winWidth, &winHeight);
		glfwGetFramebufferSize(window, &fbWidth, &fbHeight);
		// Calculate pixel ration for hi-dpi devices.
		pxRatio = (float)fbWidth / (float)winWidth;

		renderPattern(vg, fb, t, pxRatio);

		// Update and render
		glViewport(0, 0, fbWidth, fbHeight);
		glClearColor(0.3f, 0.3f, 0.32f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);

		nvgBeginFrame(vg, winWidth, winHeight, pxRatio);

		// Use the FBO as image pattern.
		if (fb != NULL) {
			NVGpaint img = nvgImagePattern(vg, 0, 0, 100, 100, 0, fb->image, 1.0f);
			nvgSave(vg);

			for (i = 0; i < 20; i++) {
				nvgBeginPath(vg);
				nvgRect(vg, 10 + i*30,10, 10, winHeight-20);
				nvgFillColor(vg, nvgHSLA(i/19.0f, 0.5f, 0.5f, 255));
				nvgFill(vg);
			}

			nvgBeginPath(vg);
			nvgRoundedRect(vg, 140 + sinf(t*1.3f)*100, 140 + cosf(t*1.71244f)*100, 250, 250, 20);
			nvgFillPaint(vg, img);
			nvgFill(vg);
			nvgStrokeColor(vg, nvgRGBA(220,160,0,255));
			nvgStrokeWidth(vg, 3.0f);
			nvgStroke(vg);

			nvgRestore(vg);
		}

		renderGraph(vg, 5,5, &fps);
		renderGraph(vg, 5+200+5,5, &cpuGraph);
		if (gpuTimer.supported)
			renderGraph(vg, 5+200+5+200+5,5, &gpuGraph);

		nvgEndFrame(vg);

		// Measure the CPU time taken excluding swap buffers (as the swap may wait for GPU)
		cpuTime = glfwGetTime() - t;

		updateGraph(&fps, dt);
		updateGraph(&cpuGraph, cpuTime);

		// We may get multiple results.
		n = stopGPUTimer(&gpuTimer, gpuTimes, 3);
		for (i = 0; i < n; i++)
			updateGraph(&gpuGraph, gpuTimes[i]);

		glfwSwapBuffers(window);
		glfwPollEvents();
	}

	nvgluDeleteFramebuffer(fb);

	nvgDeleteGL3(vg);

	printf("Average Frame Time: %.2f ms\n", getGraphAverage(&fps) * 1000.0f);
	printf("          CPU Time: %.2f ms\n", getGraphAverage(&cpuGraph) * 1000.0f);
	printf("          GPU Time: %.2f ms\n", getGraphAverage(&gpuGraph) * 1000.0f);

	glfwTerminate();
	return 0;
}