diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-04-09 13:50:17 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-04-09 13:50:17 +0400 |
commit | eacf5b5d6d406492ba79b44f9319867230585e9b (patch) | |
tree | 15e5b8ce210f7e8d889edf3ca40b3ee2c3a05904 | |
parent | ba4ad93eada475e607831ce17883d04d1575bc32 (diff) |
BGE Text
- multi-line strings for bitmap text
- keyboard sensor now logs return and pad enter as "\n"
BGE std::vector use in Value.cpp and RAS_MaterialBucket.cpp
The size of a new list is known before making them, reduce re-allocs, though probably not a noticeable speedup.
-rw-r--r-- | source/blender/gpu/intern/gpu_draw.c | 17 | ||||
-rw-r--r-- | source/gameengine/Expressions/Value.cpp | 2 | ||||
-rw-r--r-- | source/gameengine/GameLogic/SCA_KeyboardSensor.cpp | 9 | ||||
-rw-r--r-- | source/gameengine/Rasterizer/RAS_MaterialBucket.cpp | 3 |
4 files changed, 28 insertions, 3 deletions
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c index 3c1c280a727..c0033c89d5c 100644 --- a/source/blender/gpu/intern/gpu_draw.c +++ b/source/blender/gpu/intern/gpu_draw.c @@ -84,6 +84,15 @@ void GPU_render_text(MTFace *tface, int mode, int characters, index, character; float centerx, centery, sizex, sizey, transx, transy, movex, movey, advance; + /* multiline */ + float line_start= 0.0f, line_height; + if (v4) + line_height= MAX4(v1[1], v2[1], v3[1], v4[2]) - MIN4(v1[1], v2[1], v3[1], v4[2]); + else + line_height= MAX3(v1[1], v2[1], v3[1]) - MIN3(v1[1], v2[1], v3[1]); + line_height *= 1.2; /* could be an option? */ + /* end multiline */ + characters = textlen; ima = (Image*)tface->tpage; @@ -97,12 +106,19 @@ void GPU_render_text(MTFace *tface, int mode, glColor3f(1.0f, 1.0f, 1.0f); glPushMatrix(); + for (index = 0; index < characters; index++) { float uv[4][2]; // lets calculate offset stuff character = textstr[index]; + if (character=='\n') { + glTranslatef(line_start, -line_height, 0.0); + line_start = 0.0f; + continue; + } + // space starts at offset 1 // character = character - ' ' + 1; matrixGlyph((ImBuf *)ima->ibufs.first, character, & centerx, ¢ery, @@ -143,6 +159,7 @@ void GPU_render_text(MTFace *tface, int mode, glEnd(); glTranslatef(advance, 0.0, 0.0); + line_start -= advance; /* so we can go back to the start of the line */ } glPopMatrix(); } diff --git a/source/gameengine/Expressions/Value.cpp b/source/gameengine/Expressions/Value.cpp index 8b910b9038b..00d1c4ca77e 100644 --- a/source/gameengine/Expressions/Value.cpp +++ b/source/gameengine/Expressions/Value.cpp @@ -436,6 +436,8 @@ vector<STR_String> CValue::GetPropertyNames() { vector<STR_String> result; if(!m_pNamedPropertyArray) return result; + result.reserve(m_pNamedPropertyArray->size()); + std::map<STR_String,CValue*>::iterator it; for (it= m_pNamedPropertyArray->begin(); (it != m_pNamedPropertyArray->end()); it++) { diff --git a/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp b/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp index 3749bf2eda0..9a8b68d8db3 100644 --- a/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp +++ b/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp @@ -376,7 +376,8 @@ bool SCA_KeyboardSensor::IsPrintable(int keyIndex) || ((keyIndex >= SCA_IInputDevice::KX_AKEY) && (keyIndex <= SCA_IInputDevice::KX_ZKEY)) || (keyIndex == SCA_IInputDevice::KX_SPACEKEY) -/* || (keyIndex == KX_RETKEY) */ + || (keyIndex == SCA_IInputDevice::KX_RETKEY) + || (keyIndex == SCA_IInputDevice::KX_PADENTER) || (keyIndex == SCA_IInputDevice::KX_PADASTERKEY) || (keyIndex == SCA_IInputDevice::KX_TABKEY) || ((keyIndex >= SCA_IInputDevice::KX_COMMAKEY) @@ -386,7 +387,7 @@ bool SCA_KeyboardSensor::IsPrintable(int keyIndex) || ((keyIndex >= SCA_IInputDevice::KX_PAD2) && (keyIndex <= SCA_IInputDevice::KX_PADPLUSKEY)) || (keyIndex == SCA_IInputDevice::KX_DELKEY) - || (keyIndex == SCA_IInputDevice::KX_BACKSPACEKEY) + || (keyIndex == SCA_IInputDevice::KX_BACKSPACEKEY) ) { return true; @@ -423,8 +424,10 @@ char SCA_KeyboardSensor::ToCharacter(int keyIndex, bool shifted) if (keyIndex == SCA_IInputDevice::KX_SPACEKEY) { return ' '; } + if (keyIndex == SCA_IInputDevice::KX_RETKEY || keyIndex == SCA_IInputDevice::KX_PADENTER) { + return '\n'; + } -/* || (keyIndex == SCA_IInputDevice::KX_RETKEY) */ if (keyIndex == SCA_IInputDevice::KX_PADASTERKEY) { return '*'; diff --git a/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp b/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp index 20a8e9c3574..69f73c2ee25 100644 --- a/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp +++ b/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp @@ -330,6 +330,9 @@ bool RAS_MeshSlot::Join(RAS_MeshSlot *target, MT_Scalar distance) for(begin(mit); !end(mit); next(mit)) for(i=mit.startvertex; i<mit.endvertex; i++) mit.vertex[i].Transform(transform, ntransform); + + /* We know we'll need a list at least this big, reserve in advance */ + target->m_displayArrays.reserve(target->m_displayArrays.size() + m_displayArrays.size()); for(it=m_displayArrays.begin(); it!=m_displayArrays.end(); it++) { target->m_displayArrays.push_back(*it); |