Merged from 1.4 branch revisions 1235:1250
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1251 dfc29bdd-3216-0410-991c-e03cc46cb475master
parent
81e8956dd5
commit
beea38a195
|
@ -49,6 +49,8 @@ Changes in version 1.5 (... 2008)
|
|||
-------------------------------------------
|
||||
Changes in version 1.4.1 (??? 2008)
|
||||
|
||||
- Fixed IGUICheckBox::setEnabled, reported by Dorth
|
||||
|
||||
- Fixed the FollowSpline animator to avoid crashes when only one waypoint is given.
|
||||
|
||||
- OpenGL VolumeShadow now uses glPolygonOffset to avoid zbuffer artifacts.
|
||||
|
|
|
@ -55,7 +55,6 @@ namespace scene
|
|||
}
|
||||
|
||||
|
||||
|
||||
//! Returns the IMesh interface for a frame.
|
||||
//! \param frame: Frame number as zero based index. The maximum frame number is
|
||||
//! getFrameCount() - 1;
|
||||
|
@ -91,12 +90,14 @@ namespace scene
|
|||
return Box;
|
||||
}
|
||||
|
||||
|
||||
//! set user axis aligned bounding box
|
||||
virtual void setBoundingBox( const core::aabbox3df& box)
|
||||
{
|
||||
Box = box;
|
||||
}
|
||||
|
||||
|
||||
void recalculateBoundingBox()
|
||||
{
|
||||
Box.reset(0,0,0);
|
||||
|
@ -110,38 +111,53 @@ namespace scene
|
|||
Box.addInternalBox(Meshes[i]->getBoundingBox());
|
||||
}
|
||||
|
||||
|
||||
//! Returns the type of the animated mesh.
|
||||
virtual E_ANIMATED_MESH_TYPE getMeshType() const
|
||||
{
|
||||
return Type;
|
||||
}
|
||||
|
||||
|
||||
//! returns amount of mesh buffers.
|
||||
virtual u32 getMeshBufferCount() const
|
||||
{
|
||||
return 0;
|
||||
if (Meshes.empty())
|
||||
return 0;
|
||||
|
||||
return Meshes[0]->getMeshBufferCount();
|
||||
}
|
||||
|
||||
|
||||
//! returns pointer to a mesh buffer
|
||||
virtual IMeshBuffer* getMeshBuffer(u32 nr) const
|
||||
{
|
||||
return 0;
|
||||
if (Meshes.empty())
|
||||
return 0;
|
||||
|
||||
return Meshes[0]->getMeshBuffer(nr);
|
||||
}
|
||||
|
||||
|
||||
//! Returns pointer to a mesh buffer which fits a material
|
||||
/** \param material: material to search for
|
||||
\return Returns the pointer to the mesh buffer or
|
||||
NULL if there is no such mesh buffer. */
|
||||
virtual IMeshBuffer* getMeshBuffer( const video::SMaterial &material) const
|
||||
{
|
||||
return 0;
|
||||
if (Meshes.empty())
|
||||
return 0;
|
||||
|
||||
return Meshes[0]->getMeshBuffer(material);
|
||||
}
|
||||
|
||||
|
||||
virtual void setMaterialFlag(video::E_MATERIAL_FLAG flag, bool newvalue)
|
||||
{
|
||||
for (u32 i=0; i<Meshes.size(); ++i)
|
||||
Meshes[i]->setMaterialFlag(flag, newvalue);
|
||||
}
|
||||
|
||||
|
||||
core::aabbox3d<f32> Box;
|
||||
core::array<IMesh*> Meshes;
|
||||
E_ANIMATED_MESH_TYPE Type;
|
||||
|
|
|
@ -35,6 +35,9 @@ namespace core
|
|||
const f64 ROUNDING_ERROR_64 = 0.00000001f;
|
||||
#endif
|
||||
|
||||
#ifdef PI // make sure we don't collide with a define
|
||||
#undef PI
|
||||
#endif
|
||||
//! Constant for PI.
|
||||
const f32 PI = 3.14159265359f;
|
||||
|
||||
|
@ -44,6 +47,9 @@ namespace core
|
|||
//! Constant for half of PI.
|
||||
const f32 HALF_PI = PI/2.0f;
|
||||
|
||||
#ifdef PI64 // make sure we don't collide with a define
|
||||
#undef PI64
|
||||
#endif
|
||||
//! Constant for 64bit PI.
|
||||
const f64 PI64 = 3.1415926535897932384626433832795028841971693993751;
|
||||
|
||||
|
|
|
@ -205,15 +205,11 @@ void CAnimatedMeshSceneNode::OnAnimate(u32 timeMs)
|
|||
{
|
||||
CurrentFrameNr = buildFrameNr ( timeMs );
|
||||
|
||||
if ( Mesh )
|
||||
if ( Mesh && (Mesh->getMeshType() != EAMT_SKINNED))
|
||||
{
|
||||
/*
|
||||
scene::IMesh *m = Mesh->getMesh(CurrentFrameNr, 255, StartFrame, EndFrame);
|
||||
scene::IMesh *m = Mesh->getMesh((s32)CurrentFrameNr, 255, StartFrame, EndFrame);
|
||||
if ( m )
|
||||
{
|
||||
Box = m->getBoundingBox();
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
IAnimatedMeshSceneNode::OnAnimate ( timeMs );
|
||||
|
@ -263,12 +259,23 @@ void CAnimatedMeshSceneNode::render()
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
m=skinnedMesh;
|
||||
if (m)
|
||||
{
|
||||
for (u32 g=0; g< m->getMeshBufferCount(); ++g)
|
||||
{
|
||||
const IMeshBuffer* mb = m->getMeshBuffer(g);
|
||||
const core::matrix4 mat = AbsoluteTransformation * ((SSkinMeshBuffer*)mb)->Transformation;
|
||||
core::aabbox3df tmpbox(mb->getBoundingBox());
|
||||
mat.transformBox(tmpbox);
|
||||
if (g==0)
|
||||
Box = tmpbox;
|
||||
else
|
||||
Box.addInternalBox(tmpbox);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ( 0 == m )
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
|
@ -284,27 +291,35 @@ void CAnimatedMeshSceneNode::render()
|
|||
|
||||
// for debug purposes only:
|
||||
|
||||
u32 renderMeshes = 1;
|
||||
bool renderMeshes = true;
|
||||
video::SMaterial mat;
|
||||
if (DebugDataVisible && PassCount==1)
|
||||
{
|
||||
// overwrite half transparency
|
||||
if ( DebugDataVisible & scene::EDS_HALF_TRANSPARENCY )
|
||||
{
|
||||
for (u32 g=0; g<m->getMeshBufferCount(); ++g)
|
||||
if (RenderFromIdentity)
|
||||
driver->setTransform(video::ETS_WORLD, core::matrix4() );
|
||||
for (u32 i=0; i<m->getMeshBufferCount(); ++i)
|
||||
{
|
||||
mat = Materials[g];
|
||||
scene::IMeshBuffer* mb = m->getMeshBuffer(i);
|
||||
mat = Materials[i];
|
||||
mat.MaterialType = video::EMT_TRANSPARENT_ADD_COLOR;
|
||||
if (Mesh->getMeshType() == EAMT_SKINNED)
|
||||
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation * ((SSkinMeshBuffer*)mb)->Transformation);
|
||||
|
||||
driver->setMaterial(mat);
|
||||
driver->drawMeshBuffer ( m->getMeshBuffer(g) );
|
||||
driver->drawMeshBuffer(mb);
|
||||
}
|
||||
renderMeshes = 0;
|
||||
renderMeshes = false;
|
||||
}
|
||||
}
|
||||
|
||||
// render original meshes
|
||||
if ( renderMeshes )
|
||||
{
|
||||
if (RenderFromIdentity)
|
||||
driver->setTransform(video::ETS_WORLD, core::matrix4() );
|
||||
for (u32 i=0; i<m->getMeshBufferCount(); ++i)
|
||||
{
|
||||
video::IMaterialRenderer* rnd = driver->getMaterialRenderer(Materials[i].MaterialType);
|
||||
|
@ -316,12 +331,9 @@ void CAnimatedMeshSceneNode::render()
|
|||
{
|
||||
scene::IMeshBuffer* mb = m->getMeshBuffer(i);
|
||||
|
||||
if (RenderFromIdentity)
|
||||
driver->setTransform(video::ETS_WORLD, core::matrix4() );
|
||||
else if (Mesh->getMeshType() == EAMT_SKINNED)
|
||||
if (Mesh->getMeshType() == EAMT_SKINNED)
|
||||
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation * ((SSkinMeshBuffer*)mb)->Transformation);
|
||||
|
||||
|
||||
driver->setMaterial(Materials[i]);
|
||||
driver->drawMeshBuffer(mb);
|
||||
}
|
||||
|
@ -336,14 +348,71 @@ void CAnimatedMeshSceneNode::render()
|
|||
mat.Lighting = false;
|
||||
driver->setMaterial(mat);
|
||||
|
||||
// show normals
|
||||
if ( DebugDataVisible & scene::EDS_NORMALS )
|
||||
{
|
||||
IAnimatedMesh * arrow = SceneManager->addArrowMesh (
|
||||
"__debugnormal", 0xFFECEC00,
|
||||
0xFF999900, 4, 8, 1.f, 0.6f, 0.05f,
|
||||
0.3f);
|
||||
if ( 0 == arrow )
|
||||
{
|
||||
arrow = SceneManager->getMesh ( "__debugnormal" );
|
||||
}
|
||||
const IMesh *mesh = arrow->getMesh ( 0 );
|
||||
|
||||
// find a good scaling factor
|
||||
|
||||
core::matrix4 m2;
|
||||
|
||||
// draw normals
|
||||
for (u32 g=0; g<m->getMeshBufferCount(); ++g)
|
||||
{
|
||||
const scene::IMeshBuffer* mb = m->getMeshBuffer(g);
|
||||
const u32 vSize = video::getVertexPitchFromType(mb->getVertexType());
|
||||
const video::S3DVertex* v = ( const video::S3DVertex*)mb->getVertices();
|
||||
for ( u32 i=0; i != mb->getVertexCount(); ++i )
|
||||
{
|
||||
// Align to v->normal
|
||||
core::quaternion quatRot( v->Normal.Z, 0.f, -v->Normal.X, 1 + v->Normal.Y );
|
||||
quatRot.normalize();
|
||||
quatRot.getMatrix ( m2 );
|
||||
|
||||
m2.setTranslation(v->Pos);
|
||||
if (Mesh->getMeshType() == EAMT_SKINNED)
|
||||
{
|
||||
m2 = (AbsoluteTransformation * ((SSkinMeshBuffer*)mb)->Transformation) * m2;
|
||||
}
|
||||
else
|
||||
m2*=AbsoluteTransformation;
|
||||
|
||||
driver->setTransform(video::ETS_WORLD, m2 );
|
||||
for ( u32 a = 0; a != mesh->getMeshBufferCount(); ++a )
|
||||
driver->drawMeshBuffer ( mesh->getMeshBuffer ( a ) );
|
||||
|
||||
v = (const video::S3DVertex*) ( (u8*) v + vSize );
|
||||
}
|
||||
}
|
||||
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
|
||||
}
|
||||
|
||||
mat.MaterialType = video::EMT_SOLID;
|
||||
mat.ZBuffer = false;
|
||||
driver->setMaterial(mat);
|
||||
// show bounding box
|
||||
if ( DebugDataVisible & scene::EDS_BBOX_BUFFERS )
|
||||
{
|
||||
if (RenderFromIdentity)
|
||||
driver->setTransform(video::ETS_WORLD, core::matrix4() );
|
||||
for (u32 g=0; g< m->getMeshBufferCount(); ++g)
|
||||
{
|
||||
driver->draw3DBox( m->getMeshBuffer(g)->getBoundingBox(),
|
||||
const IMeshBuffer* mb = m->getMeshBuffer(g);
|
||||
if (Mesh->getMeshType() == EAMT_SKINNED)
|
||||
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation * ((SSkinMeshBuffer*)mb)->Transformation);
|
||||
driver->draw3DBox( mb->getBoundingBox(),
|
||||
video::SColor(0,190,128,128) );
|
||||
}
|
||||
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
|
||||
}
|
||||
|
||||
if ( DebugDataVisible & scene::EDS_BBOX )
|
||||
|
@ -354,10 +423,8 @@ void CAnimatedMeshSceneNode::render()
|
|||
{
|
||||
if (Mesh->getMeshType() == EAMT_SKINNED)
|
||||
{
|
||||
|
||||
// draw skeleton
|
||||
|
||||
|
||||
for (u32 g=0; g < ((ISkinnedMesh*)Mesh)->getAllJoints().size(); ++g)
|
||||
{
|
||||
ISkinnedMesh::SJoint *joint=((ISkinnedMesh*)Mesh)->getAllJoints()[g];
|
||||
|
@ -390,11 +457,9 @@ void CAnimatedMeshSceneNode::render()
|
|||
|
||||
core::matrix4 matr;
|
||||
|
||||
SMD3QuaterionTagList *taglist = ((IAnimatedMeshMD3*)Mesh)->getTagList ( (s32)getFrameNr(),
|
||||
255,
|
||||
getStartFrame (),
|
||||
getEndFrame ()
|
||||
);
|
||||
SMD3QuaterionTagList *taglist = ((IAnimatedMeshMD3*)Mesh)->getTagList(
|
||||
(s32)getFrameNr(), 255,
|
||||
getStartFrame(), getEndFrame());
|
||||
if ( taglist )
|
||||
{
|
||||
for ( u32 ts = 0; ts != taglist->size(); ++ts )
|
||||
|
@ -410,59 +475,22 @@ void CAnimatedMeshSceneNode::render()
|
|||
}
|
||||
}
|
||||
|
||||
// show normals
|
||||
if ( DebugDataVisible & scene::EDS_NORMALS )
|
||||
{
|
||||
IAnimatedMesh * arrow = SceneManager->addArrowMesh (
|
||||
"__debugnormal", 0xFFECEC00,
|
||||
0xFF999900, 4, 8, 1.f, 0.6f, 0.05f,
|
||||
0.3f);
|
||||
if ( 0 == arrow )
|
||||
{
|
||||
arrow = SceneManager->getMesh ( "__debugnormal" );
|
||||
}
|
||||
IMesh *mesh = arrow->getMesh ( 0 );
|
||||
|
||||
// find a good scaling factor
|
||||
|
||||
core::matrix4 m2;
|
||||
|
||||
// draw normals
|
||||
for (u32 g=0; g<m->getMeshBufferCount(); ++g)
|
||||
{
|
||||
const scene::IMeshBuffer* mb = m->getMeshBuffer(g);
|
||||
const u32 vSize = video::getVertexPitchFromType(mb->getVertexType());
|
||||
const video::S3DVertex* v = ( const video::S3DVertex*)mb->getVertices();
|
||||
for ( u32 i=0; i != mb->getVertexCount(); ++i )
|
||||
{
|
||||
// Align to v->normal
|
||||
core::quaternion quatRot( v->Normal.Z, 0.f, -v->Normal.X, 1 + v->Normal.Y );
|
||||
quatRot.normalize();
|
||||
quatRot.getMatrix ( m2 );
|
||||
|
||||
m2.setTranslation(v->Pos);
|
||||
m2*=AbsoluteTransformation;
|
||||
|
||||
driver->setTransform(video::ETS_WORLD, m2 );
|
||||
for ( u32 a = 0; a != mesh->getMeshBufferCount(); ++a )
|
||||
driver->drawMeshBuffer ( mesh->getMeshBuffer ( a ) );
|
||||
|
||||
v = (const video::S3DVertex*) ( (u8*) v + vSize );
|
||||
}
|
||||
}
|
||||
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
|
||||
}
|
||||
|
||||
// show mesh
|
||||
if ( DebugDataVisible & scene::EDS_MESH_WIRE_OVERLAY )
|
||||
{
|
||||
mat.Lighting = false;
|
||||
mat.Wireframe = true;
|
||||
mat.ZBuffer = true;
|
||||
driver->setMaterial(mat);
|
||||
|
||||
if (RenderFromIdentity)
|
||||
driver->setTransform(video::ETS_WORLD, core::matrix4() );
|
||||
for (u32 g=0; g<m->getMeshBufferCount(); ++g)
|
||||
{
|
||||
driver->drawMeshBuffer( m->getMeshBuffer(g) );
|
||||
const IMeshBuffer* mb = m->getMeshBuffer(g);
|
||||
if (Mesh->getMeshType() == EAMT_SKINNED)
|
||||
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation * ((SSkinMeshBuffer*)mb)->Transformation);
|
||||
driver->drawMeshBuffer(mb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -504,7 +532,6 @@ bool CAnimatedMeshSceneNode::setFrameLoop(s32 begin, s32 end)
|
|||
}
|
||||
|
||||
|
||||
|
||||
//! sets the speed with witch the animation is played
|
||||
void CAnimatedMeshSceneNode::setAnimationSpeed(f32 framesPerSecond)
|
||||
{
|
||||
|
@ -512,7 +539,6 @@ void CAnimatedMeshSceneNode::setAnimationSpeed(f32 framesPerSecond)
|
|||
}
|
||||
|
||||
|
||||
|
||||
//! returns the axis aligned bounding box of this node
|
||||
const core::aabbox3d<f32>& CAnimatedMeshSceneNode::getBoundingBox() const
|
||||
{
|
||||
|
@ -520,7 +546,6 @@ const core::aabbox3d<f32>& CAnimatedMeshSceneNode::getBoundingBox() const
|
|||
}
|
||||
|
||||
|
||||
|
||||
//! returns the material based on the zero based index i. To get the amount
|
||||
//! of materials used by this scene node, use getMaterialCount().
|
||||
//! This function is needed for inserting the node into the scene hirachy on a
|
||||
|
|
|
@ -35,85 +35,88 @@ CGUICheckBox::CGUICheckBox(bool checked, IGUIEnvironment* environment, IGUIEleme
|
|||
//! called if an event happened.
|
||||
bool CGUICheckBox::OnEvent(const SEvent& event)
|
||||
{
|
||||
switch(event.EventType)
|
||||
if (IsEnabled)
|
||||
{
|
||||
case EET_KEY_INPUT_EVENT:
|
||||
if (event.KeyInput.PressedDown &&
|
||||
(event.KeyInput.Key == KEY_RETURN ||
|
||||
event.KeyInput.Key == KEY_SPACE))
|
||||
switch(event.EventType)
|
||||
{
|
||||
Pressed = true;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
if (Pressed && event.KeyInput.PressedDown && event.KeyInput.Key == KEY_ESCAPE)
|
||||
{
|
||||
Pressed = false;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
if (!event.KeyInput.PressedDown && Pressed &&
|
||||
(event.KeyInput.Key == KEY_RETURN ||
|
||||
event.KeyInput.Key == KEY_SPACE))
|
||||
{
|
||||
Pressed = false;
|
||||
if (Parent)
|
||||
case EET_KEY_INPUT_EVENT:
|
||||
if (event.KeyInput.PressedDown &&
|
||||
(event.KeyInput.Key == KEY_RETURN ||
|
||||
event.KeyInput.Key == KEY_SPACE))
|
||||
{
|
||||
SEvent newEvent;
|
||||
newEvent.EventType = EET_GUI_EVENT;
|
||||
newEvent.GUIEvent.Caller = this;
|
||||
newEvent.GUIEvent.Element = 0;
|
||||
Checked = !Checked;
|
||||
newEvent.GUIEvent.EventType = EGET_CHECKBOX_CHANGED;
|
||||
Parent->OnEvent(newEvent);
|
||||
Pressed = true;
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case EET_GUI_EVENT:
|
||||
if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST)
|
||||
{
|
||||
if (event.GUIEvent.Caller == this)
|
||||
Pressed = false;
|
||||
}
|
||||
break;
|
||||
case EET_MOUSE_INPUT_EVENT:
|
||||
if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN)
|
||||
{
|
||||
Pressed = true;
|
||||
checkTime = os::Timer::getTime();
|
||||
Environment->setFocus(this);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP)
|
||||
{
|
||||
bool wasPressed = Pressed;
|
||||
Environment->removeFocus(this);
|
||||
Pressed = false;
|
||||
|
||||
if (wasPressed && Parent)
|
||||
else
|
||||
if (Pressed && event.KeyInput.PressedDown && event.KeyInput.Key == KEY_ESCAPE)
|
||||
{
|
||||
if ( !AbsoluteClippingRect.isPointInside( core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y) ) )
|
||||
Pressed = false;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
if (!event.KeyInput.PressedDown && Pressed &&
|
||||
(event.KeyInput.Key == KEY_RETURN ||
|
||||
event.KeyInput.Key == KEY_SPACE))
|
||||
{
|
||||
Pressed = false;
|
||||
if (Parent)
|
||||
{
|
||||
SEvent newEvent;
|
||||
newEvent.EventType = EET_GUI_EVENT;
|
||||
newEvent.GUIEvent.Caller = this;
|
||||
newEvent.GUIEvent.Element = 0;
|
||||
Checked = !Checked;
|
||||
newEvent.GUIEvent.EventType = EGET_CHECKBOX_CHANGED;
|
||||
Parent->OnEvent(newEvent);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case EET_GUI_EVENT:
|
||||
if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST)
|
||||
{
|
||||
if (event.GUIEvent.Caller == this)
|
||||
Pressed = false;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case EET_MOUSE_INPUT_EVENT:
|
||||
if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN)
|
||||
{
|
||||
Pressed = true;
|
||||
checkTime = os::Timer::getTime();
|
||||
Environment->setFocus(this);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP)
|
||||
{
|
||||
bool wasPressed = Pressed;
|
||||
Environment->removeFocus(this);
|
||||
Pressed = false;
|
||||
|
||||
if (wasPressed && Parent)
|
||||
{
|
||||
if ( !AbsoluteClippingRect.isPointInside( core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y) ) )
|
||||
{
|
||||
Pressed = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
SEvent newEvent;
|
||||
newEvent.EventType = EET_GUI_EVENT;
|
||||
newEvent.GUIEvent.Caller = this;
|
||||
newEvent.GUIEvent.Element = 0;
|
||||
Checked = !Checked;
|
||||
newEvent.GUIEvent.EventType = EGET_CHECKBOX_CHANGED;
|
||||
Parent->OnEvent(newEvent);
|
||||
}
|
||||
|
||||
SEvent newEvent;
|
||||
newEvent.EventType = EET_GUI_EVENT;
|
||||
newEvent.GUIEvent.Caller = this;
|
||||
newEvent.GUIEvent.Element = 0;
|
||||
Checked = !Checked;
|
||||
newEvent.GUIEvent.EventType = EGET_CHECKBOX_CHANGED;
|
||||
Parent->OnEvent(newEvent);
|
||||
return true;
|
||||
}
|
||||
|
||||
return true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return Parent ? Parent->OnEvent(event) : false;
|
||||
|
@ -140,7 +143,7 @@ void CGUICheckBox::draw()
|
|||
checkRect.LowerRightCorner.X = checkRect.UpperLeftCorner.X + height;
|
||||
checkRect.LowerRightCorner.Y = checkRect.UpperLeftCorner.Y + height;
|
||||
|
||||
skin->draw3DSunkenPane(this, skin->getColor(Pressed ? EGDC_3D_FACE : EGDC_ACTIVE_CAPTION),
|
||||
skin->draw3DSunkenPane(this, skin->getColor(Pressed || !IsEnabled ? EGDC_3D_FACE : EGDC_ACTIVE_CAPTION),
|
||||
false, true, checkRect, &AbsoluteClippingRect);
|
||||
|
||||
if (Checked && Environment->getSkin())
|
||||
|
|
|
@ -37,7 +37,8 @@ CGUIEditBox::CGUIEditBox(const wchar_t* text, bool border, IGUIEnvironment* envi
|
|||
OverrideFont(0), LastBreakFont(0), CursorPos(0), HScrollPos(0), VScrollPos(0), Max(0),
|
||||
WordWrap(false), MultiLine(false), AutoScroll(true), PasswordBox(false),
|
||||
PasswordChar(L'*'),
|
||||
HAlign(EGUIA_UPPERLEFT), VAlign(EGUIA_CENTER)
|
||||
HAlign(EGUIA_UPPERLEFT), VAlign(EGUIA_CENTER),
|
||||
CurrentTextRect(0,0,1,1), FrameRect(rectangle)
|
||||
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
|
@ -55,7 +56,17 @@ CGUIEditBox::CGUIEditBox(const wchar_t* text, bool border, IGUIEnvironment* envi
|
|||
setTabStop(true);
|
||||
setTabOrder(-1);
|
||||
|
||||
IGUISkin *skin = Environment->getSkin();
|
||||
if (Border && skin)
|
||||
{
|
||||
FrameRect.UpperLeftCorner.X += skin->getSize(EGDS_TEXT_DISTANCE_X)+1;
|
||||
FrameRect.UpperLeftCorner.Y += skin->getSize(EGDS_TEXT_DISTANCE_Y)+1;
|
||||
FrameRect.LowerRightCorner.X -= skin->getSize(EGDS_TEXT_DISTANCE_X)+1;
|
||||
FrameRect.LowerRightCorner.Y -= skin->getSize(EGDS_TEXT_DISTANCE_Y)+1;
|
||||
}
|
||||
|
||||
breakText();
|
||||
calculateScrollPos();
|
||||
}
|
||||
|
||||
|
||||
|
@ -658,21 +669,21 @@ void CGUIEditBox::draw()
|
|||
if (!skin)
|
||||
return;
|
||||
|
||||
frameRect = AbsoluteRect;
|
||||
FrameRect = AbsoluteRect;
|
||||
|
||||
// draw the border
|
||||
|
||||
if (Border)
|
||||
{
|
||||
skin->draw3DSunkenPane(this, skin->getColor(EGDC_WINDOW),
|
||||
false, true, frameRect, &AbsoluteClippingRect);
|
||||
false, true, FrameRect, &AbsoluteClippingRect);
|
||||
|
||||
frameRect.UpperLeftCorner.X += skin->getSize(EGDS_TEXT_DISTANCE_X)+1;
|
||||
frameRect.UpperLeftCorner.Y += skin->getSize(EGDS_TEXT_DISTANCE_Y)+1;
|
||||
frameRect.LowerRightCorner.X -= skin->getSize(EGDS_TEXT_DISTANCE_X)+1;
|
||||
frameRect.LowerRightCorner.Y -= skin->getSize(EGDS_TEXT_DISTANCE_Y)+1;
|
||||
FrameRect.UpperLeftCorner.X += skin->getSize(EGDS_TEXT_DISTANCE_X)+1;
|
||||
FrameRect.UpperLeftCorner.Y += skin->getSize(EGDS_TEXT_DISTANCE_Y)+1;
|
||||
FrameRect.LowerRightCorner.X -= skin->getSize(EGDS_TEXT_DISTANCE_X)+1;
|
||||
FrameRect.LowerRightCorner.Y -= skin->getSize(EGDS_TEXT_DISTANCE_Y)+1;
|
||||
}
|
||||
core::rect<s32> localClipRect = frameRect;
|
||||
core::rect<s32> localClipRect = FrameRect;
|
||||
localClipRect.clipAgainst(AbsoluteClippingRect);
|
||||
|
||||
// draw the text
|
||||
|
@ -927,9 +938,7 @@ bool CGUIEditBox::processMouse(const SEvent& event)
|
|||
case EMIE_LMOUSE_PRESSED_DOWN:
|
||||
if (!Environment->hasFocus(this))
|
||||
{
|
||||
// get focus
|
||||
BlinkStartTime = os::Timer::getTime();
|
||||
Environment->setFocus(this);
|
||||
MouseMarking = true;
|
||||
CursorPos = getCursorPos(event.MouseInput.X, event.MouseInput.Y);
|
||||
MarkBegin = CursorPos;
|
||||
|
@ -940,7 +949,7 @@ bool CGUIEditBox::processMouse(const SEvent& event)
|
|||
else
|
||||
{
|
||||
if (!AbsoluteClippingRect.isPointInside(
|
||||
core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y)))
|
||||
core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -1135,7 +1144,7 @@ void CGUIEditBox::setTextRect(s32 line)
|
|||
|
||||
IGUIFont* font = OverrideFont;
|
||||
IGUISkin* skin = Environment->getSkin();
|
||||
if (!OverrideFont)
|
||||
if (!font)
|
||||
font = skin->getFont();
|
||||
|
||||
// get text dimension
|
||||
|
@ -1156,13 +1165,13 @@ void CGUIEditBox::setTextRect(s32 line)
|
|||
{
|
||||
case EGUIA_CENTER:
|
||||
// align to h centre
|
||||
CurrentTextRect.UpperLeftCorner.X = (frameRect.getWidth()/2) - (d.Width/2);
|
||||
CurrentTextRect.LowerRightCorner.X = (frameRect.getWidth()/2) + (d.Width/2);
|
||||
CurrentTextRect.UpperLeftCorner.X = (FrameRect.getWidth()/2) - (d.Width/2);
|
||||
CurrentTextRect.LowerRightCorner.X = (FrameRect.getWidth()/2) + (d.Width/2);
|
||||
break;
|
||||
case EGUIA_LOWERRIGHT:
|
||||
// align to right edge
|
||||
CurrentTextRect.UpperLeftCorner.X = frameRect.getWidth() - d.Width;
|
||||
CurrentTextRect.LowerRightCorner.X = frameRect.getWidth();
|
||||
CurrentTextRect.UpperLeftCorner.X = FrameRect.getWidth() - d.Width;
|
||||
CurrentTextRect.LowerRightCorner.X = FrameRect.getWidth();
|
||||
break;
|
||||
default:
|
||||
// align to left edge
|
||||
|
@ -1176,12 +1185,12 @@ void CGUIEditBox::setTextRect(s32 line)
|
|||
case EGUIA_CENTER:
|
||||
// align to v centre
|
||||
CurrentTextRect.UpperLeftCorner.Y =
|
||||
(frameRect.getHeight()/2) - (lineCount*d.Height)/2 + d.Height*line;
|
||||
(FrameRect.getHeight()/2) - (lineCount*d.Height)/2 + d.Height*line;
|
||||
break;
|
||||
case EGUIA_LOWERRIGHT:
|
||||
// align to bottom edge
|
||||
CurrentTextRect.UpperLeftCorner.Y =
|
||||
frameRect.getHeight() - lineCount*d.Height + d.Height*line;
|
||||
FrameRect.getHeight() - lineCount*d.Height + d.Height*line;
|
||||
break;
|
||||
default:
|
||||
// align to top edge
|
||||
|
@ -1194,7 +1203,7 @@ void CGUIEditBox::setTextRect(s32 line)
|
|||
CurrentTextRect.UpperLeftCorner.Y -= VScrollPos;
|
||||
CurrentTextRect.LowerRightCorner.Y = CurrentTextRect.UpperLeftCorner.Y + d.Height;
|
||||
|
||||
CurrentTextRect += frameRect.UpperLeftCorner;
|
||||
CurrentTextRect += FrameRect.UpperLeftCorner;
|
||||
|
||||
}
|
||||
|
||||
|
@ -1259,7 +1268,6 @@ void CGUIEditBox::inputChar(wchar_t c)
|
|||
|
||||
void CGUIEditBox::calculateScrollPos()
|
||||
{
|
||||
|
||||
if (!AutoScroll)
|
||||
return;
|
||||
|
||||
|
@ -1284,10 +1292,10 @@ void CGUIEditBox::calculateScrollPos()
|
|||
|
||||
s32 cEnd = cStart + font->getDimension(L"_ ").Width;
|
||||
|
||||
if (frameRect.LowerRightCorner.X < cEnd)
|
||||
HScrollPos = cEnd - frameRect.LowerRightCorner.X;
|
||||
else if (frameRect.UpperLeftCorner.X > cStart)
|
||||
HScrollPos = cStart - frameRect.UpperLeftCorner.X;
|
||||
if (FrameRect.LowerRightCorner.X < cEnd)
|
||||
HScrollPos = cEnd - FrameRect.LowerRightCorner.X;
|
||||
else if (FrameRect.UpperLeftCorner.X > cStart)
|
||||
HScrollPos = cStart - FrameRect.UpperLeftCorner.X;
|
||||
else
|
||||
HScrollPos = 0;
|
||||
|
||||
|
@ -1296,11 +1304,11 @@ void CGUIEditBox::calculateScrollPos()
|
|||
}
|
||||
|
||||
// vertical scroll position
|
||||
if (frameRect.LowerRightCorner.Y < CurrentTextRect.LowerRightCorner.Y + VScrollPos)
|
||||
VScrollPos = CurrentTextRect.LowerRightCorner.Y - frameRect.LowerRightCorner.Y + VScrollPos;
|
||||
if (FrameRect.LowerRightCorner.Y < CurrentTextRect.LowerRightCorner.Y + VScrollPos)
|
||||
VScrollPos = CurrentTextRect.LowerRightCorner.Y - FrameRect.LowerRightCorner.Y + VScrollPos;
|
||||
|
||||
else if (frameRect.UpperLeftCorner.Y > CurrentTextRect.UpperLeftCorner.Y + VScrollPos)
|
||||
VScrollPos = CurrentTextRect.UpperLeftCorner.Y - frameRect.UpperLeftCorner.Y + VScrollPos;
|
||||
else if (FrameRect.UpperLeftCorner.Y > CurrentTextRect.UpperLeftCorner.Y + VScrollPos)
|
||||
VScrollPos = CurrentTextRect.UpperLeftCorner.Y - FrameRect.UpperLeftCorner.Y + VScrollPos;
|
||||
else
|
||||
VScrollPos = 0;
|
||||
|
||||
|
|
|
@ -144,7 +144,7 @@ namespace gui
|
|||
core::array< core::stringw > BrokenText;
|
||||
core::array< s32 > BrokenTextPositions;
|
||||
|
||||
core::rect<s32> CurrentTextRect, frameRect; // temporary values
|
||||
core::rect<s32> CurrentTextRect, FrameRect; // temporary values
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue