add missing files after merging
[blender.git] / source / gameengine / Ketsji / KX_FontObject.cpp
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30 /** \file gameengine/Ketsji/KX_FontObject.cpp
31  *  \ingroup ketsji
32  */
33
34 #include "KX_FontObject.h"
35 #include "DNA_curve_types.h"
36 #include "KX_Scene.h"
37 #include "KX_PythonInit.h"
38 #include "BLI_math.h"
39
40 extern "C" {
41 #include "BLF_api.h"
42 }
43
44 #define BGE_FONT_RES 100
45
46 KX_FontObject::KX_FontObject(   void* sgReplicationInfo,
47                                                                 SG_Callbacks callbacks,
48                                                                 RAS_IRenderTools* rendertools,
49                                                                 Object *ob):
50         KX_GameObject(sgReplicationInfo, callbacks),
51         m_object(ob),
52         m_dpi(72),
53         m_resolution(1.f),
54         m_rendertools(rendertools)
55 {
56         Curve *text = static_cast<Curve *> (ob->data);
57         m_text = text->str;
58         m_fsize = text->fsize;
59
60         /* FO_BUILTIN_NAME != "default" */
61         /* I hope at some point Blender (2.5x) can have a single font   */
62         /* with unicode support for ui and OB_FONT                      */
63         /* once we have packed working we can load the FO_BUILTIN_NAME font     */
64         const char* filepath = text->vfont->name;
65         if (strcmp(FO_BUILTIN_NAME, filepath) == 0)
66                 filepath = "default";
67
68         /* XXX - if it's packed it will not work. waiting for bdiego (Diego) fix for that. */
69         m_fontid = BLF_load(filepath);
70         if (m_fontid == -1)
71                 m_fontid = BLF_load("default");
72
73         /* initialize the color with the object color and store it in the KX_Object class
74            This is a workaround waiting for the fix:
75            [#25487] BGE: Object Color only works when it has a keyed frame */
76         copy_v4_v4(m_color, (const float*) ob->col);
77         this->SetObjectColor((const MT_Vector4&) m_color);
78 }
79
80 KX_FontObject::~KX_FontObject()
81 {
82         //remove font from the scene list
83         //it's handled in KX_Scene::NewRemoveObject
84 }
85
86 CValue* KX_FontObject::GetReplica() {
87         KX_FontObject* replica = new KX_FontObject(*this);
88         replica->ProcessReplica();
89         return replica;
90 }
91
92 void KX_FontObject::ProcessReplica()
93 {
94         KX_GameObject::ProcessReplica();
95         KX_GetActiveScene()->AddFont(this);
96 }
97
98 void KX_FontObject::DrawText()
99 {
100         /* only draws the text if visible */
101         if(this->GetVisible() == 0) return;
102
103         /* update the animated color */
104         this->GetObjectColor().getValue(m_color);
105
106         /* XXX 2DO - handle multiple lines */
107         /* HARDCODED MULTIPLICATION FACTOR - this will affect the render resolution directly */
108         float RES = BGE_FONT_RES * m_resolution;
109
110         float size = m_fsize * m_object->size[0] * RES;
111         float aspect = 1.f / (m_object->size[0] * RES);
112
113         m_rendertools->RenderText3D(m_fontid, m_text, int(size), m_dpi, m_color, this->GetOpenGLMatrix(), aspect);
114 }
115
116 #ifdef WITH_PYTHON
117
118 /* ------------------------------------------------------------------------- */
119 /* Python Integration Hooks                                                                      */
120 /* ------------------------------------------------------------------------- */
121
122 PyTypeObject KX_FontObject::Type = {
123         PyVarObject_HEAD_INIT(NULL, 0)
124         "KX_FontObject",
125         sizeof(PyObjectPlus_Proxy),
126         0,
127         py_base_dealloc,
128         0,
129         0,
130         0,
131         0,
132         py_base_repr,
133         0,
134         &KX_GameObject::Sequence,
135         &KX_GameObject::Mapping,
136         0,0,0,
137         NULL,
138         NULL,
139         0,
140         Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
141         0,0,0,0,0,0,0,
142         Methods,
143         0,
144         0,
145         &KX_GameObject::Type,
146         0,0,0,0,0,0,
147         py_base_new
148 };
149
150 PyMethodDef KX_FontObject::Methods[] = {
151         {NULL,NULL} //Sentinel
152 };
153
154 PyAttributeDef KX_FontObject::Attributes[] = {
155         KX_PYATTRIBUTE_STRING_RW("text", 0, 280, false, KX_FontObject, m_text), //arbitrary limit. 280 = 140 unicode chars in unicode
156         KX_PYATTRIBUTE_FLOAT_RW("size", 0.0001f, 10000.0f, KX_FontObject, m_fsize),
157         KX_PYATTRIBUTE_FLOAT_RW("resolution", 0.0001f, 10000.0f, KX_FontObject, m_resolution),
158         /* KX_PYATTRIBUTE_INT_RW("dpi", 0, 10000, false, KX_FontObject, m_dpi), */// no real need for expose this I think
159         { NULL }        //Sentinel
160 };
161
162 #endif // WITH_PYTHON