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
master
hybrid 2008-02-21 00:20:39 +00:00
parent 81e8956dd5
commit beea38a195
7 changed files with 236 additions and 176 deletions

View File

@ -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.

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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())

View File

@ -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;

View File

@ -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
};