mirror of https://github.com/Poikilos/b3view
move playback on resize (snapWidgets), coding style ./etc/quality.sh
parent
d2aaced734
commit
a3118c12e5
|
@ -0,0 +1,118 @@
|
||||||
|
---
|
||||||
|
Language: Cpp
|
||||||
|
# BasedOnStyle: WebKit
|
||||||
|
AccessModifierOffset: -4
|
||||||
|
AlignAfterOpenBracket: DontAlign
|
||||||
|
AlignConsecutiveAssignments: false
|
||||||
|
AlignConsecutiveDeclarations: false
|
||||||
|
AlignEscapedNewlines: Right
|
||||||
|
AlignOperands: false
|
||||||
|
AlignTrailingComments: false
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: true
|
||||||
|
AllowShortBlocksOnASingleLine: false
|
||||||
|
AllowShortCaseLabelsOnASingleLine: false
|
||||||
|
AllowShortFunctionsOnASingleLine: All
|
||||||
|
AllowShortIfStatementsOnASingleLine: false
|
||||||
|
AllowShortLoopsOnASingleLine: false
|
||||||
|
AlwaysBreakAfterDefinitionReturnType: None
|
||||||
|
AlwaysBreakAfterReturnType: None
|
||||||
|
AlwaysBreakBeforeMultilineStrings: false
|
||||||
|
AlwaysBreakTemplateDeclarations: MultiLine
|
||||||
|
BinPackArguments: true
|
||||||
|
BinPackParameters: true
|
||||||
|
BraceWrapping:
|
||||||
|
AfterClass: false
|
||||||
|
AfterControlStatement: false
|
||||||
|
AfterEnum: false
|
||||||
|
AfterFunction: true
|
||||||
|
AfterNamespace: false
|
||||||
|
AfterObjCDeclaration: false
|
||||||
|
AfterStruct: false
|
||||||
|
AfterUnion: false
|
||||||
|
AfterExternBlock: false
|
||||||
|
BeforeCatch: false
|
||||||
|
BeforeElse: false
|
||||||
|
IndentBraces: false
|
||||||
|
SplitEmptyFunction: true
|
||||||
|
SplitEmptyRecord: true
|
||||||
|
SplitEmptyNamespace: true
|
||||||
|
BreakBeforeBinaryOperators: All
|
||||||
|
BreakBeforeBraces: WebKit
|
||||||
|
BreakBeforeInheritanceComma: false
|
||||||
|
BreakInheritanceList: BeforeColon
|
||||||
|
BreakBeforeTernaryOperators: true
|
||||||
|
BreakConstructorInitializersBeforeComma: false
|
||||||
|
BreakConstructorInitializers: BeforeComma
|
||||||
|
BreakAfterJavaFieldAnnotations: false
|
||||||
|
BreakStringLiterals: true
|
||||||
|
ColumnLimit: 0
|
||||||
|
CommentPragmas: '^ IWYU pragma:'
|
||||||
|
CompactNamespaces: false
|
||||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: false
|
||||||
|
ConstructorInitializerIndentWidth: 4
|
||||||
|
ContinuationIndentWidth: 4
|
||||||
|
Cpp11BracedListStyle: false
|
||||||
|
DerivePointerAlignment: false
|
||||||
|
DisableFormat: false
|
||||||
|
ExperimentalAutoDetectBinPacking: false
|
||||||
|
FixNamespaceComments: false
|
||||||
|
ForEachMacros:
|
||||||
|
- foreach
|
||||||
|
- Q_FOREACH
|
||||||
|
- BOOST_FOREACH
|
||||||
|
IncludeBlocks: Preserve
|
||||||
|
IncludeCategories:
|
||||||
|
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
|
||||||
|
Priority: 2
|
||||||
|
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
|
||||||
|
Priority: 3
|
||||||
|
- Regex: '.*'
|
||||||
|
Priority: 1
|
||||||
|
IncludeIsMainRegex: '(Test)?$'
|
||||||
|
IndentCaseLabels: false
|
||||||
|
IndentPPDirectives: None
|
||||||
|
IndentWidth: 4
|
||||||
|
IndentWrappedFunctionNames: false
|
||||||
|
JavaScriptQuotes: Leave
|
||||||
|
JavaScriptWrapImports: true
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||||
|
MacroBlockBegin: ''
|
||||||
|
MacroBlockEnd: ''
|
||||||
|
MaxEmptyLinesToKeep: 1
|
||||||
|
NamespaceIndentation: Inner
|
||||||
|
ObjCBinPackProtocolList: Auto
|
||||||
|
ObjCBlockIndentWidth: 4
|
||||||
|
ObjCSpaceAfterProperty: true
|
||||||
|
ObjCSpaceBeforeProtocolList: true
|
||||||
|
PenaltyBreakAssignment: 2
|
||||||
|
PenaltyBreakBeforeFirstCallParameter: 19
|
||||||
|
PenaltyBreakComment: 300
|
||||||
|
PenaltyBreakFirstLessLess: 120
|
||||||
|
PenaltyBreakString: 1000
|
||||||
|
PenaltyBreakTemplateDeclaration: 10
|
||||||
|
PenaltyExcessCharacter: 1000000
|
||||||
|
PenaltyReturnTypeOnItsOwnLine: 60
|
||||||
|
PointerAlignment: Left
|
||||||
|
ReflowComments: true
|
||||||
|
SortIncludes: true
|
||||||
|
SortUsingDeclarations: true
|
||||||
|
SpaceAfterCStyleCast: false
|
||||||
|
SpaceAfterTemplateKeyword: true
|
||||||
|
SpaceBeforeAssignmentOperators: true
|
||||||
|
SpaceBeforeCpp11BracedList: true
|
||||||
|
SpaceBeforeCtorInitializerColon: true
|
||||||
|
SpaceBeforeInheritanceColon: true
|
||||||
|
SpaceBeforeParens: ControlStatements
|
||||||
|
SpaceBeforeRangeBasedForLoopColon: true
|
||||||
|
SpaceInEmptyParentheses: false
|
||||||
|
SpacesBeforeTrailingComments: 1
|
||||||
|
SpacesInAngles: false
|
||||||
|
SpacesInContainerLiterals: true
|
||||||
|
SpacesInCStyleCastParentheses: false
|
||||||
|
SpacesInParentheses: false
|
||||||
|
SpacesInSquareBrackets: false
|
||||||
|
Standard: Cpp11
|
||||||
|
TabWidth: 8
|
||||||
|
UseTab: Never
|
||||||
|
...
|
||||||
|
|
|
@ -35,4 +35,7 @@ Makefile*
|
||||||
|
|
||||||
# QtCtreator CMake
|
# QtCtreator CMake
|
||||||
CMakeLists.txt.user
|
CMakeLists.txt.user
|
||||||
|
|
||||||
|
# dev generated files
|
||||||
nohup.out
|
nohup.out
|
||||||
|
*.tmp
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
using std::cout;
|
using std::cout;
|
||||||
using std::endl;
|
using std::endl;
|
||||||
using std::ostream;
|
using std::ostream;
|
||||||
using std::wcout;
|
|
||||||
using std::wcerr;
|
using std::wcerr;
|
||||||
|
using std::wcout;
|
||||||
|
|
||||||
ostream& debug()
|
ostream& debug()
|
||||||
{
|
{
|
||||||
|
|
58
Engine.cpp
58
Engine.cpp
|
@ -3,12 +3,12 @@
|
||||||
#include "Engine.h"
|
#include "Engine.h"
|
||||||
|
|
||||||
#include "UserInterface.h"
|
#include "UserInterface.h"
|
||||||
#include "View.h"
|
|
||||||
#include "Utility.h"
|
#include "Utility.h"
|
||||||
|
#include "View.h"
|
||||||
|
|
||||||
using std::cout;
|
using std::cout;
|
||||||
using std::wcerr;
|
|
||||||
using std::endl;
|
using std::endl;
|
||||||
|
using std::wcerr;
|
||||||
using std::wstring;
|
using std::wstring;
|
||||||
using std::wstringstream;
|
using std::wstringstream;
|
||||||
|
|
||||||
|
@ -99,10 +99,9 @@ void Engine::drawBackground()
|
||||||
|
|
||||||
void Engine::checkResize()
|
void Engine::checkResize()
|
||||||
{
|
{
|
||||||
if(( m_WindowSize->Width != m_Driver->getScreenSize().Width ) || ( m_WindowSize->Height != m_Driver->getScreenSize().Height ))
|
if ((m_WindowSize.Width != m_Driver->getScreenSize().Width) || (m_WindowSize.Height != m_Driver->getScreenSize().Height)) {
|
||||||
{
|
m_WindowSize.Width = m_Driver->getScreenSize().Width;
|
||||||
m_WindowSize->Width = m_Driver->getScreenSize().Width;
|
m_WindowSize.Height = m_Driver->getScreenSize().Height;
|
||||||
m_WindowSize->Height = m_Driver->getScreenSize().Height;
|
|
||||||
|
|
||||||
// Send custom event
|
// Send custom event
|
||||||
IEventReceiver* eventReceiver = m_Device->getEventReceiver();
|
IEventReceiver* eventReceiver = m_Device->getEventReceiver();
|
||||||
|
@ -182,8 +181,7 @@ Engine::Engine()
|
||||||
m_AxisFont = new CGUITTFont(m_UserInterface->getGUIEnvironment());
|
m_AxisFont = new CGUITTFont(m_UserInterface->getGUIEnvironment());
|
||||||
m_AxisFont->attach(m_AxisFontFace, 14);
|
m_AxisFont->attach(m_AxisFontFace, 14);
|
||||||
m_AxisFont->AntiAlias = false;
|
m_AxisFont->AntiAlias = false;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
delete m_AxisFontFace;
|
delete m_AxisFontFace;
|
||||||
m_AxisFontFace = nullptr;
|
m_AxisFontFace = nullptr;
|
||||||
}
|
}
|
||||||
|
@ -192,9 +190,8 @@ Engine::Engine()
|
||||||
m_LoadedMesh = nullptr;
|
m_LoadedMesh = nullptr;
|
||||||
|
|
||||||
// Store actual window size
|
// Store actual window size
|
||||||
m_WindowSize = new dimension2d<u32>();
|
m_WindowSize.Width = m_Driver->getScreenSize().Width;
|
||||||
m_WindowSize->Width = m_Driver->getScreenSize().Width;
|
m_WindowSize.Height = m_Driver->getScreenSize().Height;
|
||||||
m_WindowSize->Height = m_Driver->getScreenSize().Height;
|
|
||||||
|
|
||||||
// (do not calculate m_Yaw and m_Pitch here--see View constructor)
|
// (do not calculate m_Yaw and m_Pitch here--see View constructor)
|
||||||
|
|
||||||
|
@ -204,7 +201,6 @@ Engine::Engine()
|
||||||
Engine::~Engine()
|
Engine::~Engine()
|
||||||
{
|
{
|
||||||
m_Device->drop();
|
m_Device->drop();
|
||||||
delete m_WindowSize;
|
|
||||||
delete m_AxisFont;
|
delete m_AxisFont;
|
||||||
delete m_AxisFontFace;
|
delete m_AxisFontFace;
|
||||||
}
|
}
|
||||||
|
@ -223,8 +219,7 @@ void Engine::loadMesh( const wstring &fileName )
|
||||||
Utility::dumpMeshInfoToConsole(m_LoadedMesh);
|
Utility::dumpMeshInfoToConsole(m_LoadedMesh);
|
||||||
if (Utility::toLower(Utility::extensionOf(fileName)) == L"3ds") {
|
if (Utility::toLower(Utility::extensionOf(fileName)) == L"3ds") {
|
||||||
m_View->setZUp(true);
|
m_View->setZUp(true);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
m_View->setZUp(false);
|
m_View->setZUp(false);
|
||||||
}
|
}
|
||||||
if (m_LoadedMesh != nullptr) {
|
if (m_LoadedMesh != nullptr) {
|
||||||
|
@ -234,7 +229,7 @@ void Engine::loadMesh( const wstring &fileName )
|
||||||
if (m_View->zUp()) {
|
if (m_View->zUp()) {
|
||||||
float oldDist = m_CamPos.getDistanceFrom(m_CamTarget);
|
float oldDist = m_CamPos.getDistanceFrom(m_CamTarget);
|
||||||
float newDist = oldDist;
|
float newDist = oldDist;
|
||||||
if (oldDist != 0) {
|
if (Utility::equalsApprox(oldDist, 0.0f)) {
|
||||||
vector3d<float> center = box.getCenter();
|
vector3d<float> center = box.getCenter();
|
||||||
vector3df edges[8];
|
vector3df edges[8];
|
||||||
box.getEdges(edges);
|
box.getEdges(edges);
|
||||||
|
@ -251,7 +246,8 @@ void Engine::loadMesh( const wstring &fileName )
|
||||||
newDist = 0;
|
newDist = 0;
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
float tryDist = center.getDistanceFrom(edges[i]);
|
float tryDist = center.getDistanceFrom(edges[i]);
|
||||||
if (tryDist>newDist) newDist = tryDist;
|
if (tryDist > newDist)
|
||||||
|
newDist = tryDist;
|
||||||
}
|
}
|
||||||
newDist *= 2; // so camera doesn't touch model
|
newDist *= 2; // so camera doesn't touch model
|
||||||
if (!Utility::equalsApprox<float>(newDist, oldDist)) {
|
if (!Utility::equalsApprox<float>(newDist, oldDist)) {
|
||||||
|
@ -306,19 +302,15 @@ bool Engine::loadTexture(const wstring &fileName)
|
||||||
void Engine::setMeshDisplayMode(bool wireframe, bool lighting, bool textureInterpolation)
|
void Engine::setMeshDisplayMode(bool wireframe, bool lighting, bool textureInterpolation)
|
||||||
{
|
{
|
||||||
if (m_LoadedMesh != nullptr) {
|
if (m_LoadedMesh != nullptr) {
|
||||||
for( u32 materialIndex = 0; materialIndex < m_LoadedMesh->getMaterialCount(); materialIndex ++ )
|
for (u32 materialIndex = 0; materialIndex < m_LoadedMesh->getMaterialCount(); materialIndex++) {
|
||||||
{
|
|
||||||
// Set Wireframe display
|
// Set Wireframe display
|
||||||
m_LoadedMesh->getMaterial(materialIndex).Wireframe = wireframe;
|
m_LoadedMesh->getMaterial(materialIndex).Wireframe = wireframe;
|
||||||
|
|
||||||
// Set Lighting
|
// Set Lighting
|
||||||
if( ! lighting )
|
if (!lighting) {
|
||||||
{
|
|
||||||
m_LoadedMesh->getMaterial(materialIndex).Lighting = false;
|
m_LoadedMesh->getMaterial(materialIndex).Lighting = false;
|
||||||
m_LoadedMesh->getMaterial(materialIndex).EmissiveColor = SColor(255, 255, 255, 255);
|
m_LoadedMesh->getMaterial(materialIndex).EmissiveColor = SColor(255, 255, 255, 255);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
m_LoadedMesh->getMaterial(materialIndex).Lighting = true;
|
m_LoadedMesh->getMaterial(materialIndex).Lighting = true;
|
||||||
m_LoadedMesh->getMaterial(materialIndex).EmissiveColor = SColor(255, 0, 0, 0);
|
m_LoadedMesh->getMaterial(materialIndex).EmissiveColor = SColor(255, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
@ -327,8 +319,7 @@ void Engine::setMeshDisplayMode( bool wireframe, bool lighting, bool textureInte
|
||||||
if (textureInterpolation) {
|
if (textureInterpolation) {
|
||||||
m_LoadedMesh->setMaterialFlag(video::EMF_BILINEAR_FILTER, true);
|
m_LoadedMesh->setMaterialFlag(video::EMF_BILINEAR_FILTER, true);
|
||||||
m_LoadedMesh->setMaterialFlag(video::EMF_TRILINEAR_FILTER, true);
|
m_LoadedMesh->setMaterialFlag(video::EMF_TRILINEAR_FILTER, true);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
m_LoadedMesh->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
|
m_LoadedMesh->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
|
||||||
m_LoadedMesh->setMaterialFlag(video::EMF_TRILINEAR_FILTER, false);
|
m_LoadedMesh->setMaterialFlag(video::EMF_TRILINEAR_FILTER, false);
|
||||||
//m_LoadedMesh->setMaterialFlag(video::E_ALPHA_SOURCE, true);
|
//m_LoadedMesh->setMaterialFlag(video::E_ALPHA_SOURCE, true);
|
||||||
|
@ -344,8 +335,8 @@ void Engine::setMeshDisplayMode( bool wireframe, bool lighting, bool textureInte
|
||||||
// // above is used by glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filteringMipMaps);
|
// // above is used by glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filteringMipMaps);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
else debug() << "WARNING in setMeshDisplayMode: No mesh is loaded " << endl;
|
debug() << "WARNING in setMeshDisplayMode: No mesh is loaded " << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Engine::isAnimating()
|
bool Engine::isAnimating()
|
||||||
|
@ -360,7 +351,8 @@ void Engine::playAnimation()
|
||||||
}
|
}
|
||||||
if (!this->isAnimating()) {
|
if (!this->isAnimating()) {
|
||||||
if (this->m_LoadedMesh != nullptr) {
|
if (this->m_LoadedMesh != nullptr) {
|
||||||
if (this->prevFPS < 1) this->prevFPS = 5;
|
if (this->prevFPS < 1)
|
||||||
|
this->prevFPS = 5;
|
||||||
this->m_LoadedMesh->setAnimationSpeed(this->prevFPS);
|
this->m_LoadedMesh->setAnimationSpeed(this->prevFPS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -384,12 +376,10 @@ void Engine::toggleAnimation()
|
||||||
if (this->isAnimating()) {
|
if (this->isAnimating()) {
|
||||||
this->pauseAnimation();
|
this->pauseAnimation();
|
||||||
debug() << "paused " << this->animationFPS() << "fps" << endl;
|
debug() << "paused " << this->animationFPS() << "fps" << endl;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
this->playAnimation();
|
this->playAnimation();
|
||||||
debug() << "unpaused " << this->animationFPS() << "fps" << endl;
|
debug() << "unpaused " << this->animationFPS() << "fps" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::setAnimationFPS(u32 animationFPS)
|
void Engine::setAnimationFPS(u32 animationFPS)
|
||||||
|
@ -424,8 +414,7 @@ void Engine::run()
|
||||||
ITimer* timer = m_Device->getTimer();
|
ITimer* timer = m_Device->getTimer();
|
||||||
|
|
||||||
// Run the Device with fps frames/sec
|
// Run the Device with fps frames/sec
|
||||||
while( m_Device->run() && m_RunEngine )
|
while (m_Device->run() && m_RunEngine) {
|
||||||
{
|
|
||||||
u32 startTime = timer->getRealTime();
|
u32 startTime = timer->getRealTime();
|
||||||
|
|
||||||
checkResize();
|
checkResize();
|
||||||
|
@ -433,8 +422,7 @@ void Engine::run()
|
||||||
if (isPlaying) {
|
if (isPlaying) {
|
||||||
this->m_LoadedMesh->setLoopMode(true);
|
this->m_LoadedMesh->setLoopMode(true);
|
||||||
this->m_UserInterface->playbackSetFrameEditBox->setText(Utility::toWstring(this->m_LoadedMesh->getFrameNr()).c_str());
|
this->m_UserInterface->playbackSetFrameEditBox->setText(Utility::toWstring(this->m_LoadedMesh->getFrameNr()).c_str());
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
this->m_LoadedMesh->setLoopMode(false);
|
this->m_LoadedMesh->setLoopMode(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
15
Engine.h
15
Engine.h
|
@ -5,24 +5,22 @@
|
||||||
class UserInterface;
|
class UserInterface;
|
||||||
class View;
|
class View;
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <sstream>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <irrlicht/irrlicht.h>
|
|
||||||
#include "EventHandler.h"
|
#include "EventHandler.h"
|
||||||
#include "extlib/CGUITTFont.h"
|
#include "extlib/CGUITTFont.h"
|
||||||
|
#include <irrlicht/irrlicht.h>
|
||||||
|
|
||||||
enum SceneItemID
|
enum SceneItemID {
|
||||||
{
|
|
||||||
SIID_LIGHT = 1,
|
SIID_LIGHT = 1,
|
||||||
SIID_CAMERA = 2,
|
SIID_CAMERA = 2,
|
||||||
SIID_MODEL = 3
|
SIID_MODEL = 3
|
||||||
};
|
};
|
||||||
|
|
||||||
class Engine
|
class Engine {
|
||||||
{
|
|
||||||
friend class UserInterface;
|
friend class UserInterface;
|
||||||
friend class View;
|
friend class View;
|
||||||
|
|
||||||
|
@ -36,7 +34,7 @@ private:
|
||||||
irr::gui::CGUITTFont* m_AxisFont;
|
irr::gui::CGUITTFont* m_AxisFont;
|
||||||
irr::gui::CGUITTFace* m_AxisFontFace;
|
irr::gui::CGUITTFace* m_AxisFontFace;
|
||||||
|
|
||||||
irr::core::dimension2d<irr::u32> *m_WindowSize;
|
irr::core::dimension2d<irr::u32> m_WindowSize;
|
||||||
|
|
||||||
bool m_RunEngine;
|
bool m_RunEngine;
|
||||||
|
|
||||||
|
@ -71,7 +69,6 @@ public:
|
||||||
std::wstring m_PreviousPath;
|
std::wstring m_PreviousPath;
|
||||||
std::wstring m_PrevTexturePath;
|
std::wstring m_PrevTexturePath;
|
||||||
|
|
||||||
|
|
||||||
Engine();
|
Engine();
|
||||||
~Engine();
|
~Engine();
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#include "EventHandler.h"
|
#include "EventHandler.h"
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <Utility.h>
|
#include <Utility.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
using namespace irr;
|
using namespace irr;
|
||||||
using namespace irr::video;
|
using namespace irr::video;
|
||||||
|
@ -29,23 +29,17 @@ bool EventHandler::addEventReceiver( EventReceiverType type, IEventReceiver *rec
|
||||||
// IEventReceiver
|
// IEventReceiver
|
||||||
bool EventHandler::OnEvent(const SEvent& event)
|
bool EventHandler::OnEvent(const SEvent& event)
|
||||||
{
|
{
|
||||||
if (event.EventType == EET_GUI_EVENT)
|
if (event.EventType == EET_GUI_EVENT) {
|
||||||
{
|
|
||||||
// Pass to User Interface Handler
|
// Pass to User Interface Handler
|
||||||
map<EventReceiverType, IEventReceiver*>::iterator iter = m_EventReceivers->find(ERT_USERINTERFACE);
|
map<EventReceiverType, IEventReceiver*>::iterator iter = m_EventReceivers->find(ERT_USERINTERFACE);
|
||||||
iter->second->OnEvent(event);
|
iter->second->OnEvent(event);
|
||||||
}
|
} else if (event.EventType == EET_MOUSE_INPUT_EVENT) {
|
||||||
else if (event.EventType == EET_MOUSE_INPUT_EVENT)
|
|
||||||
{
|
|
||||||
map<EventReceiverType, IEventReceiver*>::iterator iter = m_EventReceivers->find(ERT_3DVIEW);
|
map<EventReceiverType, IEventReceiver*>::iterator iter = m_EventReceivers->find(ERT_3DVIEW);
|
||||||
iter->second->OnEvent(event);
|
iter->second->OnEvent(event);
|
||||||
}
|
} else if (event.EventType == EET_KEY_INPUT_EVENT) {
|
||||||
else if (event.EventType == EET_KEY_INPUT_EVENT) {
|
|
||||||
map<EventReceiverType, IEventReceiver*>::iterator iter = m_EventReceivers->find(ERT_USERINTERFACE);
|
map<EventReceiverType, IEventReceiver*>::iterator iter = m_EventReceivers->find(ERT_USERINTERFACE);
|
||||||
iter->second->OnEvent(event);
|
iter->second->OnEvent(event);
|
||||||
}
|
} else if (event.EventType == EET_USER_EVENT) {
|
||||||
else if (event.EventType == EET_USER_EVENT)
|
|
||||||
{
|
|
||||||
if (event.UserEvent.UserData1 == UEI_WINDOWSIZECHANGED) {
|
if (event.UserEvent.UserData1 == UEI_WINDOWSIZECHANGED) {
|
||||||
// Window resize handling - send to all subscribers
|
// Window resize handling - send to all subscribers
|
||||||
map<EventReceiverType, IEventReceiver*>::iterator iter;
|
map<EventReceiverType, IEventReceiver*>::iterator iter;
|
||||||
|
|
|
@ -5,30 +5,28 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include <irrlicht/irrlicht.h>
|
|
||||||
#include "Debug.h"
|
#include "Debug.h"
|
||||||
|
#include <irrlicht/irrlicht.h>
|
||||||
|
|
||||||
using std::cout;
|
using std::cout;
|
||||||
using std::endl;
|
using std::endl;
|
||||||
using std::map;
|
|
||||||
using std::make_pair;
|
using std::make_pair;
|
||||||
|
using std::map;
|
||||||
|
|
||||||
enum EventReceiverType
|
enum EventReceiverType {
|
||||||
{
|
|
||||||
ERT_USERINTERFACE = 1,
|
ERT_USERINTERFACE = 1,
|
||||||
ERT_3DVIEW = 2
|
ERT_3DVIEW = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
enum UserEventIdentifier
|
enum UserEventIdentifier {
|
||||||
{
|
|
||||||
UEI_WINDOWSIZECHANGED = 1
|
UEI_WINDOWSIZECHANGED = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
class EventHandler : public irr::IEventReceiver
|
class EventHandler : public irr::IEventReceiver {
|
||||||
{
|
|
||||||
private:
|
private:
|
||||||
irr::IrrlichtDevice* m_Device;
|
irr::IrrlichtDevice* m_Device;
|
||||||
map<EventReceiverType, IEventReceiver*>* m_EventReceivers;
|
map<EventReceiverType, IEventReceiver*>* m_EventReceivers;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
EventHandler(irr::IrrlichtDevice* device);
|
EventHandler(irr::IrrlichtDevice* device);
|
||||||
~EventHandler();
|
~EventHandler();
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include "UserInterface.h"
|
#include "UserInterface.h"
|
||||||
#include <string>
|
|
||||||
#include <iostream>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
// NOTE: to use filesystem, you must also include the fs library such
|
// NOTE: to use filesystem, you must also include the fs library such
|
||||||
// as via the `-lstdc++fs` linker option -- see b3view.pro
|
// as via the `-lstdc++fs` linker option -- see b3view.pro
|
||||||
|
@ -51,7 +51,7 @@ void UserInterface::setupUserInterface()
|
||||||
rect<s32>(vector2d<s32>(windowSize.Width - 4 - 160, 28), dimension2d<s32>(160, 300)), false, L"Playback", nullptr, UIE_PLAYBACKWINDOW);
|
rect<s32>(vector2d<s32>(windowSize.Width - 4 - 160, 28), dimension2d<s32>(160, 300)), false, L"Playback", nullptr, UIE_PLAYBACKWINDOW);
|
||||||
playbackWindow->getCloseButton()->setVisible(false);
|
playbackWindow->getCloseButton()->setVisible(false);
|
||||||
s32 spacing_x = 4;
|
s32 spacing_x = 4;
|
||||||
s32 spacing_y = 4;
|
spacing_y = 4;
|
||||||
s32 size_x = playbackWindow->getClientRect().getWidth() - 8;
|
s32 size_x = playbackWindow->getClientRect().getWidth() - 8;
|
||||||
s32 size_y = 24;
|
s32 size_y = 24;
|
||||||
s32 y = 24;
|
s32 y = 24;
|
||||||
|
@ -60,24 +60,21 @@ void UserInterface::setupUserInterface()
|
||||||
playbackWindow,
|
playbackWindow,
|
||||||
UIE_PLAYBACKSTARTSTOPBUTTON,
|
UIE_PLAYBACKSTARTSTOPBUTTON,
|
||||||
L"Start/Stop",
|
L"Start/Stop",
|
||||||
nullptr
|
nullptr);
|
||||||
);
|
|
||||||
y += size_y + spacing_y;
|
y += size_y + spacing_y;
|
||||||
playbackIncreaseButton = m_Gui->addButton(
|
playbackIncreaseButton = m_Gui->addButton(
|
||||||
rect<s32>(vector2d<s32>(spacing_x, y), dimension2d<s32>(size_x, size_y)),
|
rect<s32>(vector2d<s32>(spacing_x, y), dimension2d<s32>(size_x, size_y)),
|
||||||
playbackWindow,
|
playbackWindow,
|
||||||
UIE_PLAYBACKINCREASEBUTTON,
|
UIE_PLAYBACKINCREASEBUTTON,
|
||||||
L"Faster",
|
L"Faster",
|
||||||
nullptr
|
nullptr);
|
||||||
);
|
|
||||||
y += size_y + spacing_y;
|
y += size_y + spacing_y;
|
||||||
playbackDecreaseButton = m_Gui->addButton(
|
playbackDecreaseButton = m_Gui->addButton(
|
||||||
rect<s32>(vector2d<s32>(spacing_x, y), dimension2d<s32>(size_x, size_y)),
|
rect<s32>(vector2d<s32>(spacing_x, y), dimension2d<s32>(size_x, size_y)),
|
||||||
playbackWindow,
|
playbackWindow,
|
||||||
UIE_PLAYBACKDECREASEBUTTON,
|
UIE_PLAYBACKDECREASEBUTTON,
|
||||||
L"Slower",
|
L"Slower",
|
||||||
nullptr
|
nullptr);
|
||||||
);
|
|
||||||
|
|
||||||
y += size_y + spacing_y;
|
y += size_y + spacing_y;
|
||||||
playbackSetFrameEditBox = m_Gui->addEditBox(
|
playbackSetFrameEditBox = m_Gui->addEditBox(
|
||||||
|
@ -85,8 +82,7 @@ void UserInterface::setupUserInterface()
|
||||||
rect<s32>(vector2d<s32>(spacing_x, y), dimension2d<s32>(size_x, size_y)),
|
rect<s32>(vector2d<s32>(spacing_x, y), dimension2d<s32>(size_x, size_y)),
|
||||||
true,
|
true,
|
||||||
playbackWindow,
|
playbackWindow,
|
||||||
UIE_PLAYBACKSETFRAMEEDITBOX
|
UIE_PLAYBACKSETFRAMEEDITBOX);
|
||||||
);
|
|
||||||
|
|
||||||
y += size_y + spacing_y;
|
y += size_y + spacing_y;
|
||||||
texturePathStaticText = m_Gui->addStaticText(
|
texturePathStaticText = m_Gui->addStaticText(
|
||||||
|
@ -96,21 +92,19 @@ void UserInterface::setupUserInterface()
|
||||||
true,
|
true,
|
||||||
playbackWindow,
|
playbackWindow,
|
||||||
UIE_TEXTUREPATHSTATICTEXT,
|
UIE_TEXTUREPATHSTATICTEXT,
|
||||||
false
|
false);
|
||||||
);
|
|
||||||
y += size_y + spacing_y;
|
y += size_y + spacing_y;
|
||||||
texturePathEditBox = m_Gui->addEditBox(
|
texturePathEditBox = m_Gui->addEditBox(
|
||||||
L"",
|
L"",
|
||||||
rect<s32>(vector2d<s32>(spacing_x, y), dimension2d<s32>(size_x, size_y)),
|
rect<s32>(vector2d<s32>(spacing_x, y), dimension2d<s32>(size_x, size_y)),
|
||||||
true,
|
true,
|
||||||
playbackWindow,
|
playbackWindow,
|
||||||
UIE_TEXTUREPATHEDITBOX
|
UIE_TEXTUREPATHEDITBOX);
|
||||||
);
|
|
||||||
|
|
||||||
// Set Font for UI Elements
|
// Set Font for UI Elements
|
||||||
m_GuiFontFace = new CGUITTFace();
|
m_GuiFontFace = new CGUITTFace();
|
||||||
// irrString defines stringc as string<c8>
|
// irrString defines stringc as string<c8>
|
||||||
// if (QFile(fontPath).exists()) {}
|
// if (QFile(fontPath).exists()) {
|
||||||
if (!Utility::isFile(m_Engine->m_FontPath)) {
|
if (!Utility::isFile(m_Engine->m_FontPath)) {
|
||||||
m_Engine->m_FontPath = L"C:\\Windows\\Fonts\\calibrib.ttf";
|
m_Engine->m_FontPath = L"C:\\Windows\\Fonts\\calibrib.ttf";
|
||||||
}
|
}
|
||||||
|
@ -134,8 +128,7 @@ void UserInterface::setupUserInterface()
|
||||||
m_GuiFont = new CGUITTFont(m_Gui);
|
m_GuiFont = new CGUITTFont(m_Gui);
|
||||||
m_GuiFont->attach(m_GuiFontFace, 14);
|
m_GuiFont->attach(m_GuiFontFace, 14);
|
||||||
m_Gui->getSkin()->setFont(m_GuiFont);
|
m_Gui->getSkin()->setFont(m_GuiFont);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
std::wcerr << L"WARNING: Missing '" << m_Engine->m_FontPath << L"'" << endl;
|
std::wcerr << L"WARNING: Missing '" << m_Engine->m_FontPath << L"'" << endl;
|
||||||
delete m_GuiFontFace;
|
delete m_GuiFontFace;
|
||||||
m_GuiFontFace = nullptr;
|
m_GuiFontFace = nullptr;
|
||||||
|
@ -162,8 +155,7 @@ void UserInterface::handleMenuItemPressed( IGUIContextMenu *menu )
|
||||||
if (selected > -1) {
|
if (selected > -1) {
|
||||||
s32 id = menu->getItemCommandId(static_cast<u32>(selected));
|
s32 id = menu->getItemCommandId(static_cast<u32>(selected));
|
||||||
|
|
||||||
switch( id )
|
switch (id) {
|
||||||
{
|
|
||||||
case UIC_FILE_LOAD:
|
case UIC_FILE_LOAD:
|
||||||
displayLoadFileDialog();
|
displayLoadFileDialog();
|
||||||
break;
|
break;
|
||||||
|
@ -190,10 +182,29 @@ void UserInterface::handleMenuItemPressed( IGUIContextMenu *menu )
|
||||||
m_TextureInterpolation = viewMenu->isItemChecked(INDEX_VIEW_TEXTURE_INTERPOLATION);
|
m_TextureInterpolation = viewMenu->isItemChecked(INDEX_VIEW_TEXTURE_INTERPOLATION);
|
||||||
m_Engine->setMeshDisplayMode(m_WireframeDisplay, m_Lighting, m_TextureInterpolation);
|
m_Engine->setMeshDisplayMode(m_WireframeDisplay, m_Lighting, m_TextureInterpolation);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UserInterface::snapWidgets()
|
||||||
|
{
|
||||||
|
dimension2d<u32> screenSize = m_Engine->m_Driver->getScreenSize();
|
||||||
|
rect<s32> newRect;
|
||||||
|
//newRect.LowerRightCorner.X = static_cast<s32>(size.Width);
|
||||||
|
//newRect.LowerRightCorner.Y = static_cast<s32>(size.Height);
|
||||||
|
rect<s32> prevRect = playbackWindow->getRelativePosition();
|
||||||
|
newRect.UpperLeftCorner.X = static_cast<s32>(screenSize.Width) - prevRect.getWidth() - spacing_y;
|
||||||
|
//debug() << "screen size: " << screenSize.Width << "x" << screenSize.Height;
|
||||||
|
//debug() << " prevRect: "
|
||||||
|
// << prevRect.UpperLeftCorner.X << "," << prevRect.UpperLeftCorner.Y << ","
|
||||||
|
// << prevRect.LowerRightCorner.X << "," << prevRect.LowerRightCorner.Y
|
||||||
|
// << " size=(" << prevRect.getWidth() << "," <<prevRect.getHeight() << ")" << endl;
|
||||||
|
newRect.UpperLeftCorner.Y = prevRect.UpperLeftCorner.Y;
|
||||||
|
newRect.LowerRightCorner.X = newRect.UpperLeftCorner.X + prevRect.getWidth();
|
||||||
|
newRect.LowerRightCorner.Y = newRect.UpperLeftCorner.Y + prevRect.getHeight();
|
||||||
|
playbackWindow->setRelativePosition(newRect);
|
||||||
|
m_WindowSize.Width = m_Engine->m_Driver->getScreenSize().Width;
|
||||||
|
m_WindowSize.Height = m_Engine->m_Driver->getScreenSize().Height;
|
||||||
}
|
}
|
||||||
|
|
||||||
// PUBLIC
|
// PUBLIC
|
||||||
|
@ -245,14 +256,12 @@ bool UserInterface::loadNextTexture(int direction)
|
||||||
if (direction == 0 && Utility::isFile(tryTexPath)) {
|
if (direction == 0 && Utility::isFile(tryTexPath)) {
|
||||||
this->m_Engine->m_NextPath = tryTexPath;
|
this->m_Engine->m_NextPath = tryTexPath;
|
||||||
this->m_Engine->loadTexture(this->m_Engine->m_NextPath);
|
this->m_Engine->loadTexture(this->m_Engine->m_NextPath);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
tryTexPath = lastDirPath + dirSeparator + Utility::withoutExtension(lastName) + L".png";
|
tryTexPath = lastDirPath + dirSeparator + Utility::withoutExtension(lastName) + L".png";
|
||||||
if (direction == 0 && Utility::isFile(tryTexPath)) {
|
if (direction == 0 && Utility::isFile(tryTexPath)) {
|
||||||
this->m_Engine->m_NextPath = tryTexPath;
|
this->m_Engine->m_NextPath = tryTexPath;
|
||||||
ret = this->m_Engine->loadTexture(this->m_Engine->m_NextPath);
|
ret = this->m_Engine->loadTexture(this->m_Engine->m_NextPath);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
std::wstring path = texturesPath;
|
std::wstring path = texturesPath;
|
||||||
|
|
||||||
if (!fs::is_directory(fs::status(path)))
|
if (!fs::is_directory(fs::status(path)))
|
||||||
|
@ -289,8 +298,7 @@ bool UserInterface::loadNextTexture(int direction)
|
||||||
found = true;
|
found = true;
|
||||||
force = true;
|
force = true;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
nextPath = tryPath;
|
nextPath = tryPath;
|
||||||
found = true;
|
found = true;
|
||||||
force = true;
|
force = true;
|
||||||
|
@ -305,14 +313,18 @@ bool UserInterface::loadNextTexture(int direction)
|
||||||
&& std::find(m_Engine->textureExtensions.begin(), m_Engine->textureExtensions.end(), ext) != m_Engine->textureExtensions.end()) {
|
&& std::find(m_Engine->textureExtensions.begin(), m_Engine->textureExtensions.end(), ext) != m_Engine->textureExtensions.end()) {
|
||||||
// cycle through files (go to next after m_PrevTexturePath
|
// cycle through files (go to next after m_PrevTexturePath
|
||||||
// if any previously loaded, otherwise first)
|
// if any previously loaded, otherwise first)
|
||||||
if (nextPath.length() == 0) nextPath = itr.path().wstring();
|
if (nextPath.length() == 0)
|
||||||
|
nextPath = itr.path().wstring();
|
||||||
lastPath = itr.path().wstring();
|
lastPath = itr.path().wstring();
|
||||||
if (found && direction > 0) {
|
if (found && direction > 0) {
|
||||||
if (!force) nextPath = itr.path().wstring();
|
if (!force)
|
||||||
|
nextPath = itr.path().wstring();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (itr.path().wstring() == this->m_Engine->m_PrevTexturePath) found = true;
|
if (itr.path().wstring() == this->m_Engine->m_PrevTexturePath)
|
||||||
if (!found) retroPath = itr.path().wstring();
|
found = true;
|
||||||
|
if (!found)
|
||||||
|
retroPath = itr.path().wstring();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (retroPath.length() == 0)
|
if (retroPath.length() == 0)
|
||||||
|
@ -325,8 +337,8 @@ bool UserInterface::loadNextTexture(int direction)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
else debug() << "Can't cycle texture since no file was opened" << endl;
|
debug() << "Can't cycle texture since no file was opened" << endl;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -334,55 +346,53 @@ bool UserInterface::loadNextTexture(int direction)
|
||||||
bool UserInterface::OnEvent(const SEvent& event)
|
bool UserInterface::OnEvent(const SEvent& event)
|
||||||
{
|
{
|
||||||
// Events arriving here should be destined for us
|
// Events arriving here should be destined for us
|
||||||
if (event.EventType == EET_KEY_INPUT_EVENT) {
|
if (event.EventType == EET_USER_EVENT) {
|
||||||
|
if (event.UserEvent.UserData1 == UEI_WINDOWSIZECHANGED) {
|
||||||
|
if ((m_WindowSize.Width != m_Engine->m_Driver->getScreenSize().Width) || (m_WindowSize.Height != m_Engine->m_Driver->getScreenSize().Height)) {
|
||||||
|
snapWidgets();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else if (event.EventType == EET_KEY_INPUT_EVENT) {
|
||||||
if (event.KeyInput.PressedDown && !m_Engine->KeyIsDown[event.KeyInput.Key]) {
|
if (event.KeyInput.PressedDown && !m_Engine->KeyIsDown[event.KeyInput.Key]) {
|
||||||
if (event.KeyInput.Key == irr::KEY_F5) {
|
if (event.KeyInput.Key == irr::KEY_F5) {
|
||||||
m_Engine->reloadMesh();
|
m_Engine->reloadMesh();
|
||||||
}
|
} else if (event.KeyInput.Key == irr::KEY_KEY_T) {
|
||||||
else if (event.KeyInput.Key == irr::KEY_KEY_T) {
|
|
||||||
loadNextTexture(1);
|
loadNextTexture(1);
|
||||||
}
|
} else if (event.KeyInput.Key == irr::KEY_KEY_E) {
|
||||||
else if (event.KeyInput.Key == irr::KEY_KEY_E) {
|
|
||||||
loadNextTexture(-1);
|
loadNextTexture(-1);
|
||||||
}
|
} else if (event.KeyInput.Key == irr::KEY_KEY_R) {
|
||||||
else if (event.KeyInput.Key == irr::KEY_KEY_R) {
|
|
||||||
m_Engine->reloadTexture();
|
m_Engine->reloadTexture();
|
||||||
}
|
} else if (event.KeyInput.Key == irr::KEY_KEY_Z) {
|
||||||
else if (event.KeyInput.Key == irr::KEY_KEY_Z) {
|
|
||||||
m_Engine->setZUp(true);
|
m_Engine->setZUp(true);
|
||||||
}
|
} else if (event.KeyInput.Key == irr::KEY_KEY_Y) {
|
||||||
else if (event.KeyInput.Key == irr::KEY_KEY_Y) {
|
|
||||||
m_Engine->setZUp(false);
|
m_Engine->setZUp(false);
|
||||||
}
|
} else if (event.KeyInput.Key == irr::KEY_KEY_X) {
|
||||||
else if (event.KeyInput.Key == irr::KEY_KEY_X) {
|
|
||||||
// IGUIContextMenu* textureInterpolationElement = dynamic_cast<IGUIContextMenu*>(viewMenu->getElementFromId(UIC_VIEW_TEXTURE_INTERPOLATION));
|
// IGUIContextMenu* textureInterpolationElement = dynamic_cast<IGUIContextMenu*>(viewMenu->getElementFromId(UIC_VIEW_TEXTURE_INTERPOLATION));
|
||||||
//m_TextureInterpolation = textureInterpolationElement->isItemChecked(UIC_VIEW_TEXTURE_INTERPOLATION);
|
//m_TextureInterpolation = textureInterpolationElement->isItemChecked(UIC_VIEW_TEXTURE_INTERPOLATION);
|
||||||
m_TextureInterpolation = m_TextureInterpolation ? false : true;
|
m_TextureInterpolation = m_TextureInterpolation ? false : true;
|
||||||
//doesn't work: m_TextureInterpolation = viewMenu->isItemChecked(UIC_VIEW_TEXTURE_INTERPOLATION);
|
//doesn't work: m_TextureInterpolation = viewMenu->isItemChecked(UIC_VIEW_TEXTURE_INTERPOLATION);
|
||||||
m_Engine->setMeshDisplayMode(m_WireframeDisplay, m_Lighting, m_TextureInterpolation);
|
m_Engine->setMeshDisplayMode(m_WireframeDisplay, m_Lighting, m_TextureInterpolation);
|
||||||
viewMenu->setItemChecked(INDEX_VIEW_TEXTURE_INTERPOLATION, m_TextureInterpolation);
|
viewMenu->setItemChecked(INDEX_VIEW_TEXTURE_INTERPOLATION, m_TextureInterpolation);
|
||||||
}
|
} else if (event.KeyInput.Char == L'+' || event.KeyInput.Char == L'=') {
|
||||||
else if (event.KeyInput.Char == L'+' || event.KeyInput.Char == L'=') {
|
|
||||||
m_Engine->setAnimationFPS(m_Engine->animationFPS() + 5);
|
m_Engine->setAnimationFPS(m_Engine->animationFPS() + 5);
|
||||||
}
|
} else if (event.KeyInput.Char == L'-') {
|
||||||
else if (event.KeyInput.Char == L'-') {
|
|
||||||
if (m_Engine->animationFPS() > 0) {
|
if (m_Engine->animationFPS() > 0) {
|
||||||
m_Engine->setAnimationFPS(m_Engine->animationFPS() - 5);
|
m_Engine->setAnimationFPS(m_Engine->animationFPS() - 5);
|
||||||
}
|
}
|
||||||
}
|
} else if (event.KeyInput.Char == L' ') {
|
||||||
else if (event.KeyInput.Char == L' ') {
|
|
||||||
m_Engine->toggleAnimation();
|
m_Engine->toggleAnimation();
|
||||||
}
|
} else if (event.KeyInput.Key == irr::KEY_LEFT) {
|
||||||
else if (event.KeyInput.Key == irr::KEY_LEFT) {
|
|
||||||
if (this->m_Engine->m_LoadedMesh != nullptr) {
|
if (this->m_Engine->m_LoadedMesh != nullptr) {
|
||||||
if (m_Engine->isPlaying) m_Engine->toggleAnimation();
|
if (m_Engine->isPlaying)
|
||||||
|
m_Engine->toggleAnimation();
|
||||||
this->m_Engine->m_LoadedMesh->setCurrentFrame(round(this->m_Engine->m_LoadedMesh->getFrameNr()) - 1);
|
this->m_Engine->m_LoadedMesh->setCurrentFrame(round(this->m_Engine->m_LoadedMesh->getFrameNr()) - 1);
|
||||||
this->playbackSetFrameEditBox->setText(Utility::toWstring(this->m_Engine->m_LoadedMesh->getFrameNr()).c_str());
|
this->playbackSetFrameEditBox->setText(Utility::toWstring(this->m_Engine->m_LoadedMesh->getFrameNr()).c_str());
|
||||||
}
|
}
|
||||||
}
|
} else if (event.KeyInput.Key == irr::KEY_RIGHT) {
|
||||||
else if (event.KeyInput.Key == irr::KEY_RIGHT) {
|
|
||||||
if (this->m_Engine->m_LoadedMesh != nullptr) {
|
if (this->m_Engine->m_LoadedMesh != nullptr) {
|
||||||
if (m_Engine->isPlaying) m_Engine->toggleAnimation();
|
if (m_Engine->isPlaying)
|
||||||
|
m_Engine->toggleAnimation();
|
||||||
this->m_Engine->m_LoadedMesh->setCurrentFrame(round(this->m_Engine->m_LoadedMesh->getFrameNr()) + 1);
|
this->m_Engine->m_LoadedMesh->setCurrentFrame(round(this->m_Engine->m_LoadedMesh->getFrameNr()) + 1);
|
||||||
this->playbackSetFrameEditBox->setText(Utility::toWstring(this->m_Engine->m_LoadedMesh->getFrameNr()).c_str());
|
this->playbackSetFrameEditBox->setText(Utility::toWstring(this->m_Engine->m_LoadedMesh->getFrameNr()).c_str());
|
||||||
}
|
}
|
||||||
|
@ -392,12 +402,9 @@ bool UserInterface::OnEvent( const SEvent &event )
|
||||||
m_Engine->KeyIsDown[event.KeyInput.Key] = event.KeyInput.PressedDown;
|
m_Engine->KeyIsDown[event.KeyInput.Key] = event.KeyInput.PressedDown;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
} else if (event.EventType == EET_MOUSE_INPUT_EVENT) {
|
||||||
else if (event.EventType == EET_MOUSE_INPUT_EVENT)
|
|
||||||
{
|
|
||||||
// TODO: improve this copypasta
|
// TODO: improve this copypasta
|
||||||
switch ( event.MouseInput.Event)
|
switch (event.MouseInput.Event) {
|
||||||
{
|
|
||||||
case EMIE_LMOUSE_LEFT_UP:
|
case EMIE_LMOUSE_LEFT_UP:
|
||||||
if (m_Engine->LMouseState == 2) {
|
if (m_Engine->LMouseState == 2) {
|
||||||
m_Engine->LMouseState = 3;
|
m_Engine->LMouseState = 3;
|
||||||
|
@ -422,14 +429,12 @@ bool UserInterface::OnEvent( const SEvent &event )
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
} else if (!(event.EventType == EET_GUI_EVENT))
|
||||||
else if (!(event.EventType == EET_GUI_EVENT))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const SEvent::SGUIEvent* ge = &(event.GUIEvent);
|
const SEvent::SGUIEvent* ge = &(event.GUIEvent);
|
||||||
|
|
||||||
switch( ge->Caller->getID() )
|
switch (ge->Caller->getID()) {
|
||||||
{
|
|
||||||
case UIE_FILEMENU:
|
case UIE_FILEMENU:
|
||||||
case UIE_VIEWMENU:
|
case UIE_VIEWMENU:
|
||||||
// call handler for all menu related actions
|
// call handler for all menu related actions
|
||||||
|
@ -437,16 +442,14 @@ bool UserInterface::OnEvent( const SEvent &event )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UIE_LOADFILEDIALOG:
|
case UIE_LOADFILEDIALOG:
|
||||||
if( ge->EventType == EGET_FILE_SELECTED )
|
if (ge->EventType == EGET_FILE_SELECTED) {
|
||||||
{
|
|
||||||
IGUIFileOpenDialog* fileOpenDialog = static_cast<IGUIFileOpenDialog*>(ge->Caller);
|
IGUIFileOpenDialog* fileOpenDialog = static_cast<IGUIFileOpenDialog*>(ge->Caller);
|
||||||
m_Engine->loadMesh(fileOpenDialog->getFileName());
|
m_Engine->loadMesh(fileOpenDialog->getFileName());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UIE_LOADTEXTUREDIALOG:
|
case UIE_LOADTEXTUREDIALOG:
|
||||||
if( ge->EventType == EGET_FILE_SELECTED )
|
if (ge->EventType == EGET_FILE_SELECTED) {
|
||||||
{
|
|
||||||
IGUIFileOpenDialog* fileOpenDialog = static_cast<IGUIFileOpenDialog*>(ge->Caller);
|
IGUIFileOpenDialog* fileOpenDialog = static_cast<IGUIFileOpenDialog*>(ge->Caller);
|
||||||
m_Engine->loadTexture(fileOpenDialog->getFileName());
|
m_Engine->loadTexture(fileOpenDialog->getFileName());
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
#ifndef USERINTERFACE_H
|
#ifndef USERINTERFACE_H
|
||||||
#define USERINTERFACE_H
|
#define USERINTERFACE_H
|
||||||
|
|
||||||
#include <irrlicht/irrlicht.h>
|
|
||||||
#include "extlib/CGUITTFont.h"
|
#include "extlib/CGUITTFont.h"
|
||||||
|
#include <irrlicht/irrlicht.h>
|
||||||
|
|
||||||
// Forward declaration of class Engine
|
// Forward declaration of class Engine
|
||||||
class Engine;
|
class Engine;
|
||||||
|
|
||||||
enum UserInterfaceElements
|
enum UserInterfaceElements {
|
||||||
{
|
|
||||||
UIE_FILEMENU = 1003,
|
UIE_FILEMENU = 1003,
|
||||||
UIE_LOADFILEDIALOG = 1100,
|
UIE_LOADFILEDIALOG = 1100,
|
||||||
// UIE_LOADBUTTON = 1101,
|
// UIE_LOADBUTTON = 1101,
|
||||||
|
@ -25,8 +24,7 @@ enum UserInterfaceElements
|
||||||
UIE_TEXTUREPATHEDITBOX = 3006
|
UIE_TEXTUREPATHEDITBOX = 3006
|
||||||
};
|
};
|
||||||
|
|
||||||
enum UserInterfaceCommands
|
enum UserInterfaceCommands {
|
||||||
{
|
|
||||||
UIC_FILE_LOAD = 1000,
|
UIC_FILE_LOAD = 1000,
|
||||||
UIC_FILE_QUIT = 1001,
|
UIC_FILE_QUIT = 1001,
|
||||||
UIC_FILE_LOAD_TEXTURE = 1002,
|
UIC_FILE_LOAD_TEXTURE = 1002,
|
||||||
|
@ -35,9 +33,9 @@ enum UserInterfaceCommands
|
||||||
UIC_VIEW_TEXTURE_INTERPOLATION = 2003
|
UIC_VIEW_TEXTURE_INTERPOLATION = 2003
|
||||||
};
|
};
|
||||||
|
|
||||||
class UserInterface : public irr::IEventReceiver
|
class UserInterface : public irr::IEventReceiver {
|
||||||
{
|
|
||||||
private:
|
private:
|
||||||
|
irr::s32 spacing_y;
|
||||||
Engine* m_Engine;
|
Engine* m_Engine;
|
||||||
irr::gui::IGUIEnvironment* m_Gui;
|
irr::gui::IGUIEnvironment* m_Gui;
|
||||||
irr::gui::CGUITTFont* m_GuiFont;
|
irr::gui::CGUITTFont* m_GuiFont;
|
||||||
|
@ -52,6 +50,7 @@ private:
|
||||||
bool m_Lighting;
|
bool m_Lighting;
|
||||||
bool m_TextureInterpolation;
|
bool m_TextureInterpolation;
|
||||||
irr::gui::IGUIWindow* playbackWindow;
|
irr::gui::IGUIWindow* playbackWindow;
|
||||||
|
irr::core::dimension2d<irr::u32> m_WindowSize; // previous size
|
||||||
public:
|
public:
|
||||||
irr::gui::IGUIContextMenu* menu;
|
irr::gui::IGUIContextMenu* menu;
|
||||||
irr::gui::IGUIContextMenu* fileMenu;
|
irr::gui::IGUIContextMenu* fileMenu;
|
||||||
|
@ -66,6 +65,7 @@ public:
|
||||||
irr::u32 INDEX_VIEW_WIREFRAME_MESH;
|
irr::u32 INDEX_VIEW_WIREFRAME_MESH;
|
||||||
irr::u32 INDEX_VIEW_LIGHTING;
|
irr::u32 INDEX_VIEW_LIGHTING;
|
||||||
|
|
||||||
|
void snapWidgets();
|
||||||
|
|
||||||
UserInterface(Engine* device);
|
UserInterface(Engine* device);
|
||||||
~UserInterface();
|
~UserInterface();
|
||||||
|
|
48
Utility.cpp
48
Utility.cpp
|
@ -1,13 +1,13 @@
|
||||||
#include "Utility.h"
|
#include "Utility.h"
|
||||||
#include <string>
|
#include <algorithm>
|
||||||
#include <iostream>
|
|
||||||
#include <clocale>
|
#include <clocale>
|
||||||
#include <locale>
|
|
||||||
#include <vector>
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cwctype> // #include <cwtype>
|
#include <cwctype> // #include <cwtype>
|
||||||
#include <algorithm>
|
#include <iostream>
|
||||||
|
#include <locale>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "Debug.h"
|
#include "Debug.h"
|
||||||
|
|
||||||
|
@ -16,7 +16,6 @@ using namespace irr::scene;
|
||||||
using namespace irr::video;
|
using namespace irr::video;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
void Utility::dumpVectorToConsole(const vector3df& vector)
|
void Utility::dumpVectorToConsole(const vector3df& vector)
|
||||||
{
|
{
|
||||||
debug() << "X: " << vector.X << " Y: " << vector.Y << " Z: " << vector.Z << endl;
|
debug() << "X: " << vector.X << " Y: " << vector.Y << " Z: " << vector.Z << endl;
|
||||||
|
@ -37,8 +36,7 @@ void Utility::dumpMeshInfoToConsole( IAnimatedMeshSceneNode *node )
|
||||||
|
|
||||||
debug() << "[MESH]: # of frames : " << mesh->getFrameCount() << endl;
|
debug() << "[MESH]: # of frames : " << mesh->getFrameCount() << endl;
|
||||||
debug() << "[MESH]: # of materials : " << node->getMaterialCount() << endl;
|
debug() << "[MESH]: # of materials : " << node->getMaterialCount() << endl;
|
||||||
for( irr::u32 matIndex = 0; matIndex < node->getMaterialCount(); matIndex ++ )
|
for (irr::u32 matIndex = 0; matIndex < node->getMaterialCount(); matIndex++) {
|
||||||
{
|
|
||||||
debug() << "[MESH]: Material # " << matIndex << endl;
|
debug() << "[MESH]: Material # " << matIndex << endl;
|
||||||
const SMaterial& material = node->getMaterial(matIndex);
|
const SMaterial& material = node->getMaterial(matIndex);
|
||||||
debug() << "[MESH]: Diffuse Color : A" << material.DiffuseColor.getAlpha() << " R" << material.DiffuseColor.getRed() << " G" << material.DiffuseColor.getGreen() << " B" << material.DiffuseColor.getBlue() << endl;
|
debug() << "[MESH]: Diffuse Color : A" << material.DiffuseColor.getAlpha() << " R" << material.DiffuseColor.getRed() << " G" << material.DiffuseColor.getGreen() << " B" << material.DiffuseColor.getBlue() << endl;
|
||||||
|
@ -48,7 +46,8 @@ void Utility::dumpMeshInfoToConsole( IAnimatedMeshSceneNode *node )
|
||||||
// check for # textures
|
// check for # textures
|
||||||
int textures = 0;
|
int textures = 0;
|
||||||
for (irr::u32 ti = 0; ti < MATERIAL_MAX_TEXTURES; ti++)
|
for (irr::u32 ti = 0; ti < MATERIAL_MAX_TEXTURES; ti++)
|
||||||
if( material.getTexture( ti ) != nullptr ) textures ++;
|
if (material.getTexture(ti) != nullptr)
|
||||||
|
textures++;
|
||||||
debug() << "[MESH]: # of textures : " << textures << endl;
|
debug() << "[MESH]: # of textures : " << textures << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -58,8 +57,7 @@ std::wstring Utility::parentOfPath(const wstring &path)
|
||||||
std::wstring ret = L".";
|
std::wstring ret = L".";
|
||||||
if (path == L".") {
|
if (path == L".") {
|
||||||
ret = L"..";
|
ret = L"..";
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
std::wstring::size_type lastSlashPos = path.find_last_of(L"/");
|
std::wstring::size_type lastSlashPos = path.find_last_of(L"/");
|
||||||
if (lastSlashPos == std::wstring::npos) {
|
if (lastSlashPos == std::wstring::npos) {
|
||||||
lastSlashPos = path.find_last_of(L"\\");
|
lastSlashPos = path.find_last_of(L"\\");
|
||||||
|
@ -94,9 +92,10 @@ wstring Utility::withoutExtension(const wstring &path)
|
||||||
lastSlashPos = path.find_last_of(L"\\");
|
lastSlashPos = path.find_last_of(L"\\");
|
||||||
}
|
}
|
||||||
if (lastSlashPos != std::wstring::npos) {
|
if (lastSlashPos != std::wstring::npos) {
|
||||||
if (lastDotPos > lastSlashPos) ret = path.substr(0, lastDotPos);
|
if (lastDotPos > lastSlashPos)
|
||||||
}
|
ret = path.substr(0, lastDotPos);
|
||||||
else ret = path.substr(0, lastDotPos);
|
} else
|
||||||
|
ret = path.substr(0, lastDotPos);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -111,9 +110,10 @@ wstring Utility::extensionOf(const wstring &path)
|
||||||
lastSlashPos = path.find_last_of(L"\\");
|
lastSlashPos = path.find_last_of(L"\\");
|
||||||
}
|
}
|
||||||
if (lastSlashPos != std::wstring::npos) {
|
if (lastSlashPos != std::wstring::npos) {
|
||||||
if (lastDotPos > lastSlashPos) ret = path.substr(lastDotPos + 1);
|
if (lastDotPos > lastSlashPos)
|
||||||
}
|
ret = path.substr(lastDotPos + 1);
|
||||||
else ret = path.substr(lastDotPos + 1);
|
} else
|
||||||
|
ret = path.substr(lastDotPos + 1);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -124,8 +124,7 @@ wstring Utility::delimiter(const wstring &path)
|
||||||
std::wstring::size_type lastSlashPos = path.find_last_of(L"/");
|
std::wstring::size_type lastSlashPos = path.find_last_of(L"/");
|
||||||
if (lastSlashPos == std::wstring::npos) {
|
if (lastSlashPos == std::wstring::npos) {
|
||||||
// ret = L"/";
|
// ret = L"/";
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
std::wstring::size_type lastSlashPos = path.find_last_of(L"\\");
|
std::wstring::size_type lastSlashPos = path.find_last_of(L"\\");
|
||||||
if (lastSlashPos != std::wstring::npos) {
|
if (lastSlashPos != std::wstring::npos) {
|
||||||
ret = L"\\";
|
ret = L"\\";
|
||||||
|
@ -134,7 +133,8 @@ wstring Utility::delimiter(const wstring &path)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Utility::isFile(const std::string& name) {
|
bool Utility::isFile(const std::string& name)
|
||||||
|
{
|
||||||
if (FILE* file = fopen(name.c_str(), "r")) {
|
if (FILE* file = fopen(name.c_str(), "r")) {
|
||||||
fclose(file);
|
fclose(file);
|
||||||
return true;
|
return true;
|
||||||
|
@ -143,7 +143,8 @@ bool Utility::isFile(const std::string& name) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Utility::toString(const std::wstring& ws) {
|
std::string Utility::toString(const std::wstring& ws)
|
||||||
|
{
|
||||||
std::string ret;
|
std::string ret;
|
||||||
if (ws.length() > 0) {
|
if (ws.length() > 0) {
|
||||||
// std::string str = "Hello";
|
// std::string str = "Hello";
|
||||||
|
@ -170,7 +171,6 @@ std::string Utility::toString(const std::wstring& ws) {
|
||||||
// //std::cout <<"std::string = "<<s<<std::endl;
|
// //std::cout <<"std::string = "<<s<<std::endl;
|
||||||
// ret = s;
|
// ret = s;
|
||||||
// }
|
// }
|
||||||
// }
|
|
||||||
//return ret;
|
//return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -218,7 +218,8 @@ irr::f32 Utility::toF32(wstring val)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Utility::isFile(const std::wstring& name) {
|
bool Utility::isFile(const std::wstring& name)
|
||||||
|
{
|
||||||
std::string name_s = toString(name);
|
std::string name_s = toString(name);
|
||||||
if (FILE* file = fopen(name_s.c_str(), "r")) {
|
if (FILE* file = fopen(name_s.c_str(), "r")) {
|
||||||
fclose(file);
|
fclose(file);
|
||||||
|
@ -233,7 +234,6 @@ std::string Utility::toString(irr::f32 val)
|
||||||
return std::to_string(val);
|
return std::to_string(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//don't do late instantiation (see header file)
|
//don't do late instantiation (see header file)
|
||||||
//template<typename T>
|
//template<typename T>
|
||||||
//bool Utility::equalsApprox(T f1, T f2)
|
//bool Utility::equalsApprox(T f1, T f2)
|
||||||
|
|
|
@ -5,8 +5,7 @@
|
||||||
|
|
||||||
#include <irrlicht/irrlicht.h>
|
#include <irrlicht/irrlicht.h>
|
||||||
|
|
||||||
class Utility
|
class Utility {
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
static void dumpVectorToConsole(const irr::core::vector3df& vector);
|
static void dumpVectorToConsole(const irr::core::vector3df& vector);
|
||||||
static void dumpMeshInfoToConsole(irr::scene::IAnimatedMeshSceneNode* node);
|
static void dumpMeshInfoToConsole(irr::scene::IAnimatedMeshSceneNode* node);
|
||||||
|
@ -28,7 +27,8 @@ public:
|
||||||
// compiler doesn't like template function when class is not a template--instantiate immediately
|
// compiler doesn't like template function when class is not a template--instantiate immediately
|
||||||
// see http://processors.wiki.ti.com/index.php/C%2B%2B_Template_Instantiation_Issues
|
// see http://processors.wiki.ti.com/index.php/C%2B%2B_Template_Instantiation_Issues
|
||||||
template <typename T>
|
template <typename T>
|
||||||
static bool equalsApprox(T f1, T f2) {
|
static bool equalsApprox(T f1, T f2)
|
||||||
|
{
|
||||||
return abs(f2 - f1) < .00000001; // TODO: kEpsilon? (see also <https://en.wikipedia.org/wiki/Machine_epsilon#How_to_determine_machine_epsilon>)
|
return abs(f2 - f1) < .00000001; // TODO: kEpsilon? (see also <https://en.wikipedia.org/wiki/Machine_epsilon#How_to_determine_machine_epsilon>)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
51
View.cpp
51
View.cpp
|
@ -1,6 +1,6 @@
|
||||||
#include "View.h"
|
#include "View.h"
|
||||||
#include <iostream>
|
|
||||||
#include "Engine.h"
|
#include "Engine.h"
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
using namespace irr;
|
using namespace irr;
|
||||||
using namespace irr::core;
|
using namespace irr::core;
|
||||||
|
@ -18,8 +18,7 @@ void View::setNewCameraPosition(bool zUp)
|
||||||
|
|
||||||
if (zUp) {
|
if (zUp) {
|
||||||
camera->setUpVector(vector3df(0, 0, 1));
|
camera->setUpVector(vector3df(0, 0, 1));
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
camera->setUpVector(vector3df(0, 1, 0));
|
camera->setUpVector(vector3df(0, 1, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,8 +46,7 @@ void View::setNewCameraPosition(bool zUp)
|
||||||
newCameraPosition.Y = m_CameraDistance * cos(m_Pitch);
|
newCameraPosition.Y = m_CameraDistance * cos(m_Pitch);
|
||||||
newCameraPosition.Z = m_CameraDistance * sin(m_Pitch);
|
newCameraPosition.Z = m_CameraDistance * sin(m_Pitch);
|
||||||
yawMatrix.setRotationRadians(vector3df(0, 0, m_Yaw));
|
yawMatrix.setRotationRadians(vector3df(0, 0, m_Yaw));
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
newCameraPosition.X = 0;
|
newCameraPosition.X = 0;
|
||||||
newCameraPosition.Y = m_CameraDistance * sin(m_Pitch);
|
newCameraPosition.Y = m_CameraDistance * sin(m_Pitch);
|
||||||
newCameraPosition.Z = m_CameraDistance * cos(m_Pitch);
|
newCameraPosition.Z = m_CameraDistance * cos(m_Pitch);
|
||||||
|
@ -60,8 +58,7 @@ void View::setNewCameraPosition(bool zUp)
|
||||||
if (zUp) {
|
if (zUp) {
|
||||||
//camera->setUpVector(vector3df(0, 0, 1));
|
//camera->setUpVector(vector3df(0, 0, 1));
|
||||||
//newCameraPosition.Z = oldCamPos.Z;
|
//newCameraPosition.Z = oldCamPos.Z;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
//camera->setUpVector(vector3df(0, 1, 0));
|
//camera->setUpVector(vector3df(0, 1, 0));
|
||||||
//newCameraPosition.Y = oldCamPos.Y;
|
//newCameraPosition.Y = oldCamPos.Y;
|
||||||
}
|
}
|
||||||
|
@ -103,8 +100,7 @@ View::View( Engine *engine )
|
||||||
vector3df offsetVec3(
|
vector3df offsetVec3(
|
||||||
engine->m_CamPos.X - engine->m_CamTarget.X,
|
engine->m_CamPos.X - engine->m_CamTarget.X,
|
||||||
engine->m_CamPos.Y - engine->m_CamTarget.Y,
|
engine->m_CamPos.Y - engine->m_CamTarget.Y,
|
||||||
engine->m_CamPos.Z-engine->m_CamTarget.Z
|
engine->m_CamPos.Z - engine->m_CamTarget.Z);
|
||||||
);
|
|
||||||
m_CameraDistance = offsetVec3.getLength();
|
m_CameraDistance = offsetVec3.getLength();
|
||||||
|
|
||||||
// NOTE: rotationToDirection converts a rotation to a vec3 direction
|
// NOTE: rotationToDirection converts a rotation to a vec3 direction
|
||||||
|
@ -154,38 +150,29 @@ bool View::OnEvent( const SEvent &event )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Handle window resize
|
// Handle window resize
|
||||||
if( event.EventType == EET_USER_EVENT && event.UserEvent.UserData1 == UEI_WINDOWSIZECHANGED )
|
if (event.EventType == EET_USER_EVENT && event.UserEvent.UserData1 == UEI_WINDOWSIZECHANGED) {
|
||||||
{
|
|
||||||
dimension2d<u32> windowSize = m_Engine->m_Driver->getScreenSize();
|
dimension2d<u32> windowSize = m_Engine->m_Driver->getScreenSize();
|
||||||
f32 aspectRatio = static_cast<f32>(windowSize.Width) / static_cast<f32>(windowSize.Height);
|
f32 aspectRatio = static_cast<f32>(windowSize.Width) / static_cast<f32>(windowSize.Height);
|
||||||
debug() << "Setting aspect to: " << aspectRatio << endl;
|
debug() << "Setting aspect to: " << aspectRatio << endl;
|
||||||
m_Engine->m_Scene->getActiveCamera()->setAspectRatio(aspectRatio);
|
m_Engine->m_Scene->getActiveCamera()->setAspectRatio(aspectRatio);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle mouse event
|
// Handle mouse event
|
||||||
const SEvent::SMouseInput* mouseEvent = &(event.MouseInput);
|
const SEvent::SMouseInput* mouseEvent = &(event.MouseInput);
|
||||||
|
|
||||||
if( mouseEvent->Event == EMIE_MMOUSE_PRESSED_DOWN )
|
if (mouseEvent->Event == EMIE_MMOUSE_PRESSED_DOWN) {
|
||||||
{
|
|
||||||
m_RotMouse = true;
|
m_RotMouse = true;
|
||||||
m_LastMousePosition->X = mouseEvent->X;
|
m_LastMousePosition->X = mouseEvent->X;
|
||||||
m_LastMousePosition->Y = mouseEvent->Y;
|
m_LastMousePosition->Y = mouseEvent->Y;
|
||||||
}
|
} else if (mouseEvent->Event == EMIE_MMOUSE_LEFT_UP) {
|
||||||
else if( mouseEvent->Event == EMIE_MMOUSE_LEFT_UP )
|
|
||||||
{
|
|
||||||
m_RotMouse = false;
|
m_RotMouse = false;
|
||||||
}
|
} else if (mouseEvent->Event == EMIE_MOUSE_WHEEL) {
|
||||||
else if( mouseEvent->Event == EMIE_MOUSE_WHEEL )
|
|
||||||
{
|
|
||||||
f32 distanceDelta = mouseEvent->Wheel / 2.5f;
|
f32 distanceDelta = mouseEvent->Wheel / 2.5f;
|
||||||
if (m_CameraDistance - distanceDelta > 0.1f)
|
if (m_CameraDistance - distanceDelta > 0.1f)
|
||||||
m_CameraDistance -= distanceDelta;
|
m_CameraDistance -= distanceDelta;
|
||||||
|
|
||||||
setNewCameraPosition();
|
setNewCameraPosition();
|
||||||
}
|
} else if (m_RotMouse) {
|
||||||
else if( m_RotMouse )
|
|
||||||
{
|
|
||||||
int dx = mouseEvent->X - m_LastMousePosition->X;
|
int dx = mouseEvent->X - m_LastMousePosition->X;
|
||||||
int dy = mouseEvent->Y - m_LastMousePosition->Y;
|
int dy = mouseEvent->Y - m_LastMousePosition->Y;
|
||||||
|
|
||||||
|
@ -208,8 +195,7 @@ bool View::OnEvent( const SEvent &event )
|
||||||
forwards = vector3df(0, 1, 0);
|
forwards = vector3df(0, 1, 0);
|
||||||
dirVec3.rotateYZBy(camRot.X);
|
dirVec3.rotateYZBy(camRot.X);
|
||||||
dirVec3.rotateXYBy(camRot.Z);
|
dirVec3.rotateXYBy(camRot.Z);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
camRot.Z = m_Pitch;
|
camRot.Z = m_Pitch;
|
||||||
dirVec3.rotateYZBy(camRot.X);
|
dirVec3.rotateYZBy(camRot.X);
|
||||||
dirVec3.rotateXYBy(camRot.Y);
|
dirVec3.rotateXYBy(camRot.Y);
|
||||||
|
@ -231,8 +217,7 @@ bool View::OnEvent( const SEvent &event )
|
||||||
if (m_zUp) {
|
if (m_zUp) {
|
||||||
//m_Engine->m_CamPos.Z += yDelta;
|
//m_Engine->m_CamPos.Z += yDelta;
|
||||||
//m_Engine->m_CamTarget.Z += yDelta;
|
//m_Engine->m_CamTarget.Z += yDelta;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
//m_Engine->m_CamPos.Y += yDelta;
|
//m_Engine->m_CamPos.Y += yDelta;
|
||||||
//m_Engine->m_CamTarget.Y += yDelta;
|
//m_Engine->m_CamTarget.Y += yDelta;
|
||||||
}
|
}
|
||||||
|
@ -241,15 +226,13 @@ bool View::OnEvent( const SEvent &event )
|
||||||
vector3df offsetVec3(
|
vector3df offsetVec3(
|
||||||
m_Engine->m_CamPos.X - m_Engine->m_CamTarget.X,
|
m_Engine->m_CamPos.X - m_Engine->m_CamTarget.X,
|
||||||
m_Engine->m_CamPos.Y - m_Engine->m_CamTarget.Y,
|
m_Engine->m_CamPos.Y - m_Engine->m_CamTarget.Y,
|
||||||
m_Engine->m_CamPos.Z-m_Engine->m_CamTarget.Z
|
m_Engine->m_CamPos.Z - m_Engine->m_CamTarget.Z);
|
||||||
);
|
|
||||||
m_CameraDistance = offsetVec3.getLength();
|
m_CameraDistance = offsetVec3.getLength();
|
||||||
|
|
||||||
m_Yaw = atan2(offsetVec3.X, offsetVec3.Z);
|
m_Yaw = atan2(offsetVec3.X, offsetVec3.Z);
|
||||||
m_Pitch = asin(-offsetVec3.Y);
|
m_Pitch = asin(-offsetVec3.Y);
|
||||||
setNewCameraPosition();
|
setNewCameraPosition();
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
// Revolve camera around object.
|
// Revolve camera around object.
|
||||||
// increments of 120 pixels * PI are equal to 180 deg (PI radians):
|
// increments of 120 pixels * PI are equal to 180 deg (PI radians):
|
||||||
f32 pitchDelta = dy / 120.0f;
|
f32 pitchDelta = dy / 120.0f;
|
||||||
|
@ -259,8 +242,10 @@ bool View::OnEvent( const SEvent &event )
|
||||||
m_Pitch += pitchDelta;
|
m_Pitch += pitchDelta;
|
||||||
float minPitch = -PI / 2.0f + PI / 1000.0f;
|
float minPitch = -PI / 2.0f + PI / 1000.0f;
|
||||||
float maxPitch = PI / 2.0f - PI / 1000.0f;
|
float maxPitch = PI / 2.0f - PI / 1000.0f;
|
||||||
if (m_Pitch < minPitch) m_Pitch = minPitch;
|
if (m_Pitch < minPitch)
|
||||||
else if (m_Pitch > maxPitch) m_Pitch = maxPitch;
|
m_Pitch = minPitch;
|
||||||
|
else if (m_Pitch > maxPitch)
|
||||||
|
m_Pitch = maxPitch;
|
||||||
// std::wcerr << "pitch = " << m_Pitch << endl;
|
// std::wcerr << "pitch = " << m_Pitch << endl;
|
||||||
|
|
||||||
m_Yaw += dx / 120.0f;
|
m_Yaw += dx / 120.0f;
|
||||||
|
|
3
View.h
3
View.h
|
@ -5,8 +5,7 @@
|
||||||
|
|
||||||
class Engine;
|
class Engine;
|
||||||
|
|
||||||
class View : public irr::IEventReceiver
|
class View : public irr::IEventReceiver {
|
||||||
{
|
|
||||||
private:
|
private:
|
||||||
Engine* m_Engine;
|
Engine* m_Engine;
|
||||||
irr::f32 m_Yaw, m_Pitch, m_CameraDistance;
|
irr::f32 m_Yaw, m_Pitch, m_CameraDistance;
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/bash
|
||||||
|
clang-format -style=file $1 > $2/$1
|
|
@ -0,0 +1,43 @@
|
||||||
|
#!/bin/sh
|
||||||
|
customDie() {
|
||||||
|
echo
|
||||||
|
echo "ERROR:"
|
||||||
|
echo "$1"
|
||||||
|
echo
|
||||||
|
echo
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
project_dir_name=b3view
|
||||||
|
flag_file=b3view.pro
|
||||||
|
if [ ! -f $flag_file ]; then
|
||||||
|
if [ -f ../$flag_file ]; then
|
||||||
|
cd ..
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [ ! -f $flag_file ]; then
|
||||||
|
echo "ERROR: There was no $flag_file in working or parent directory."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "* rewriting .clang-format to avoid clang-format version issues..."
|
||||||
|
#rewriting avoids the following error:
|
||||||
|
#YAML:94:22: error: unknown key 'Delimiter'
|
||||||
|
# - Delimiter: pb
|
||||||
|
clang-format -style=WebKit -dump-config > .clang-format
|
||||||
|
dump_dest=/tmp/$project_dir_name
|
||||||
|
if [ -d "$dump_dest" ]; then
|
||||||
|
rm -Rf "$dump_dest" || customDie "Cannot remove old $dump_dest"
|
||||||
|
fi
|
||||||
|
mkdir "$dump_dest" || customDie "Cannot mkdir $dump_dest"
|
||||||
|
chmod +x ./etc/pushtmp.sh
|
||||||
|
echo "* writing $dump_dest using .clang-format..."
|
||||||
|
find -maxdepth 1 -name "*.cpp" -exec ./etc/pushtmp.sh {} "$dump_dest" \;
|
||||||
|
find -maxdepth 1 -name "*.h" -exec ./etc/pushtmp.sh {} "$dump_dest" \;
|
||||||
|
|
||||||
|
if [ -f "`command -v meld`" ]; then
|
||||||
|
meld `pwd` "$dump_dest"
|
||||||
|
else
|
||||||
|
echo "You do not have meld installed, so you'll have to diff"
|
||||||
|
echo "against manually to see style issues, such as:"
|
||||||
|
echo "diff -r \"`pwd`\" \"$dump_dest\""
|
||||||
|
fi
|
||||||
|
echo "Done."
|
9
main.cpp
9
main.cpp
|
@ -1,6 +1,6 @@
|
||||||
#include <string.h>
|
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "Engine.h"
|
#include "Engine.h"
|
||||||
|
|
||||||
|
@ -27,8 +27,7 @@ int main( int argc, char **argv )
|
||||||
args = CommandLineToArgvW(GetCommandLineW(), &argc);
|
args = CommandLineToArgvW(GetCommandLineW(), &argc);
|
||||||
|
|
||||||
argv = (char**)malloc(sizeof(char*) * argc);
|
argv = (char**)malloc(sizeof(char*) * argc);
|
||||||
for( int index = 0; index < argc; index ++ )
|
for (int index = 0; index < argc; index++) {
|
||||||
{
|
|
||||||
int argumentBufferLength = wcslen(args[index]) + 1;
|
int argumentBufferLength = wcslen(args[index]) + 1;
|
||||||
argv[index] = (char*)malloc(sizeof(char) * argumentBufferLength);
|
argv[index] = (char*)malloc(sizeof(char) * argumentBufferLength);
|
||||||
sprintf_s(argv[index], argumentBufferLength, "%ws", args[index]);
|
sprintf_s(argv[index], argumentBufferLength, "%ws", args[index]);
|
||||||
|
@ -38,8 +37,7 @@ int main( int argc, char **argv )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Engine* engine = new Engine();
|
Engine* engine = new Engine();
|
||||||
if( argc >= 2 )
|
if (argc >= 2) {
|
||||||
{
|
|
||||||
wchar_t* initialFileName = getWideCharString(argv[1]);
|
wchar_t* initialFileName = getWideCharString(argv[1]);
|
||||||
engine->loadMesh(wstring(initialFileName));
|
engine->loadMesh(wstring(initialFileName));
|
||||||
free(initialFileName);
|
free(initialFileName);
|
||||||
|
@ -69,4 +67,3 @@ wchar_t * getWideCharString( char *str )
|
||||||
|
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue