SVN maintenance.
[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 #include "KX_FontObject.h"
30 #include "DNA_curve_types.h"
31 #include "KX_Scene.h"
32 #include "KX_PythonInit.h"
33
34 extern "C" {
35 #include "BLF_api.h"
36 }
37
38 #define BGE_FONT_RES 100
39
40 KX_FontObject::KX_FontObject(   void* sgReplicationInfo,
41                                                                 SG_Callbacks callbacks,
42                                                                 RAS_IRenderTools* rendertools,
43                                                                 Object *ob):
44         KX_GameObject(sgReplicationInfo, callbacks),
45         m_rendertools(rendertools),
46         m_object(ob),
47         m_dpi(72),
48         m_resolution(1.f),
49         m_color(ob->col) /* initial color - non-animatable */
50 {
51         Curve *text = static_cast<Curve *> (ob->data);
52         m_text = text->str;
53         m_fsize = text->fsize;
54
55         /* <builtin> != "default"                                       */
56         /* I hope at some point Blender (2.5x) can have a single font   */
57         /* with unicode support for ui and OB_FONT                      */
58         /* once we have packed working we can load the <builtin> font   */
59         const char* filepath = text->vfont->name;
60         if (strcmp("<builtin>", filepath) == 0)
61                 filepath = "default";
62
63         /* XXX - if it's packed it will not work. waiting for bdiego (Diego) fix for that. */
64         m_fontid = BLF_load(filepath);
65         if (m_fontid == -1)
66                 m_fontid = BLF_load("default");
67 }
68
69 KX_FontObject::~KX_FontObject()
70 {
71         //remove font from the scene list
72         //it's handled in KX_Scene::NewRemoveObject
73 }
74
75 CValue* KX_FontObject::GetReplica() {
76         KX_FontObject* replica = new KX_FontObject(*this);
77         replica->ProcessReplica();
78         return replica;
79 }
80
81 void KX_FontObject::ProcessReplica()
82 {
83         KX_GameObject::ProcessReplica();
84         KX_GetActiveScene()->AddFont(this);
85 }
86
87 void KX_FontObject::DrawText()
88 {
89         /* only draws the text if visible */
90         if(this->GetVisible() == 0) return;
91
92         /* XXX 2DO - handle multiple lines
93         /* HARDCODED MULTIPLICATION FACTOR - this will affect the render resolution directly */
94         float RES = BGE_FONT_RES * m_resolution;
95
96         float size = m_fsize * m_object->size[0] * RES;
97         float aspect = 1.f / (m_object->size[0] * RES);
98         m_rendertools->RenderText3D(m_fontid, m_text, int(size), m_dpi, m_color, this->GetOpenGLMatrix(), aspect);
99 }
100
101 #ifdef WITH_PYTHON
102
103 /* ------------------------------------------------------------------------- */
104 /* Python Integration Hooks                                                                      */
105 /* ------------------------------------------------------------------------- */
106
107 PyTypeObject KX_FontObject::Type = {
108         PyVarObject_HEAD_INIT(NULL, 0)
109         "KX_FontObject",
110         sizeof(PyObjectPlus_Proxy),
111         0,
112         py_base_dealloc,
113         0,
114         0,
115         0,
116         0,
117         py_base_repr,
118         0,
119         &KX_GameObject::Sequence,
120         &KX_GameObject::Mapping,
121         0,0,0,
122         NULL,
123         NULL,
124         0,
125         Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
126         0,0,0,0,0,0,0,
127         Methods,
128         0,
129         0,
130         &KX_GameObject::Type,
131         0,0,0,0,0,0,
132         py_base_new
133 };
134
135 PyMethodDef KX_FontObject::Methods[] = {
136         {NULL,NULL} //Sentinel
137 };
138
139 PyAttributeDef KX_FontObject::Attributes[] = {
140         KX_PYATTRIBUTE_STRING_RW("text", 0, 100, false, KX_FontObject, m_text),
141         KX_PYATTRIBUTE_FLOAT_RW("size", 0.0001f, 10000.0f, KX_FontObject, m_fsize),
142         KX_PYATTRIBUTE_FLOAT_RW("resolution", 0.0001f, 10000.0f, KX_FontObject, m_resolution),
143         /* KX_PYATTRIBUTE_INT_RW("dpi", 0, 10000, false, KX_FontObject, m_dpi), */// no real need for expose this I think
144         { NULL }        //Sentinel
145 };
146
147 #endif // WITH_PYTHON