doxygen: prevent GPL license block from being parsed as doxygen comment.
[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 #include "BLI_math.h"
34
35 extern "C" {
36 #include "BLF_api.h"
37 }
38
39 #define BGE_FONT_RES 100
40
41 KX_FontObject::KX_FontObject(   void* sgReplicationInfo,
42                                                                 SG_Callbacks callbacks,
43                                                                 RAS_IRenderTools* rendertools,
44                                                                 Object *ob):
45         KX_GameObject(sgReplicationInfo, callbacks),
46         m_object(ob),
47         m_dpi(72),
48         m_resolution(1.f),
49         m_rendertools(rendertools)
50 {
51         Curve *text = static_cast<Curve *> (ob->data);
52         m_text = text->str;
53         m_fsize = text->fsize;
54
55         /* FO_BUILTIN_NAME != "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 FO_BUILTIN_NAME font     */
59         const char* filepath = text->vfont->name;
60         if (strcmp(FO_BUILTIN_NAME, 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         /* initialize the color with the object color and store it in the KX_Object class
69            This is a workaround waiting for the fix:
70            [#25487] BGE: Object Color only works when it has a keyed frame */
71         copy_v4_v4(m_color, (const float*) ob->col);
72         this->SetObjectColor((const MT_Vector4&) m_color);
73 }
74
75 KX_FontObject::~KX_FontObject()
76 {
77         //remove font from the scene list
78         //it's handled in KX_Scene::NewRemoveObject
79 }
80
81 CValue* KX_FontObject::GetReplica() {
82         KX_FontObject* replica = new KX_FontObject(*this);
83         replica->ProcessReplica();
84         return replica;
85 }
86
87 void KX_FontObject::ProcessReplica()
88 {
89         KX_GameObject::ProcessReplica();
90         KX_GetActiveScene()->AddFont(this);
91 }
92
93 void KX_FontObject::DrawText()
94 {
95         /* only draws the text if visible */
96         if(this->GetVisible() == 0) return;
97
98         /* update the animated color */
99         this->GetObjectColor().getValue(m_color);
100
101         /* XXX 2DO - handle multiple lines */
102         /* HARDCODED MULTIPLICATION FACTOR - this will affect the render resolution directly */
103         float RES = BGE_FONT_RES * m_resolution;
104
105         float size = m_fsize * m_object->size[0] * RES;
106         float aspect = 1.f / (m_object->size[0] * RES);
107
108         m_rendertools->RenderText3D(m_fontid, m_text, int(size), m_dpi, m_color, this->GetOpenGLMatrix(), aspect);
109 }
110
111 #ifdef WITH_PYTHON
112
113 /* ------------------------------------------------------------------------- */
114 /* Python Integration Hooks                                                                      */
115 /* ------------------------------------------------------------------------- */
116
117 PyTypeObject KX_FontObject::Type = {
118         PyVarObject_HEAD_INIT(NULL, 0)
119         "KX_FontObject",
120         sizeof(PyObjectPlus_Proxy),
121         0,
122         py_base_dealloc,
123         0,
124         0,
125         0,
126         0,
127         py_base_repr,
128         0,
129         &KX_GameObject::Sequence,
130         &KX_GameObject::Mapping,
131         0,0,0,
132         NULL,
133         NULL,
134         0,
135         Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
136         0,0,0,0,0,0,0,
137         Methods,
138         0,
139         0,
140         &KX_GameObject::Type,
141         0,0,0,0,0,0,
142         py_base_new
143 };
144
145 PyMethodDef KX_FontObject::Methods[] = {
146         {NULL,NULL} //Sentinel
147 };
148
149 PyAttributeDef KX_FontObject::Attributes[] = {
150         KX_PYATTRIBUTE_STRING_RW("text", 0, 280, false, KX_FontObject, m_text), //arbitrary limit. 280 = 140 unicode chars in unicode
151         KX_PYATTRIBUTE_FLOAT_RW("size", 0.0001f, 10000.0f, KX_FontObject, m_fsize),
152         KX_PYATTRIBUTE_FLOAT_RW("resolution", 0.0001f, 10000.0f, KX_FontObject, m_resolution),
153         /* KX_PYATTRIBUTE_INT_RW("dpi", 0, 10000, false, KX_FontObject, m_dpi), */// no real need for expose this I think
154         { NULL }        //Sentinel
155 };
156
157 #endif // WITH_PYTHON