Commit beea38a1 authored by hybrid's avatar hybrid

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-e03cc46cb475
parent 81e8956d
...@@ -49,6 +49,8 @@ Changes in version 1.5 (... 2008) ...@@ -49,6 +49,8 @@ Changes in version 1.5 (... 2008)
------------------------------------------- -------------------------------------------
Changes in version 1.4.1 (??? 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. - Fixed the FollowSpline animator to avoid crashes when only one waypoint is given.
- OpenGL VolumeShadow now uses glPolygonOffset to avoid zbuffer artifacts. - OpenGL VolumeShadow now uses glPolygonOffset to avoid zbuffer artifacts.
......
...@@ -55,7 +55,6 @@ namespace scene ...@@ -55,7 +55,6 @@ namespace scene
} }
//! Returns the IMesh interface for a frame. //! Returns the IMesh interface for a frame.
//! \param frame: Frame number as zero based index. The maximum frame number is //! \param frame: Frame number as zero based index. The maximum frame number is
//! getFrameCount() - 1; //! getFrameCount() - 1;
...@@ -91,12 +90,14 @@ namespace scene ...@@ -91,12 +90,14 @@ namespace scene
return Box; return Box;
} }
//! set user axis aligned bounding box //! set user axis aligned bounding box
virtual void setBoundingBox( const core::aabbox3df& box) virtual void setBoundingBox( const core::aabbox3df& box)
{ {
Box = box; Box = box;
} }
void recalculateBoundingBox() void recalculateBoundingBox()
{ {
Box.reset(0,0,0); Box.reset(0,0,0);
...@@ -110,38 +111,53 @@ namespace scene ...@@ -110,38 +111,53 @@ namespace scene
Box.addInternalBox(Meshes[i]->getBoundingBox()); Box.addInternalBox(Meshes[i]->getBoundingBox());
} }
//! Returns the type of the animated mesh. //! Returns the type of the animated mesh.
virtual E_ANIMATED_MESH_TYPE getMeshType() const virtual E_ANIMATED_MESH_TYPE getMeshType() const
{ {
return Type; return Type;
} }
//! returns amount of mesh buffers. //! returns amount of mesh buffers.
virtual u32 getMeshBufferCount() const virtual u32 getMeshBufferCount() const
{ {
if (Meshes.empty())
return 0; return 0;
return Meshes[0]->getMeshBufferCount();
} }
//! returns pointer to a mesh buffer //! returns pointer to a mesh buffer
virtual IMeshBuffer* getMeshBuffer(u32 nr) const virtual IMeshBuffer* getMeshBuffer(u32 nr) const
{ {
if (Meshes.empty())
return 0; return 0;
return Meshes[0]->getMeshBuffer(nr);
} }
//! Returns pointer to a mesh buffer which fits a material //! Returns pointer to a mesh buffer which fits a material
/** \param material: material to search for /** \param material: material to search for
\return Returns the pointer to the mesh buffer or \return Returns the pointer to the mesh buffer or
NULL if there is no such mesh buffer. */ NULL if there is no such mesh buffer. */
virtual IMeshBuffer* getMeshBuffer( const video::SMaterial &material) const virtual IMeshBuffer* getMeshBuffer( const video::SMaterial &material) const
{ {
if (Meshes.empty())
return 0; return 0;
return Meshes[0]->getMeshBuffer(material);
} }
virtual void setMaterialFlag(video::E_MATERIAL_FLAG flag, bool newvalue) 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::aabbox3d<f32> Box;
core::array<IMesh*> Meshes; core::array<IMesh*> Meshes;
E_ANIMATED_MESH_TYPE Type; E_ANIMATED_MESH_TYPE Type;
......
...@@ -35,6 +35,9 @@ namespace core ...@@ -35,6 +35,9 @@ namespace core
const f64 ROUNDING_ERROR_64 = 0.00000001f; const f64 ROUNDING_ERROR_64 = 0.00000001f;
#endif #endif
#ifdef PI // make sure we don't collide with a define
#undef PI
#endif
//! Constant for PI. //! Constant for PI.
const f32 PI = 3.14159265359f; const f32 PI = 3.14159265359f;
...@@ -44,6 +47,9 @@ namespace core ...@@ -44,6 +47,9 @@ namespace core
//! Constant for half of PI. //! Constant for half of PI.
const f32 HALF_PI = PI/2.0f; 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. //! Constant for 64bit PI.
const f64 PI64 = 3.1415926535897932384626433832795028841971693993751; const f64 PI64 = 3.1415926535897932384626433832795028841971693993751;
......
...@@ -205,16 +205,12 @@ void CAnimatedMeshSceneNode::OnAnimate(u32 timeMs) ...@@ -205,16 +205,12 @@ void CAnimatedMeshSceneNode::OnAnimate(u32 timeMs)
{ {
CurrentFrameNr = buildFrameNr ( timeMs ); CurrentFrameNr = buildFrameNr ( timeMs );
if ( Mesh ) if ( Mesh && (Mesh->getMeshType() != EAMT_SKINNED))
{ {
/* scene::IMesh *m = Mesh->getMesh((s32)CurrentFrameNr, 255, StartFrame, EndFrame);
scene::IMesh *m = Mesh->getMesh(CurrentFrameNr, 255, StartFrame, EndFrame);
if ( m ) if ( m )
{
Box = m->getBoundingBox(); Box = m->getBoundingBox();
} }
*/
}
IAnimatedMeshSceneNode::OnAnimate ( timeMs ); IAnimatedMeshSceneNode::OnAnimate ( timeMs );
} }
...@@ -263,11 +259,22 @@ void CAnimatedMeshSceneNode::render() ...@@ -263,11 +259,22 @@ void CAnimatedMeshSceneNode::render()
} }
} }
m=skinnedMesh; 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 ) if ( 0 == m )
{ {
...@@ -284,27 +291,35 @@ void CAnimatedMeshSceneNode::render() ...@@ -284,27 +291,35 @@ void CAnimatedMeshSceneNode::render()
// for debug purposes only: // for debug purposes only:
u32 renderMeshes = 1; bool renderMeshes = true;
video::SMaterial mat; video::SMaterial mat;
if (DebugDataVisible && PassCount==1) if (DebugDataVisible && PassCount==1)
{ {
// overwrite half transparency // overwrite half transparency
if ( DebugDataVisible & scene::EDS_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; 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->setMaterial(mat);
driver->drawMeshBuffer ( m->getMeshBuffer(g) ); driver->drawMeshBuffer(mb);
} }
renderMeshes = 0; renderMeshes = false;
} }
} }
// render original meshes // render original meshes
if ( renderMeshes ) if ( renderMeshes )
{ {
if (RenderFromIdentity)
driver->setTransform(video::ETS_WORLD, core::matrix4() );
for (u32 i=0; i<m->getMeshBufferCount(); ++i) for (u32 i=0; i<m->getMeshBufferCount(); ++i)
{ {
video::IMaterialRenderer* rnd = driver->getMaterialRenderer(Materials[i].MaterialType); video::IMaterialRenderer* rnd = driver->getMaterialRenderer(Materials[i].MaterialType);
...@@ -316,12 +331,9 @@ void CAnimatedMeshSceneNode::render() ...@@ -316,12 +331,9 @@ void CAnimatedMeshSceneNode::render()
{ {
scene::IMeshBuffer* mb = m->getMeshBuffer(i); scene::IMeshBuffer* mb = m->getMeshBuffer(i);
if (RenderFromIdentity) if (Mesh->getMeshType() == EAMT_SKINNED)
driver->setTransform(video::ETS_WORLD, core::matrix4() );
else if (Mesh->getMeshType() == EAMT_SKINNED)
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation * ((SSkinMeshBuffer*)mb)->Transformation); driver->setTransform(video::ETS_WORLD, AbsoluteTransformation * ((SSkinMeshBuffer*)mb)->Transformation);
driver->setMaterial(Materials[i]); driver->setMaterial(Materials[i]);
driver->drawMeshBuffer(mb); driver->drawMeshBuffer(mb);
} }
...@@ -336,14 +348,71 @@ void CAnimatedMeshSceneNode::render() ...@@ -336,14 +348,71 @@ void CAnimatedMeshSceneNode::render()
mat.Lighting = false; mat.Lighting = false;
driver->setMaterial(mat); 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 // show bounding box
if ( DebugDataVisible & scene::EDS_BBOX_BUFFERS ) if ( DebugDataVisible & scene::EDS_BBOX_BUFFERS )
{ {
if (RenderFromIdentity)
driver->setTransform(video::ETS_WORLD, core::matrix4() );
for (u32 g=0; g< m->getMeshBufferCount(); ++g) 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) ); video::SColor(0,190,128,128) );
} }
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
} }
if ( DebugDataVisible & scene::EDS_BBOX ) if ( DebugDataVisible & scene::EDS_BBOX )
...@@ -354,10 +423,8 @@ void CAnimatedMeshSceneNode::render() ...@@ -354,10 +423,8 @@ void CAnimatedMeshSceneNode::render()
{ {
if (Mesh->getMeshType() == EAMT_SKINNED) if (Mesh->getMeshType() == EAMT_SKINNED)
{ {
// draw skeleton // draw skeleton
for (u32 g=0; g < ((ISkinnedMesh*)Mesh)->getAllJoints().size(); ++g) for (u32 g=0; g < ((ISkinnedMesh*)Mesh)->getAllJoints().size(); ++g)
{ {
ISkinnedMesh::SJoint *joint=((ISkinnedMesh*)Mesh)->getAllJoints()[g]; ISkinnedMesh::SJoint *joint=((ISkinnedMesh*)Mesh)->getAllJoints()[g];
...@@ -390,11 +457,9 @@ void CAnimatedMeshSceneNode::render() ...@@ -390,11 +457,9 @@ void CAnimatedMeshSceneNode::render()
core::matrix4 matr; core::matrix4 matr;
SMD3QuaterionTagList *taglist = ((IAnimatedMeshMD3*)Mesh)->getTagList ( (s32)getFrameNr(), SMD3QuaterionTagList *taglist = ((IAnimatedMeshMD3*)Mesh)->getTagList(
255, (s32)getFrameNr(), 255,
getStartFrame (), getStartFrame(), getEndFrame());
getEndFrame ()
);
if ( taglist ) if ( taglist )
{ {
for ( u32 ts = 0; ts != taglist->size(); ++ts ) for ( u32 ts = 0; ts != taglist->size(); ++ts )
...@@ -410,59 +475,22 @@ void CAnimatedMeshSceneNode::render() ...@@ -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 // show mesh
if ( DebugDataVisible & scene::EDS_MESH_WIRE_OVERLAY ) if ( DebugDataVisible & scene::EDS_MESH_WIRE_OVERLAY )
{ {
mat.Lighting = false; mat.Lighting = false;
mat.Wireframe = true; mat.Wireframe = true;
mat.ZBuffer = true;
driver->setMaterial(mat); driver->setMaterial(mat);
if (RenderFromIdentity)
driver->setTransform(video::ETS_WORLD, core::matrix4() );
for (u32 g=0; g<m->getMeshBufferCount(); ++g) 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) ...@@ -504,7 +532,6 @@ bool CAnimatedMeshSceneNode::setFrameLoop(s32 begin, s32 end)
} }
//! sets the speed with witch the animation is played //! sets the speed with witch the animation is played
void CAnimatedMeshSceneNode::setAnimationSpeed(f32 framesPerSecond) void CAnimatedMeshSceneNode::setAnimationSpeed(f32 framesPerSecond)
{ {
...@@ -512,7 +539,6 @@ void CAnimatedMeshSceneNode::setAnimationSpeed(f32 framesPerSecond) ...@@ -512,7 +539,6 @@ void CAnimatedMeshSceneNode::setAnimationSpeed(f32 framesPerSecond)
} }
//! returns the axis aligned bounding box of this node //! returns the axis aligned bounding box of this node
const core::aabbox3d<f32>& CAnimatedMeshSceneNode::getBoundingBox() const const core::aabbox3d<f32>& CAnimatedMeshSceneNode::getBoundingBox() const
{ {
...@@ -520,7 +546,6 @@ 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 //! returns the material based on the zero based index i. To get the amount
//! of materials used by this scene node, use getMaterialCount(). //! of materials used by this scene node, use getMaterialCount().
//! This function is needed for inserting the node into the scene hirachy on a //! This function is needed for inserting the node into the scene hirachy on a
......
...@@ -35,6 +35,8 @@ CGUICheckBox::CGUICheckBox(bool checked, IGUIEnvironment* environment, IGUIEleme ...@@ -35,6 +35,8 @@ CGUICheckBox::CGUICheckBox(bool checked, IGUIEnvironment* environment, IGUIEleme
//! called if an event happened. //! called if an event happened.
bool CGUICheckBox::OnEvent(const SEvent& event) bool CGUICheckBox::OnEvent(const SEvent& event)
{ {
if (IsEnabled)
{
switch(event.EventType) switch(event.EventType)
{ {
case EET_KEY_INPUT_EVENT: case EET_KEY_INPUT_EVENT:
...@@ -115,6 +117,7 @@ bool CGUICheckBox::OnEvent(const SEvent& event) ...@@ -115,6 +117,7 @@ bool CGUICheckBox::OnEvent(const SEvent& event)
default: default:
break; break;
} }
}
return Parent ? Parent->OnEvent(event) : false; return Parent ? Parent->OnEvent(event) : false;
} }
...@@ -140,7 +143,7 @@ void CGUICheckBox::draw() ...@@ -140,7 +143,7 @@ void CGUICheckBox::draw()
checkRect.LowerRightCorner.X = checkRect.UpperLeftCorner.X + height; checkRect.LowerRightCorner.X = checkRect.UpperLeftCorner.X + height;
checkRect.LowerRightCorner.Y = checkRect.UpperLeftCorner.Y + 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); false, true, checkRect, &AbsoluteClippingRect);
if (Checked && Environment->getSkin()) if (Checked && Environment->getSkin())
......
...@@ -37,7 +37,8 @@ CGUIEditBox::CGUIEditBox(const wchar_t* text, bool border, IGUIEnvironment* envi ...@@ -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), OverrideFont(0), LastBreakFont(0), CursorPos(0), HScrollPos(0), VScrollPos(0), Max(0),
WordWrap(false), MultiLine(false), AutoScroll(true), PasswordBox(false), WordWrap(false), MultiLine(false), AutoScroll(true), PasswordBox(false),
PasswordChar(L'*'), PasswordChar(L'*'),
HAlign(EGUIA_UPPERLEFT), VAlign(EGUIA_CENTER) HAlign(EGUIA_UPPERLEFT), VAlign(EGUIA_CENTER),
CurrentTextRect(0,0,1,1), FrameRect(rectangle)
{ {
#ifdef _DEBUG #ifdef _DEBUG
...@@ -55,7 +56,17 @@ CGUIEditBox::CGUIEditBox(const wchar_t* text, bool border, IGUIEnvironment* envi ...@@ -55,7 +56,17 @@ CGUIEditBox::CGUIEditBox(const wchar_t* text, bool border, IGUIEnvironment* envi
setTabStop(true); setTabStop(true);
setTabOrder(-1); 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(); breakText();
calculateScrollPos();
} }
...@@ -658,21 +669,21 @@ void CGUIEditBox::draw() ...@@ -658,21 +669,21 @@ void CGUIEditBox::draw()
if (!skin) if (!skin)
return; return;
frameRect = AbsoluteRect; FrameRect = AbsoluteRect;
// draw the border // draw the border
if (Border) if (Border)
{ {
skin->draw3DSunkenPane(this, skin->getColor(EGDC_WINDOW), 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.X += skin->getSize(EGDS_TEXT_DISTANCE_X)+1;
frameRect.UpperLeftCorner.Y += skin->getSize(EGDS_TEXT_DISTANCE_Y)+1; FrameRect.UpperLeftCorner.Y += skin->getSize(EGDS_TEXT_DISTANCE_Y)+1;
frameRect.LowerRightCorner.X -= skin->getSize(EGDS_TEXT_DISTANCE_X)+1; FrameRect.LowerRightCorner.X -= skin->getSize(EGDS_TEXT_DISTANCE_X)+1;
frameRect.LowerRightCorner.Y -= skin->getSize(EGDS_TEXT_DISTANCE_Y)+1; FrameRect.LowerRightCorner.Y -= skin->getSize(EGDS_TEXT_DISTANCE_Y)+1;
} }
core::rect<s32> localClipRect = frameRect; core::rect<s32> localClipRect = FrameRect;
localClipRect.clipAgainst(AbsoluteClippingRect); localClipRect.clipAgainst(AbsoluteClippingRect);
// draw the text // draw the text
...@@ -927,9 +938,7 @@ bool CGUIEditBox::processMouse(const SEvent& event) ...@@ -927,9 +938,7 @@ bool CGUIEditBox::processMouse(const SEvent& event)
case EMIE_LMOUSE_PRESSED_DOWN: case EMIE_LMOUSE_PRESSED_DOWN:
if (!Environment->hasFocus(this)) if (!Environment->hasFocus(this))
{ {
// get focus
BlinkStartTime = os::Timer::getTime(); BlinkStartTime = os::Timer::getTime();
Environment->setFocus(this);
MouseMarking = true; MouseMarking = true;
CursorPos = getCursorPos(event.MouseInput.X, event.MouseInput.Y); CursorPos = getCursorPos(event.MouseInput.X, event.MouseInput.Y);
MarkBegin = CursorPos; MarkBegin = CursorPos;
...@@ -1135,7 +1144,7 @@ void CGUIEditBox::setTextRect(s32 line) ...@@ -1135,7 +1144,7 @@ void CGUIEditBox::setTextRect(s32 line)
IGUIFont* font = OverrideFont; IGUIFont* font = OverrideFont;
IGUISkin* skin = Environment->getSkin(); IGUISkin* skin = Environment->getSkin();
if (!OverrideFont) if (!font)
font = skin->getFont(); font = skin->getFont();
// get text dimension // get text dimension
...@@ -1156,13 +1165,13 @@ void CGUIEditBox::setTextRect(s32 line) ...@@ -1156,13 +1165,13 @@ void CGUIEditBox::setTextRect(s32 line)
{ {
case EGUIA_CENTER: case EGUIA_CENTER:
// align to h centre // align to h centre
CurrentTextRect.UpperLeftCorner.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); CurrentTextRect.LowerRightCorner.X = (FrameRect.getWidth()/2) + (d.Width/2);
break; break;
case EGUIA_LOWERRIGHT: case EGUIA_LOWERRIGHT:
// align to right edge // align to right edge
CurrentTextRect.UpperLeftCorner.X = frameRect.getWidth() - d.Width; CurrentTextRect.UpperLeftCorner.X = FrameRect.getWidth() - d.Width;
CurrentTextRect.LowerRightCorner.X = frameRect.getWidth(); CurrentTextRect.LowerRightCorner.X = FrameRect.getWidth();
break; break;
default: default:
// align to left edge // align to left edge
...@@ -1176,12 +1185,12 @@ void CGUIEditBox::setTextRect(s32 line) ...@@ -1176,12 +1185,12 @@ void CGUIEditBox::setTextRect(s32 line)
case EGUIA_CENTER: case EGUIA_CENTER:
// align to v centre // align to v centre
CurrentTextRect.UpperLeftCorner.Y = CurrentTextRect.UpperLeftCorner.Y =
(frameRect.getHeight()/2) - (lineCount*d.Height)/2 + d.Height*line; (FrameRect.getHeight()/2) - (lineCount*d.Height)/2 + d.Height*line;
break; break;
case EGUIA_LOWERRIGHT: case EGUIA_LOWERRIGHT:
// align to bottom edge // align to bottom edge
CurrentTextRect.UpperLeftCorner.Y = CurrentTextRect.UpperLeftCorner.Y =
frameRect.getHeight() - lineCount*d.Height + d.Height*line; FrameRect.getHeight() - lineCount*d.Height + d.Height*line;
break; break;
default: default:
// align to top edge // align to top edge
...@@ -1194,7 +1203,7 @@ void CGUIEditBox::setTextRect(s32 line) ...@@ -1194,7 +1203,7 @@ void CGUIEditBox::setTextRect(s32 line)
CurrentTextRect.UpperLeftCorner.Y -= VScrollPos; CurrentTextRect.UpperLeftCorner.Y -= VScrollPos;
CurrentTextRect.LowerRightCorner.Y = CurrentTextRect.UpperLeftCorner.Y + d.Height; CurrentTextRect.LowerRightCorner.Y = CurrentTextRect.UpperLeftCorner.Y + d.Height;
CurrentTextRect += frameRect.UpperLeftCorner; CurrentTextRect += FrameRect.UpperLeftCorner;
} }
...@@ -1259,7 +1268,6 @@ void CGUIEditBox::inputChar(wchar_t c) ...@@ -1259,7 +1268,6 @@ void CGUIEditBox::inputChar(wchar_t c)
void CGUIEditBox::calculateScrollPos() void CGUIEditBox::calculateScrollPos()
{ {
if (!AutoScroll) if (!AutoScroll)
return; return;
...@@ -1284,10 +1292,10 @@ void CGUIEditBox::calculateScrollPos() ...@@ -1284,10 +1292,10 @@ void CGUIEditBox::calculateScrollPos()
s32 cEnd = cStart + font->getDimension(L"_ ").Width; s32 cEnd = cStart + font->getDimension(L"_ ").Width;
if (frameRect.LowerRightCorner.X < cEnd) if (FrameRect.LowerRightCorner.X < cEnd)
HScrollPos = cEnd - frameRect.LowerRightCorner.X; HScrollPos = cEnd - FrameRect.LowerRightCorner.X;
else if (frameRect.UpperLeftCorner.X > cStart) else if (FrameRect.UpperLeftCorner.X > cStart)
HScrollPos = cStart - frameRect.UpperLeftCorner.X; HScrollPos = cStart - FrameRect.UpperLeftCorner.X;
else else
HScrollPos = 0; HScrollPos = 0;
...@@ -1296,11 +1304,11 @@ void CGUIEditBox::calculateScrollPos() ...@@ -1296,11 +1304,11 @@ void CGUIEditBox::calculateScrollPos()
} }
// vertical scroll position // vertical scroll position
if (frameRect.LowerRightCorner.Y < CurrentTextRect.LowerRightCorner.Y + VScrollPos) if (FrameRect.LowerRightCorner.Y < CurrentTextRect.LowerRightCorner.Y + VScrollPos)
VScrollPos = CurrentTextRect.LowerRightCorner.Y - frameRect.LowerRightCorner.Y + VScrollPos; VScrollPos = CurrentTextRect.LowerRightCorner.Y - FrameRect.LowerRightCorner.Y + VScrollPos;
else if (frameRect.UpperLeftCorner.Y > CurrentTextRect.UpperLeftCorner.Y + VScrollPos) else if (FrameRect.UpperLeftCorner.Y > CurrentTextRect.UpperLeftCorner.Y + VScrollPos)
VScrollPos = CurrentTextRect.UpperLeftCorner.Y - frameRect.UpperLeftCorner.Y + VScrollPos; VScrollPos = CurrentTextRect.UpperLeftCorner.Y - FrameRect.UpperLeftCorner.Y + VScrollPos;
else else
VScrollPos = 0; VScrollPos = 0;
......
...@@ -144,7 +144,7 @@ namespace gui ...@@ -144,7 +144,7 @@ namespace gui
core::array< core::stringw > BrokenText; core::array< core::stringw > BrokenText;
core::array< s32 > BrokenTextPositions; core::array< s32 > BrokenTextPositions;
core::rect<s32> CurrentTextRect, frameRect; // temporary values core::rect<s32> CurrentTextRect, FrameRect; // temporary values
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment