/** * @author Edouard DUPIN * * @copyright 2010, Edouard DUPIN, all right reserved * * @license APACHE-2 (see license file) */ #include #include #include #include #include #include #include #include #include #include #include #include #include #undef __class__ #define __class__ "Windows" appl::Windows::Windows() { addObjectType("appl::Windows"); } static std::shared_ptr createViewBoxStar() { std::shared_ptr out = ege::resource::Mesh::create("viewBoxStar", "DATA:texturedNoMaterial.prog"); if (out != nullptr) { std::shared_ptr material = std::make_shared(); // set the element material properties : material->setAmbientFactor(vec4(1,1,1,1)); material->setDiffuseFactor(vec4(0,0,0,1)); material->setSpecularFactor(vec4(0,0,0,1)); material->setShininess(1); // 1024 == > 1<<9 // 2048 == > 1<<10 // 4096 == > 1<<11 int32_t size = 1<<11; //material->setTexture0(""); //" material->setTexture0Magic(ivec2(size,size)); out->addMaterial("basics", material); //material->setImageSize(ivec2(size,size)); egami::Image* myImage = material->get(); if (nullptr == myImage) { return out; } myImage->clear(etk::color::black); ivec2 tmpPos; for (int32_t iii=0; iii<6000; iii++) { tmpPos.setValue(etk::tool::frand(0,size), etk::tool::frand(0,size)) ; myImage->set(tmpPos, etk::color::white); } material->flush(); // basis on cube : out->createViewBox("basics", 1000/* distance */); // generate the VBO out->generateVBO(); } return out; } void appl::Windows::init() { ewol::widget::Windows::init(); setTitle("example ege : DoubleView"); //getObjectManager().periodicCall.bind(shared_from_this(), &appl::Windows::onCallbackPeriodicUpdateCamera); m_env = ege::Environement::create(); // Create basic Camera m_camera = std::make_shared(vec3(30,30,-100), vec3(0,0,0)); m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),40*std::cos(m_anglePsy))); m_env->addCamera("basic", m_camera); // Create basic Camera std::shared_ptr camera2 = std::make_shared(vec3(100,0,0), vec3(0,0,0)); m_env->addCamera("front", camera2); // Create basic Camera std::shared_ptr camera3 = std::make_shared(vec3(0,100,0), vec3(0,0,0)); m_env->addCamera("left", camera3); std::shared_ptr tmpSizerVert = ewol::widget::Sizer::create(ewol::widget::Sizer::modeVert); if (tmpSizerVert == nullptr) { APPL_CRITICAL("Can not allocate widget ==> display might be in error"); } else { setSubWidget(tmpSizerVert); std::shared_ptr tmpWidget = ege::widget::Scene::create(m_env); if (tmpWidget == nullptr) { APPL_CRITICAL("Can not allocate widget ==> display might be in error"); } else { tmpWidget->setExpand(bvec2(true,true)); tmpWidget->setFill(bvec2(true,true)); tmpWidget->setCamera("basic"); tmpSizerVert->subWidgetAdd(tmpWidget); tmpWidget->signalDisplayDebug.bind(shared_from_this(), &appl::Windows::onCallbackDisplayDebug); } std::shared_ptr tmpSizerHori = ewol::widget::Sizer::create(ewol::widget::Sizer::modeHori); if (tmpSizerHori == nullptr) { APPL_CRITICAL("Can not allocate widget ==> display might be in error"); } else { tmpSizerVert->subWidgetAdd(tmpSizerHori); tmpWidget = ege::widget::Scene::create(m_env); if (tmpWidget == nullptr) { APPL_CRITICAL("Can not allocate widget ==> display might be in error"); } else { tmpWidget->setExpand(bvec2(true,true)); tmpWidget->setFill(bvec2(true,true)); tmpWidget->setCamera("front"); tmpSizerHori->subWidgetAdd(tmpWidget); tmpWidget->signalDisplayDebug.bind(shared_from_this(), &appl::Windows::onCallbackDisplayDebug); } tmpWidget = ege::widget::Scene::create(m_env); if (tmpWidget == nullptr) { APPL_CRITICAL("Can not allocate widget ==> display might be in error"); } else { tmpWidget->setExpand(bvec2(true,true)); tmpWidget->setFill(bvec2(true,true)); tmpWidget->setCamera("left"); tmpSizerHori->subWidgetAdd(tmpWidget); tmpWidget->signalDisplayDebug.bind(shared_from_this(), &appl::Windows::onCallbackDisplayDebug); } } } std::shared_ptr myMesh; // Create an external box : myMesh = createViewBoxStar(); if (myMesh != nullptr) { m_env->addStaticMeshToDraw(myMesh); } // create basic gird: myMesh = ege::resource::Mesh::createGrid(10, vec3(0,0,0), 5); if (myMesh != nullptr) { m_env->addStaticMeshToDraw(myMesh); } myMesh = ege::resource::Mesh::createCube(3); if (myMesh != nullptr) { //std::shared_ptr element = std::make_shared(m_env); std::shared_ptr element = std::make_shared(m_env); // add physic interface: std::shared_ptr physic = std::make_shared(); physic->setSize(vec3(3.2,3.2,3.2)); myMesh->addPhysicElement(physic); element->setMesh(myMesh); element->createRigidBody(4000000); element->setPosition(vec3(20,10,10)); m_env->addElement(element); } myMesh = ege::resource::Mesh::createCube(3); if (myMesh != nullptr) { //element = std::make_shared(m_env); std::shared_ptr element = std::make_shared(m_env); // add physic interface: std::shared_ptr physic = std::make_shared(); physic->setRadius(4.5f); myMesh->addPhysicElement(physic); element->setMesh(myMesh); element->createRigidBody(4000000); element->setPosition(vec3(20,-10,10)); element->iaEnable(); m_env->addElement(element); } } bool appl::Windows::onEventInput(const ewol::event::Input& _event) { static float ploppp=1; if (_event.getId() == 1) { vec2 pos = relativePosition(_event.getPos()); // thsi is to simplify example ... pos *= vec2(1.0f, 2.0f); ege::Ray ray = m_camera->getRayFromScreenPosition(pos, m_size); m_ray = ray; APPL_DEBUG("pos=" << pos << " ray = " << ray); m_destination = ray.testRay(m_env->getPhysicEngine()); std::pair, std::pair> result = ray.testRayObject(m_env->getPhysicEngine()); if (result.first != nullptr) { APPL_INFO("Select Object :" << result.first->getUID()); } return true; } else if (_event.getId() == 4) { ploppp += 0.2f; m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),40*std::cos(m_anglePsy))*ploppp); } else if (_event.getId() == 5) { ploppp -= 0.2f; if (ploppp == 0) { ploppp = 1.0f; } m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),40*std::cos(m_anglePsy))*ploppp); } else if (_event.getId() == 3) { if (_event.getStatus() == ewol::key::statusDown) { m_oldScreenPos = relativePosition(_event.getPos()); return true; } else if (_event.getStatus() == ewol::key::statusMove) { vec2 pos = relativePosition(_event.getPos()); m_angleTetha -= (m_oldScreenPos.x()-pos.x())*0.05f; m_anglePsy += (m_oldScreenPos.y()-pos.y())*0.05f; m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),40*std::cos(m_anglePsy))*ploppp); m_oldScreenPos = relativePosition(_event.getPos()); return true; } } return false; } void appl::Windows::onCallbackDisplayDebug(const std::shared_ptr& _obj) { mat4 mat; mat.identity(); // Display ray line if (true) { static std::vector vertices; if (m_ray.getOrigin() != vec3(0,0,0)) { vertices.push_back(m_ray.getOrigin()); vertices.push_back(m_ray.getOrigin()+m_ray.getDirection()*50); // prevent Ray removing with empty m_ray.setOrigin(vec3(0,0,0)); } if (vertices.size() > 250) { vertices.erase(vertices.begin(), vertices.begin()+vertices.size()-250); } _obj->drawLine(vertices, etk::Color(0.0, 1.0, 0.0, 0.8), mat); } // display normal impact line if (true) { static std::vector vertices; if (m_destination.second != vec3(0,0,0)) { vertices.push_back(m_destination.first); vertices.push_back(m_destination.first + m_destination.second*20); m_destination.second = vec3(0,0,0); } if (vertices.size() > 250) { vertices.erase(vertices.begin(), vertices.begin()+vertices.size()-250); } _obj->drawLine(vertices, etk::Color(1.0, 0.0, 0.0, 0.8), mat); } }