[DEV] basic FPS view with so beautifull grass

This commit is contained in:
Edouard DUPIN 2012-12-19 21:57:40 +01:00
parent cc07a77377
commit 57c22f93ef
16 changed files with 244 additions and 37 deletions

View File

@ -14,8 +14,8 @@
void game::Camera::Update(void)
{
m_matrix.Identity();
//m_matrix.Rotate(vec3(0,0,1), M_PI/2.0 );
//m_matrix.Rotate(vec3(0,1,0), M_PI/2.0 );
m_matrix.Rotate(vec3(0,0,1), M_PI/2.0 );
m_matrix.Rotate(vec3(0,1,0), M_PI/2.0 );
m_matrix.Rotate(vec3(1,0,0), m_angles.x );
m_matrix.Rotate(vec3(0,1,0), m_angles.y );
m_matrix.Rotate(vec3(0,0,1), m_angles.z );

View File

@ -16,6 +16,7 @@ static int32_t uniqueId = 0;
game::Element::Element(etk::UString meshResource) :
m_resource(NULL),
m_scale(1,1,1),
m_mass(0.0f),
m_uniqueId(uniqueId),
m_groupId(0),
@ -29,9 +30,6 @@ game::Element::Element(etk::UString meshResource) :
m_resource = tmpObject;
}
uniqueId++;
//Scale(vec3(100,100,100) );
//Translate(vec3(0.0,0.0,-10.0));
}
game::Element::~Element(void)
@ -46,6 +44,7 @@ game::Element::~Element(void)
void game::Element::Draw(void)
{
if (NULL != m_resource) {
//EWOL_DEBUG("draw " << m_uniqueId);
m_resource->Draw(GetMatrix());
}
}

View File

@ -36,11 +36,11 @@ extern const float game::GravityConst = 0.0000000000667f;
// Earth
extern const float game::earthMass = 5973600000000000000000000.0f; // in kg
extern const float game::earthRadius = 6378137.0f; // in meter
extern const game::Gravity game::gravityEarth(true, earthMass, vec3(0, -(float)((GravityConst*earthMass)/(earthRadius*earthRadius)), 0) );
extern const game::Gravity game::gravityEarth(true, earthMass, vec3(0, 0, -(float)((GravityConst*earthMass)/(earthRadius*earthRadius))) );
// Mars
extern const float game::marsMass = 25000000000000000.0f; // in kg
extern const float game::marsRadius = 3396200.0f; // in meter
extern const game::Gravity game::gravityMars(true, marsMass, vec3(0, -(float)((GravityConst*marsMass)/(marsRadius*marsRadius)), 0) );
extern const game::Gravity game::gravityMars(true, marsMass, vec3(0, 0, -(float)((GravityConst*marsMass)/(marsRadius*marsRadius))) );

View File

@ -11,6 +11,7 @@
#include <ewol/renderer/openGL.h>
etk::Vector<mat4> l_matrixList;
mat4 l_matrixCamera;
void ewol::openGL::Init(void)
{
@ -18,12 +19,14 @@ void ewol::openGL::Init(void)
l_matrixList.Clear();
mat4 tmpMat;
l_matrixList.PushBack(tmpMat);
l_matrixCamera.Identity();
}
void ewol::openGL::UnInit(void)
{
l_matrixList.Clear();
l_matrixCamera.Identity();
}
void ewol::openGL::SetBasicMatrix(mat4& newOne)
@ -64,9 +67,11 @@ void ewol::openGL::Pop(void)
l_matrixList.Clear();
mat4 tmp;
l_matrixList.PushBack(tmp);
l_matrixCamera.Identity();
return;
}
l_matrixList.PopBack();
l_matrixCamera.Identity();
}
mat4& ewol::openGL::GetMatrix(void)
@ -79,3 +84,12 @@ mat4& ewol::openGL::GetMatrix(void)
return l_matrixList[l_matrixList.Size()-1];
}
mat4& ewol::openGL::GetCameraMatrix(void)
{
return l_matrixCamera;
}
void ewol::openGL::SetCameraMatrix(mat4& newOne)
{
l_matrixCamera = newOne;
}

View File

@ -83,6 +83,16 @@ namespace ewol {
* @return The requested matrix.
*/
mat4& GetMatrix(void);
/**
* @brief Get a reference on the current matrix camera destinate to opengl renderer.
* @return The requested matrix.
*/
mat4& GetCameraMatrix(void);
/**
* @brief Set a reference on the current camera to opengl renderer.
* @param[in] newOne The requested matrix.
*/
void SetCameraMatrix(mat4& newOne);
};
};

View File

@ -130,11 +130,11 @@ void ewolProcessEvents(void)
break;
case THREAD_KEYBORAD_KEY:
case THREAD_KEYBORAD_MOVE:
EWOL_DEBUG("Receive MSG : THREAD_KEYBORAD_KEY");
//EWOL_DEBUG("Receive MSG : THREAD_KEYBORAD_KEY");
{
ewol::SpecialKey& specialCurrentKey = ewol::GetCurrentSpecialKeyStatus();
specialCurrentKey = data.keyboardSpecial;
EWOL_DEBUG("newStatus Key" << specialCurrentKey);
//EWOL_DEBUG("newStatus Key" << specialCurrentKey);
}
if (NULL != windowsCurrent) {
if (false==windowsCurrent->OnEventShortCut(data.keyboardSpecial,

View File

@ -764,7 +764,9 @@ void X11_Run(void)
EWOL_INFO("X11 event : " << event.type << " = \"KeyPress/KeyRelease\" ");
#endif
{
EWOL_DEBUG("eventKey : " << event.xkey.keycode << " state : " << event.xkey.state);
#ifdef DEBUG_X11_EVENT
EWOL_DEBUG("eventKey : " << event.xkey.keycode << " state : " << event.xkey.state);
#endif
if (event.xkey.state & (1<<0) ) {
//EWOL_DEBUG(" Special Key : SHIFT");
guiKeyBoardMode.shift = true;

View File

@ -39,12 +39,6 @@ ewol::Mesh::~Mesh(void)
void ewol::Mesh::Draw(mat4& positionMatrix)
{
static float rotx = 0;
static float roty = 0;
static float rotz = 0;
rotx += 0.01;
roty += 0.02;
rotz += 0.005;
if (m_object.m_vertices.Size()<=0) {
return;
}
@ -60,8 +54,9 @@ void ewol::Mesh::Draw(mat4& positionMatrix)
//EWOL_DEBUG(" Display " << m_coord.Size() << " elements" );
m_GLprogram->Use();
// set Matrix : translation/positionMatrix
mat4 tmpMatrix = ewol::openGL::GetMatrix();
tmpMatrix = tmpMatrix * positionMatrix;
mat4 projMatrix = ewol::openGL::GetMatrix();
mat4 camMatrix = ewol::openGL::GetCameraMatrix();
mat4 tmpMatrix = projMatrix * camMatrix * positionMatrix;
m_GLprogram->UniformMatrix4fv(m_GLMatrix, 1, tmpMatrix.m_mat);
// TextureID
m_GLprogram->SetTexture0(m_GLtexID, m_texture1->GetId());

View File

@ -14,10 +14,18 @@
#undef __class__
#define __class__ "Scene"
#define WALK_FLAG_FORWARD (1<<0)
#define WALK_FLAG_BACK (1<<1)
#define WALK_FLAG_LEFT (1<<2)
#define WALK_FLAG_RIGHT (1<<3)
#define WALK_FLAG_CAUTION (1<<4)
widget::Scene::Scene(game::Engine* gameEngine) :
m_gameEngine(gameEngine),
m_isRunning(true),
m_lastCallTime(-1),
m_walk(0),
modeMoving(0)
{
SetCanHaveFocus(true);
@ -70,9 +78,46 @@ void widget::Scene::OnDraw(ewol::DrawProperty& displayProp)
}
}
#define WALK_FLAG_FORWARD (1<<0)
#define WALK_FLAG_BACK (1<<1)
#define WALK_FLAG_LEFT (1<<2)
#define WALK_FLAG_RIGHT (1<<3)
#define WALK_FLAG_CAUTION (1<<4)
void widget::Scene::PeriodicCall(int64_t localTime)
{
if (m_walk!=0) {
if ( (m_walk&(WALK_FLAG_FORWARD|WALK_FLAG_BACK))!=0) {
// request back and forward in the same time ... this is really bad ....
} else if ( (m_walk&WALK_FLAG_FORWARD)!=0) {
vec3 angles = m_camera.GetAngle();
angles.x = cosf(angles.z);
angles.y = sinf(angles.z);
angles.z = 0;
vec3 pos = m_camera.GetPosition();
pos += angles;
EWOL_DEBUG("walk = " << angles);
m_camera.SetPosition(pos);
} else if ( (m_walk&WALK_FLAG_BACK)!=0) {
vec3 angles = m_camera.GetAngle();
angles.x = cosf(angles.z);
angles.y = sinf(angles.z);
angles.z = 0;
vec3 pos = m_camera.GetPosition();
pos -= angles;
EWOL_DEBUG("walk = " << angles*-1);
m_camera.SetPosition(pos);
}
if ( (m_walk&(WALK_FLAG_LEFT|WALK_FLAG_RIGHT))!=0) {
// request left and right in the same time ... this is really bad ....
} else if ( (m_walk&WALK_FLAG_LEFT)!=0) {
} else if ( (m_walk&WALK_FLAG_RIGHT)!=0) {
}
}
double curentTime=(double)localTime/1000000.0;
// small hack to change speed ...
if (m_ratioTime != 1) {
@ -113,11 +158,12 @@ void widget::Scene::GenDraw(ewol::DrawProperty displayProp)
m_size.y);
float ratio = m_size.x / m_size.y;
//EWOL_INFO("ratio : " << ratio);
mat4 tmpProjection = etk::matPerspective( M_PI/2.0, ratio, -1, 1);
mat4 tmpMat = tmpProjection * m_camera.GetMatrix();
mat4 tmpProjection = etk::matPerspective( M_PI/2.0, ratio, 1, 4000);
ewol::openGL::SetCameraMatrix(m_camera.GetMatrix());
//mat4 tmpMat = tmpProjection * m_camera.GetMatrix();
// set internal matrix system :
ewol::openGL::SetMatrix(tmpMat);
//ewol::openGL::SetMatrix(tmpMat);
ewol::openGL::SetMatrix(tmpProjection);
// Call the widget drawing methode
displayProp.m_origin = m_origin;
@ -164,7 +210,7 @@ bool widget::Scene::OnEventInput(ewol::keyEvent::type_te type, int32_t IdInput,
{
vec2 relativePos = RelativePosition(pos);
//EWOL_DEBUG("type : " << type << " IdInput=" << IdInput << " " << "status=" << statusEvent << " RelPos=" << relativePos);
KeepFocus();
if (type == ewol::keyEvent::typeMouse) {
if (4 == IdInput && ewol::keyEvent::statusUp == statusEvent) {
vec3 oldPos = m_camera.GetPosition();
@ -183,8 +229,8 @@ bool widget::Scene::OnEventInput(ewol::keyEvent::type_te type, int32_t IdInput,
} else if (modeMoving==1 && ewol::keyEvent::statusMove == statusEvent) {
vec2 offset = relativePos - oldCursorPos;
vec3 oldPos = m_camera.GetPosition();
oldPos.x -= offset.x/50.0;
oldPos.y -= offset.y/50.0;
oldPos.x += offset.x/50.0;
oldPos.y += offset.y/50.0;
m_camera.SetPosition(oldPos);
oldCursorPos = relativePos;
}
@ -198,8 +244,8 @@ bool widget::Scene::OnEventInput(ewol::keyEvent::type_te type, int32_t IdInput,
vec2 offset = relativePos - oldCursorPos;
offset *= M_PI/(360.0f*6);
vec3 oldAngles = m_camera.GetAngle();
oldAngles.x -= offset.y;
oldAngles.y += offset.x;
oldAngles.z -= offset.x;
oldAngles.y += offset.y;
m_camera.SetAngle(oldAngles);
oldCursorPos = relativePos;
}
@ -221,18 +267,99 @@ bool widget::Scene::OnEventKb(ewol::keyEvent::status_te statusEvent, uniChar_t u
}
*/
if( unicodeData == 'z'
|| unicodeData == 'Z') {
if (statusEvent == ewol::keyEvent::statusDown) {
m_walk |= WALK_FLAG_FORWARD;
}
if (statusEvent == ewol::keyEvent::statusUp) {
if ((m_walk&WALK_FLAG_FORWARD) != 0) {
m_walk -= WALK_FLAG_FORWARD;
}
}
}
if( unicodeData == 's'
|| unicodeData == 'S') {
if (statusEvent == ewol::keyEvent::statusDown) {
m_walk |= WALK_FLAG_BACK;
}
if (statusEvent == ewol::keyEvent::statusUp) {
if ((m_walk&WALK_FLAG_BACK) != 0) {
m_walk -= WALK_FLAG_BACK;
}
}
}
if( unicodeData == 'q'
|| unicodeData == 'Q') {
if (statusEvent == ewol::keyEvent::statusDown) {
m_walk |= WALK_FLAG_LEFT;
}
if (statusEvent == ewol::keyEvent::statusUp) {
if ((m_walk&WALK_FLAG_LEFT) != 0) {
m_walk -= WALK_FLAG_LEFT;
}
}
}
if( unicodeData == 'd'
|| unicodeData == 'D') {
if (statusEvent == ewol::keyEvent::statusDown) {
m_walk |= WALK_FLAG_RIGHT;
}
if (statusEvent == ewol::keyEvent::statusUp) {
if ((m_walk&WALK_FLAG_RIGHT) != 0) {
m_walk -= WALK_FLAG_RIGHT;
}
}
}
EWOL_DEBUG("m_walk=" << m_walk);
return false;
}
bool widget::Scene::OnEventKbMove(ewol::keyEvent::status_te statusEvent, ewol::keyEvent::keyboard_te specialKey)
{
/*
if (statusEvent == ewol::ewol::keyEvent::statusDown) {
MarkToRedraw();
if (specialKey == ewol::keyEvent::keyboardUp) {
EWOL_DEBUG("test ..." << specialKey << " " << statusEvent);
if (statusEvent == ewol::keyEvent::statusDown) {
m_walk |= WALK_FLAG_FORWARD;
}
if (statusEvent == ewol::keyEvent::statusUp) {
if ((m_walk&WALK_FLAG_FORWARD) != 0) {
m_walk -= WALK_FLAG_FORWARD;
}
}
}
return true;
*/
if (specialKey == ewol::keyEvent::keyboardDown) {
if (statusEvent == ewol::keyEvent::statusDown) {
m_walk |= WALK_FLAG_BACK;
}
if (statusEvent == ewol::keyEvent::statusUp) {
if ((m_walk&WALK_FLAG_BACK) != 0) {
m_walk -= WALK_FLAG_BACK;
}
}
}
if (specialKey == ewol::keyEvent::keyboardLeft) {
if (statusEvent == ewol::keyEvent::statusDown) {
m_walk |= WALK_FLAG_LEFT;
}
if (statusEvent == ewol::keyEvent::statusUp) {
if ((m_walk&WALK_FLAG_LEFT) != 0) {
m_walk -= WALK_FLAG_LEFT;
}
}
}
if (specialKey == ewol::keyEvent::keyboardRight) {
if (statusEvent == ewol::keyEvent::statusDown) {
m_walk |= WALK_FLAG_RIGHT;
}
if (statusEvent == ewol::keyEvent::statusUp) {
if ((m_walk&WALK_FLAG_RIGHT) != 0) {
m_walk -= WALK_FLAG_RIGHT;
}
}
}
EWOL_DEBUG("m_walk=" << m_walk);
return false;
}

View File

@ -28,6 +28,7 @@ namespace widget {
bool m_isRunning; //!< the display is running (not in pause)
double m_lastCallTime; //!< previous call Time
float m_ratioTime; //!< Ratio time for the speed of the game ...
uint32_t m_walk; //!< Wolk properties
public:
/**
* @brief Main scene constructor

View File

@ -32,12 +32,13 @@ static const char * l_eventAddSphere = "event-add-sphere";
static const char * l_eventRotationX = "event-rotation-X";
static const char * l_eventRotationY = "event-rotation-Y";
static const char * l_eventRotationZ = "event-rotation-Z";
static const char * l_eventRotation0 = "event-rotation-0";
static const char * l_eventLunch = "event-lunch";
static const char * l_eventChangeTimeSpeed2 = "event-speed2";
static const char * l_eventChangeTimeSpeed0 = "event-speed0.5";
static const char * l_eventChangeTimeSpeed1 = "event-speed1";
static const char * l_eventUp = "event-up";
static const char * l_eventDown = "event-down";
#undef __class__
@ -45,6 +46,9 @@ static const char * l_eventChangeTimeSpeed1 = "event-speed1";
TestScene::TestScene(void)
{
m_ground = new game::Element("DATA:grass.obj");
m_gameEngine.AddElement(m_ground, true);
APPL_CRITICAL("Create "__class__" (start)");
widget::SizerVert* mySizerVert2 = NULL;
widget::SizerHori* mySizerHori = NULL;
@ -81,6 +85,27 @@ TestScene::TestScene(void)
myButton->RegisterOnEvent(this, ewolEventButtonPressed, l_eventRotationZ);
mySizerHori->SubWidgetAdd(myButton);
}
myButton = new widget::Button("Rotation -");
if (NULL != myButton) {
myButton->RegisterOnEvent(this, ewolEventButtonPressed, l_eventRotation0);
mySizerHori->SubWidgetAdd(myButton);
}
myButton = new widget::Button("UP");
if (NULL != myButton) {
myButton->RegisterOnEvent(this, ewolEventButtonPressed, l_eventUp);
mySizerHori->SubWidgetAdd(myButton);
}
myButton = new widget::Button("DOWN");
if (NULL != myButton) {
myButton->RegisterOnEvent(this, ewolEventButtonPressed, l_eventDown);
mySizerHori->SubWidgetAdd(myButton);
}
mySizerHori = new widget::SizerHori();
if (NULL == mySizerHori) {
APPL_DEBUG("Allocation error mySizerHori");
return;
}
SubWidgetAdd(mySizerHori);
myButton = new widget::Button("lunch object");
if (NULL != myButton) {
myButton->RegisterOnEvent(this, ewolEventButtonPressed, l_eventLunch);
@ -179,6 +204,7 @@ TestScene::~TestScene(void)
#include <ewol/game/Element.h>
vec3 baseRotationVect;
vec3 baseMove;
class stupidCube : public game::Element
{
public:
@ -194,6 +220,10 @@ class stupidCube : public game::Element
if (baseRotationVect != vec3(0,0,0) ) {
Rotate(baseRotationVect, 0.01);
}
if (baseMove != vec3(0,0,0) ) {
Translate(baseMove);
baseMove = vec3(0,0,0);
}
}
return false;
}
@ -219,7 +249,9 @@ void TestScene::OnReceiveMessage(ewol::EObject * CallerObject, const char * even
stupidCube * tmpp = new stupidCube();
static bool firstTime = true;
if (firstTime==false) {
tmpp->Translate(vec3(etk::tool::frand(-1,1),etk::tool::frand(-1,1),etk::tool::frand(-1,1)));
vec3 newPos = vec3(etk::tool::frand(-20,20),etk::tool::frand(-20,20),etk::tool::frand(1,8));
APPL_DEBUG("add a box at the pos : " << newPos);
tmpp->Translate(newPos);
}
firstTime = false;
m_gameEngine.AddElement(tmpp, true);
@ -227,15 +259,21 @@ void TestScene::OnReceiveMessage(ewol::EObject * CallerObject, const char * even
if (NULL!=m_testWidget) {
}
} else if (eventId == l_eventUp) {
baseMove = vec3(0.1,0,0);
} else if (eventId == l_eventDown) {
baseMove = vec3(-0.1,0,0);
} else if (eventId == l_eventRotationX) {
baseRotationVect = vec3(1,0,0);
} else if (eventId == l_eventRotationY) {
baseRotationVect = vec3(0,1,0);
} else if (eventId == l_eventRotationZ) {
baseRotationVect = vec3(0,0,1);
} else if (eventId == l_eventRotation0) {
baseRotationVect = vec3(0,0,0);
} else if (eventId == l_eventLunch) {
stupidCube * tmpp = new stupidCube(250);
tmpp->SetSpeed(vec3(10,50,0));
tmpp->SetSpeed(vec3(10,10,50));
m_gameEngine.AddElement(tmpp, true);
} else if (eventId == l_eventChangeTimeSpeed1) {
if (NULL!=m_testWidget) {

View File

@ -18,6 +18,8 @@
class TestScene : public widget::SizerVert
{
private:
game::Element* m_ground;
//game::Element m_sky;
game::Engine m_gameEngine;
widget::Scene* m_testWidget;
public:

View File

@ -52,7 +52,7 @@ void APP_Init(void)
#endif
#endif
etk::InitDefaultFolder(PROJECT_NAME);
ewol::ChangeSize(ivec2(800, 600));
ewol::ChangeSize(ivec2(800, 300));
#ifdef __TARGET_OS__Android
ewol::config::FontSetDefault("FreeSerif", 19);
#else

18
test/human/data/grass.obj Normal file
View File

@ -0,0 +1,18 @@
# done myself
v 100.0 -100.0 0.0
v 100.0 100.0 0.0
v -100.0 100.0 0.0
v -100.0 -100.0 0.0
vt 0.0 0.0
vt 100.0 0.0
vt 100.0 100.0
vt 0.0 100.0
vn 0.000000 0.000000 1.000000
usemtl grass.png
f 1/1/1 2/2/1 3/3/1
f 1/1/1 3/3/1 4/4/1

BIN
test/human/data/grass.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 532 B

View File

@ -15,4 +15,5 @@ FILE_LIST:= appl/Debug.cpp \
LOCAL_COPY_FOLDERS := data/icon.*:theme/default \
data/cube.*: \
data/grass.*: \
data/stone*: \