From 77720694a38184c7ad4760bd54eee38fc8f4c751 Mon Sep 17 00:00:00 2001 From: codeimp Date: Tue, 13 May 2008 14:24:35 +0000 Subject: [PATCH] - added proper text rendering - linedef lengths visible when dragging geometry - included my ancient bitmap font creator --- Resources/BitmapFont/BitmapFont.vbp | 36 + Resources/BitmapFont/BitmapFont.vbw | 2 + Resources/BitmapFont/Form1.frm | 193 ++++ Resources/BitmapFont/Form1.frx | Bin 0 -> 12 bytes Resources/BitmapFont/clsConfiguration.cls | 844 ++++++++++++++++++ Resources/Font.cfg | 384 ++++---- Resources/Font.cpt | Bin 187037 -> 280332 bytes Resources/Font.png | Bin 22848 -> 23772 bytes Source/Builder.csproj | 5 + .../ClassicModes/DragGeometryMode.cs | 38 +- .../ClassicModes/DragLinedefsMode.cs | 10 + .../ClassicModes/DragSectorsMode.cs | 10 + .../ClassicModes/DragVerticesMode.cs | 10 +- Source/IO/DoomMapSetIO.cs | 1 + Source/IO/HexenMapSetIO.cs | 1 + Source/IO/IMapSetIO.cs | 1 + Source/IO/MapSetIO.cs | 1 + Source/IO/UniversalMapSetIO.cs | 1 + Source/Interface/PreferencesForm.Designer.cs | 23 +- Source/Map/Linedef.cs | 6 + Source/Rendering/D3DDevice.cs | 15 + Source/Rendering/IRenderer2D.cs | 3 +- Source/Rendering/Renderer2D.cs | 54 +- Source/Rendering/ShaderManager.cs | 4 + Source/Rendering/TextAlignment.cs | 56 ++ Source/Rendering/TextFont.cs | 272 ++++++ Source/Rendering/TextLabel.cs | 283 ++++++ Source/Rendering/Texture2DShader.cs | 102 +++ Source/Resources/Font.cfg | 384 ++++---- Source/Resources/Font.png | Bin 22848 -> 23772 bytes Source/Resources/texture2d.fx | 40 + Source/Resources/world3d.fx | 5 +- 32 files changed, 2344 insertions(+), 440 deletions(-) create mode 100644 Resources/BitmapFont/BitmapFont.vbp create mode 100644 Resources/BitmapFont/BitmapFont.vbw create mode 100644 Resources/BitmapFont/Form1.frm create mode 100644 Resources/BitmapFont/Form1.frx create mode 100644 Resources/BitmapFont/clsConfiguration.cls create mode 100644 Source/Rendering/TextAlignment.cs create mode 100644 Source/Rendering/TextFont.cs create mode 100644 Source/Rendering/TextLabel.cs create mode 100644 Source/Rendering/Texture2DShader.cs create mode 100644 Source/Resources/texture2d.fx diff --git a/Resources/BitmapFont/BitmapFont.vbp b/Resources/BitmapFont/BitmapFont.vbp new file mode 100644 index 00000000..0d2ba50e --- /dev/null +++ b/Resources/BitmapFont/BitmapFont.vbp @@ -0,0 +1,36 @@ +Type=Exe +Reference=*\G{420B2830-E718-11CF-893D-00A0C9054228}#1.0#0#C:\WINDOWS\system32\scrrun.dll#Microsoft Scripting Runtime +Form=Form1.frm +Class=clsConfiguration; clsConfiguration.cls +IconForm="frmChars" +Startup="frmChars" +HelpFile="" +Title="BitmapFont" +Command32="" +Name="BitmapFont" +HelpContextID="0" +CompatibleMode="0" +MajorVer=1 +MinorVer=0 +RevisionVer=0 +AutoIncrementVer=0 +ServerSupportFiles=0 +VersionCompanyName="XODE Multimedia" +CompilationType=0 +OptimizationType=0 +FavorPentiumPro(tm)=0 +CodeViewDebugInfo=0 +NoAliasing=0 +BoundsCheck=0 +OverflowCheck=0 +FlPointCheck=0 +FDIVCheck=0 +UnroundedFP=0 +StartMode=0 +Unattended=0 +Retained=0 +ThreadPerObject=0 +MaxNumberOfThreads=1 + +[MS Transaction Server] +AutoRefresh=1 diff --git a/Resources/BitmapFont/BitmapFont.vbw b/Resources/BitmapFont/BitmapFont.vbw new file mode 100644 index 00000000..418b6534 --- /dev/null +++ b/Resources/BitmapFont/BitmapFont.vbw @@ -0,0 +1,2 @@ +frmChars = -4, 118, 902, 640, C, 65, 69, 690, 511, C +clsConfiguration = 66, 66, 676, 562, C diff --git a/Resources/BitmapFont/Form1.frm b/Resources/BitmapFont/Form1.frm new file mode 100644 index 00000000..f6e11c4f --- /dev/null +++ b/Resources/BitmapFont/Form1.frm @@ -0,0 +1,193 @@ +VERSION 5.00 +Begin VB.Form frmChars + BorderStyle = 1 'Fixed Single + Caption = "Bitmap Font Generator" + ClientHeight = 8910 + ClientLeft = 45 + ClientTop = 330 + ClientWidth = 8715 + ClipControls = 0 'False + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 400 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + Icon = "Form1.frx":0000 + MaxButton = 0 'False + MinButton = 0 'False + ScaleHeight = 594 + ScaleMode = 3 'Pixel + ScaleWidth = 581 + StartUpPosition = 3 'Windows Default + Begin VB.PictureBox picChar + AutoRedraw = -1 'True + BackColor = &H00000000& + BorderStyle = 0 'None + CausesValidation= 0 'False + ClipControls = 0 'False + FillColor = &H00FFFFFF& + BeginProperty Font + Name = "Arial" + Size = 24 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + ForeColor = &H00FFFFFF& + Height = 510 + Left = 7890 + ScaleHeight = 34 + ScaleMode = 3 'Pixel + ScaleWidth = 34 + TabIndex = 0 + Top = 60 + Visible = 0 'False + Width = 510 + End + Begin VB.PictureBox picBitmap + AutoRedraw = -1 'True + BackColor = &H00000000& + BorderStyle = 0 'None + CausesValidation= 0 'False + ClipControls = 0 'False + FillColor = &H00FFFFFF& + ForeColor = &H00FFFFFF& + Height = 3840 + Left = 45 + ScaleHeight = 256 + ScaleMode = 3 'Pixel + ScaleWidth = 512 + TabIndex = 2 + Top = 45 + Width = 7680 + End + Begin VB.Label lblChars + Caption = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 !@#$%^&*()_+=-[]:;'"",.<>/?\" + BeginProperty Font + Name = "Arial Black" + Size = 24 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + Height = 1095 + Left = 60 + TabIndex = 1 + Top = 7785 + UseMnemonic = 0 'False + Visible = 0 'False + Width = 8475 + End +End +Attribute VB_Name = "frmChars" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +Option Explicit + +Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) +Sub DrawChar(Char As String) + + picChar.Width = picChar.TextWidth(Char) + + DoEvents + + picChar.Height = picChar.TextHeight(Char) + + DoEvents + + Set picChar.Picture = Nothing + picChar.Cls + + picChar.Print Char + + DoEvents +End Sub + +Private Sub Form_Load() + Dim i + Dim CharX As Integer + Dim CharY As Integer + Dim LargestY As Integer + Dim cfg As New clsConfiguration + Dim settings As Dictionary + Dim chars As New Dictionary + + Show + Refresh + + picChar.Font = lblChars.Font + picChar.FontSize = lblChars.FontSize + + ''Adjustment (in pixels) per character + Const u1 As Single = -4 '-2 + Const v1 As Single = -4 '-2 + Const u2 As Single = 4 '2 + Const v2 As Single = 5 '5 + + ''Spacing + Const sx As Long = 10 + Const sy As Long = 6 + + ''Offset + Const ox As Long = 10 + Const oy As Long = 3 + + ''Start values + CharY = oy + CharX = ox + LargestY = 0 + + cfg.NewConfiguration + + 'Render all chars + For i = 1 To Len(lblChars) + + 'Get the bitmap char + DrawChar Mid$(lblChars, i, 1) + + If (picChar.Height - 3) > LargestY Then LargestY = (picChar.Height - 3) + If CharX + picChar.Width >= (picBitmap.Width - sx / 2) Then + 'Go to next character position + CharY = CharY + LargestY + sy + LargestY = 0 + CharX = ox + End If + + 'Draw on bitmap + picBitmap.PaintPicture picChar.Image, CharX, CharY - 2 + + 'Make settings + Set settings = New Dictionary + settings.Add "width", CLng(picChar.Width) + settings.Add "height", CLng((picChar.Height - 3)) + settings.Add "u1", (CSng(CharX) + u1) / CSng(picBitmap.Width) + settings.Add "v1", (CSng(CharY) + v1) / CSng(picBitmap.Height) + settings.Add "u2", (CSng(CharX + picChar.Width) + u2) / CSng(picBitmap.Width) + settings.Add "v2", (CSng(CharY + (picChar.Height - 3)) + v2) / CSng(picBitmap.Height) + chars.Add Asc(Mid$(lblChars, i, 1)), settings + Set settings = Nothing + + 'Go to next character position + CharX = CharX + picChar.Width + sx + Next i + + 'save bitmap + SavePicture picBitmap.Image, "font.bmp" + + 'save config + cfg.WriteSetting "count", CLng(Len(lblChars)) + cfg.WriteSetting "chars", chars, True + cfg.SaveConfiguration "font.cfg" + +End Sub + diff --git a/Resources/BitmapFont/Form1.frx b/Resources/BitmapFont/Form1.frx new file mode 100644 index 0000000000000000000000000000000000000000..b20c2b651ae30922e10c956dab3f94549db23433 GIT binary patch literal 12 Qcmd;JU|`580TMs}00#H~=>Px# literal 0 HcmV?d00001 diff --git a/Resources/BitmapFont/clsConfiguration.cls b/Resources/BitmapFont/clsConfiguration.cls new file mode 100644 index 00000000..c5d435e7 --- /dev/null +++ b/Resources/BitmapFont/clsConfiguration.cls @@ -0,0 +1,844 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "clsConfiguration" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +' ==================================================================================== +' INTRODUCTION +' ==================================================================================== +' +' Configuration Class Module by Pascal vd Heiden, www.codeimp.com +' +' This Class module contains code of my design. You are free to use it, +' as long as you do not remove my details up here in this comment. Thanks. +' +' This Class module requires "Microsoft Scripting Runtime" reference (scrrun.dll) +' for the Dictionary object. Select this in the Project -> References dialog. +' +' Can safely be compiled with Fast Optimization and +' all Advanced Optimization switches checked. +' +' +' ==================================================================================== +' CONFIGURATION FILE STRUCTURE SYNTAX +' ==================================================================================== +' +' Whitepace is always allowed. This includes spaces, tabs +' linefeeds (10) and carriage returns (13) +' +' Keys may not have spaces or assignment operator = in them. +' +' Comments start with // (unless used within strings) +' and count as comment for the rest of the line. Or use /* and */ +' to mark the beginning and end of a comment. +' +' Simple setting: +' +' key = value; +' +' Example: speed = 345; +' cars = 8; +' +' Strings must be in quotes. +' +' Example: nickname = "Gherkin"; +' altnick = "Gherk inn"; +' +' String Escape Sequences: +' \n New line (10) +' \r Carriage return (13) +' \t Tab (9) +' \" Double-quotation mark +' \\ Backslash +' \000 Any ASCII character (MUST be 3 digits! So for 13 you use \013) +' +' Decimals ALWAYS use a dot, NEVER comma! +' +' Example: pressure = 15.29; +' acceleration = 1.0023; +' +' Structures must use brackets. +' +' Structure Example: +' +' key +' { +' key = value; +' key = value; +' +' key +' { +' key = value; +' key = value; +' key = value; +' } +' +' key = value; +' key = value; +' key = value; +' key = value; +' key = value; +' } +' +' As you can see, structures inside structures are allowed +' and you may go as deep as you want. Note that only the root structures +' can be readed from config using ReadSetting. ReadSetting will return a +' Dictionary object containing everything in that root structure. +' +' Key names must be unique within their scope. +' +' This is NOT allowed, it may not have 'father' more +' than once in the same scope: +' +' mother = 45; +' father = 52; +' +' father +' { +' length = 1.87; +' } +' +' This however is allowed, because father +' now exists in a different scope: +' +' mother = 45; +' father = 52; +' +' parents +' { +' father = 52; +' } +' +' This too is allowed, both 'age' are in a different scope: +' +' mother +' { +' age = 45; +' } +' +' father +' { +' age = 52; +' } +' +' +' ==================================================================================== +' FUNCTION CALL DESCRIPTIONS +' ==================================================================================== +' +' InputConfiguration +' +' This loads a configuration from a string. The string must contain a +' configuration using the rules described above. +' +' ------------------------------------------------------------------------------------ +' +' LoadConfiguration +' +' Loads a configuration from a file. The file must contain a configuration +' using the rules described above. +' +' ------------------------------------------------------------------------------------ +' +' NewConfiguration +' +' Erases all loaded settings and starts with a new, clear configuration +' +' ------------------------------------------------------------------------------------ +' +' OutputConfiguration +' +' Returns the configuration as a string following the rules described above. +' You can optionally determine the newline character to use and/or omit +' whitespace in the result. +' +' ------------------------------------------------------------------------------------ +' +' SaveConfiguration +' +' Writes the configuration to file following the rules described above. +' You can optionally specify the newline character to use and/or omit +' whitespace in the result. +' +' ------------------------------------------------------------------------------------ +' +' ReadSetting +' +' Reads a setting from the root level and returns it in its own variable type. +' You can optionally specify a default to return if the specified setting +' does not exist and/or specify if you would like to get a reference if the +' setting is a Dictionary object (structure in configuration). +' If you use a reference, you can change the configuration immediately +' through that reference. +' +' ------------------------------------------------------------------------------------ +' +' WriteSetting +' +' Writes a setting to the root level in the configuration. +' You can choose to write the setting as reference if it is of Dictionary type. +' Note that your configuration changes too when you change anything +' in your Dictionary when it is written as reference! +' +' ------------------------------------------------------------------------------------ +' +' RemoveSetting +' +' Removes a setting from the root level in the configuration. +' Its as simple as that. What else is there to tell about it?! +' +' ------------------------------------------------------------------------------------ +' +' Root +' +' Returns the entire configuration (root level) as a Dictionary object. +' You can optionally specify to return a reference through which you can change +' the configuration immediately. +' +' ==================================================================================== +' ==================================================================================== + + + +'Do not allow any undeclared variables +Option Explicit + +'Case sensitive comparisions +Option Compare Binary + +Private Const ASSIGNOP As Long = 61 ' = +Private Const BEGINOP As Long = 123 ' { +Private Const ENDOP As Long = 125 ' } +Private Const TERMINATEOP As Long = 59 ' ; +Private Const STRINGOP As Long = 34 ' " +Private Const COMMENT As String = "//" ' +Private Const BEGINCOMMENT As String = "/*" ' +Private Const ENDCOMMENT As String = "*/" ' + +Private Const WS_SPACE As Long = 32 ' space +Private Const WS_LINEFEED As Long = 10 ' linefeed +Private Const WS_TAB As String = vbTab ' +Private Const WS_RETURN As String = vbCr ' + +Private Const ESCAPESEQ As Long = 92 ' \ +Private Const ES_NEWLINE As Long = 110 ' n +Private Const ES_RETURN As Long = 114 ' r +Private Const ES_TAB As Long = 116 ' t +Private Const ES_QUOTE As Long = 34 ' " +Private Const ES_BACKSLASH As Long = 92 ' \ + +'This will hold the object orientated configuration +Private Config As Dictionary + +'Last line that was read where error occurred +Private cLastReadLine As Long + +Public Property Get CurrentScanLine() As Long + CurrentScanLine = cLastReadLine +End Property + +Private Sub Class_Initialize() + + 'New database + Set Config = New Dictionary +End Sub + +Private Sub Class_Terminate() + + 'Clean up + Set Config = Nothing +End Sub + +Private Function DeepCopy(ByRef Dict As Dictionary) As Dictionary + Dim NewConfig As Dictionary + Dim CopyObject As Dictionary + Dim ConfigKeys As Variant + Dim ConfigValue As Variant + Dim i As Long + + 'Create new config + Set NewConfig = New Dictionary + + 'Add all items from Config + If Dict.Count Then + ConfigKeys = Dict.Keys + For i = LBound(ConfigKeys) To UBound(ConfigKeys) + + 'Check if the value is a dictionary + If VarType(Dict(ConfigKeys(i))) = vbObject Then + + 'Get the object + Set CopyObject = Dict(ConfigKeys(i)) + + 'Deepcopy this too + NewConfig.Add ConfigKeys(i), DeepCopy(CopyObject) + + 'Clean up + Set CopyObject = Nothing + Else + + 'Normal copy + ConfigValue = Dict(ConfigKeys(i)) + NewConfig.Add ConfigKeys(i), ConfigValue + End If + Next i + End If + + 'Return the result + Set DeepCopy = NewConfig + + 'Clean up + Set NewConfig = Nothing +End Function + +Private Function Escaped(ByRef Value As String) As String + + ' \n New line + ' \r Carriage return + ' \t Tab + ' \" Double quotation mark + ' \\ Backslash + + 'Copy string + Escaped = Value + + 'Replace characters with escape sequences + Escaped = Replace$(Escaped, "\", "\\") 'Note the \ must be the first to replace! + Escaped = Replace$(Escaped, vbLf, "\n") + Escaped = Replace$(Escaped, vbCr, "\r") + Escaped = Replace$(Escaped, vbTab, "\t") + Escaped = Replace$(Escaped, """", "\""") +End Function + +Public Sub InputConfiguration(ByVal Configuration As String) + + + 'This reads the data and builds a new dictionary object + + + 'Remove Returns and Tabs so we only have Linefeed as newline + Configuration = Replace$(Configuration, WS_RETURN, "") + Configuration = Replace$(Configuration, WS_TAB, "") + + + 'First line + cLastReadLine = 1 + + 'Load main structure + Set Config = LoadStructure(0, Configuration) +End Sub + +Public Sub LoadConfiguration(ByRef Filename As String) + Dim FB As Integer 'File buffer + Dim Data As String 'Data + + + 'This reads a file and builds a new dictionary object + + + 'Open the file to read + FB = FreeFile + Open Filename For Binary As #FB + + 'Read all data + Data = Space$(LOF(FB)) + Get #FB, 1, Data + + 'Close file + Close #FB + + + 'Remove Returns and Tabs so we only have Linefeed as newline + Data = Replace$(Data, WS_RETURN, "") + Data = Replace$(Data, WS_TAB, "") + + + 'First line + cLastReadLine = 1 + + 'Load main structure + Set Config = LoadStructure(0, Data) +End Sub + +Private Function LoadStructure(ByRef p As Long, ByRef Data As String) As Dictionary + Dim c As String * 1 'Character at p + Dim ca As Long 'ASCII value of c + Dim np As Long 'Next position + Dim StringData As Boolean 'True if in a string + Dim NumberData As Boolean 'True if in a number + Dim Sequence As Boolean 'True if getting a sequence character + Dim Assigning As Boolean 'True when assigning + Dim NewKey As String + Dim NewValue As String + + 'Create dictionary + Set LoadStructure = New Dictionary + + 'Continue until end of data + Do While p < Len(Data) + + 'Next char + p = p + 1 + + 'Get char + c = Mid$(Data, p, 1) + ca = AscW(c) + + 'Check if we are processing number data + If NumberData Then + + 'Check if assignment ends + If ca = TERMINATEOP Then + + 'Check number type + If InStr(NewValue, ".") <> 0 Then + + 'Add the number to dictionary as single + LoadStructure.Add Trim$(NewKey), CSng(Val(NewValue)) + Else + + 'Add the number to dictionary as long + LoadStructure.Add Trim$(NewKey), CLng(NewValue) + End If + + 'Reset + NewKey = "" + NewValue = "" + + 'End of assign + NumberData = False + Assigning = False + + 'Check if newline + ElseIf (ca = WS_LINEFEED) Then + + 'Count the new line + cLastReadLine = cLastReadLine + 1 + Else + + 'Add to value + NewValue = NewValue & c + End If + + 'Check if we are processing string data + ElseIf StringData Then + + 'Check if previous char was a slash + If Sequence Then + + 'Check the char + Select Case ca + Case ES_BACKSLASH: NewValue = NewValue & "\" + Case ES_NEWLINE: NewValue = NewValue & vbLf + Case ES_QUOTE: NewValue = NewValue & """" + Case ES_RETURN: NewValue = NewValue & vbCr + Case ES_TAB: NewValue = NewValue & vbTab + Case Else + + 'Check if its a number + If IsNumeric(c) Then + + 'Always 3 chars + np = CLng(Mid$(Data, p, 3)) + NewValue = NewValue & ChrW$(np) + p = p + 2 + Else + + 'Add character + NewValue = NewValue & c + End If + End Select + + 'End of sequence + Sequence = False + Else + + 'Check if sequence start + If ca = ESCAPESEQ Then + + 'Start escape sequence + Sequence = True + + 'Check if string ends + ElseIf ca = STRINGOP Then + + 'Add the string to dictionary + LoadStructure.Add Trim$(NewKey), NewValue + + 'End of string + StringData = False + + 'Reset + NewKey = "" + NewValue = "" + + 'Check if newline + ElseIf (ca = WS_LINEFEED) Then + + 'Count the new line + cLastReadLine = cLastReadLine + 1 + + Else + + 'Add to string + NewValue = NewValue & c + End If + End If + + 'Check if assigning + ElseIf Assigning Then + + 'Check for STRINGOP or Numeric character + If (ca = STRINGOP) Then + + 'Begin string data here + StringData = True + + ElseIf (IsNumeric(c) = True) Or (c = "-") Or (c = ".") Or (LCase$(c) = "e") Or (c = "&") Then + + 'Begin numeric data here + NumberData = True + + 'Note that this byte is part of the value + p = p - 1 + + 'Check if newline + ElseIf (ca = WS_LINEFEED) Then + + 'Count the new line + cLastReadLine = cLastReadLine + 1 + + 'Check if assignment ends + ElseIf (ca = TERMINATEOP) Then + + 'End of assign + Assigning = False + + 'Everything else but spaces are not allowed + ElseIf (ca <> WS_SPACE) Then + + 'Invalid assignment + Err.Raise vbObjectError, , "Invalid assignment. Forgot an assignment terminator?" + End If + + 'Anything else + Else 'If (ca <> WS_SPACE) Then + + 'Check for a Key, BEGINOP, ENDOP or ASSIGNOP, COMMENT or whitespace + Select Case ca + Case BEGINOP + + 'Check for spaces in key name + If (InStr(Trim$(NewKey), " ") > 0) Then + + 'Spaces not allowed in key names + Err.Raise vbObjectError, , "Spaces not allowed in key names." + Else + + 'Add structure + LoadStructure.Add Trim$(NewKey), LoadStructure(p, Data) + + 'Reset + NewKey = "" + End If + + Case ENDOP + + 'Leave here + Exit Do + + Case ASSIGNOP + + 'Check for spaces in key name + If (InStr(Trim$(NewKey), Chr$(WS_SPACE)) > 0) Then + + 'Spaces not allowed in key names + Err.Raise vbObjectError, , "Spaces not allowed in key names." + Else + + 'Now assigning + Assigning = True + End If + + Case TERMINATEOP + + 'Add the key to dictionary with 0 value + LoadStructure.Add Trim$(NewKey), CLng(0) + + 'Reset + NewKey = "" + NewValue = "" + + Case WS_LINEFEED + + 'Count the new line + cLastReadLine = cLastReadLine + 1 + + 'Add as space + NewKey = NewKey & Chr$(WS_SPACE) + + 'Check for possible comment + Case AscW(COMMENT), AscW(BEGINCOMMENT) + + 'Check for 2 bytes line comment + If Mid$(Data, p, 2) = COMMENT Then + + 'Find the next linefeed + np = InStr(p, Data, vbLf) + + 'Check if linefeed was found + If np > 0 Then + + 'Count linefeed + cLastReadLine = cLastReadLine + 1 + + 'Skip to next + p = np + Else + + 'No linefeed can be found, end of file! + p = Len(Data) + Exit Do + End If + + 'Check for 2 bytes block comment + ElseIf Mid$(Data, p, 2) = BEGINCOMMENT Then + + 'Find the next endcomment + np = InStr(p, Data, ENDCOMMENT) + + 'Check if endcomment was found + If np > 0 Then + + 'Count the number of linefeeds in comment block + cLastReadLine = cLastReadLine + UBound(Split(Mid$(Data, p, np - p), Chr$(WS_LINEFEED))) + + 'Skip to next + p = np + 1 + Else + + 'No endcomment can be found, end of file! + p = Len(Data) + Exit Do + End If + End If + + 'Add to key name + Case Else: NewKey = NewKey & c + + End Select + End If + Loop +End Function + +Public Sub NewConfiguration() + + 'First line + cLastReadLine = 1 + + 'Create new, empty dictionary + Set Config = New Dictionary +End Sub + +Public Function OutputConfiguration(Optional ByVal NewLine As String = vbCrLf, Optional ByVal Whitespace As Boolean = True) As String + + 'Create configuration as string + OutputConfiguration = OutputDictionary(Config, 0, NewLine, Whitespace) +End Function + +Private Function OutputDictionary(ByRef Dict As Dictionary, ByVal Level As Long, Optional ByVal NewLine = vbCrLf, Optional ByVal Whitespace As Boolean = True) As String + Dim LevelTabs As String + Dim sp As String + Dim Keys As Variant + Dim Data As String + Dim i As Long + + 'Check if this dictionary is not empty + If Dict.Count > 0 Then + + 'Create whitespace + If Whitespace Then + LevelTabs = String$(Level, vbTab) + sp = " " + End If + + 'Get the keys + Keys = Dict.Keys + + 'Go for all keys in dictionary + For i = LBound(Keys) To UBound(Keys) + + 'Check type of value + Select Case VarType(Dict(Keys(i))) + + 'Dictionary Object + Case vbObject + + 'Output empty line + If Whitespace Then Data = Data & LevelTabs & NewLine + + 'Output the key + Data = Data & LevelTabs & Keys(i) & NewLine + + 'Ouput the BEGINOP + Data = Data & LevelTabs & ChrW$(BEGINOP) & NewLine + + 'Output Dictionary + Data = Data & OutputDictionary(Dict(Keys(i)), Level + 1, NewLine, Whitespace) + + 'Output the ENDOP + Data = Data & LevelTabs & ChrW$(ENDOP) & NewLine + + 'Output empty line + If Whitespace Then Data = Data & LevelTabs & NewLine + + 'Integral Number + Case vbInteger, vbLong, vbByte + + 'Output the key = value; + Data = Data & LevelTabs & Keys(i) & sp & ChrW$(ASSIGNOP) & sp & Dict(Keys(i)) & ChrW$(TERMINATEOP) & NewLine + + 'Floating point Number + Case vbSingle, vbDouble, vbCurrency, vbDecimal + + 'Output the key = value; + Data = Data & LevelTabs & Keys(i) & sp & ChrW$(ASSIGNOP) & sp & Format(Dict(Keys(i)), "###############################0.0#####") & "f" & ChrW$(TERMINATEOP) & NewLine + + 'Boolean as Number + Case vbBoolean + + 'Output the key = value; + Data = Data & LevelTabs & Keys(i) & sp & ChrW$(ASSIGNOP) & sp & CLng(Dict(Keys(i))) & ChrW$(TERMINATEOP) & NewLine + + 'Other (String) + Case Else + + 'Output the key = "value"; + Data = Data & LevelTabs & Keys(i) & sp & ChrW$(ASSIGNOP) & sp & ChrW$(STRINGOP) & Escaped(Dict(Keys(i))) & ChrW$(STRINGOP) & ChrW$(TERMINATEOP) & NewLine + + End Select + Next i + End If + + 'Return data + OutputDictionary = Data +End Function + +Public Function ReadSetting(ByRef Setting As String, Optional ByRef Default As Variant, Optional ByVal Reference As Boolean) + + 'Check if setting exists + If Config.Exists(Setting) Then + + 'Check setting type + If VarType(Config(Setting)) = vbObject Then + + 'Check if we should return a reference + If Reference Then + + 'Return a reference + Set ReadSetting = Config(Setting) + Else + + 'Return the setting + Set ReadSetting = DeepCopy(Config(Setting)) + End If + Else + + 'Return the setting + ReadSetting = Config(Setting) + End If + Else + + 'Return the default + If VarType(Default) = vbObject Then Set ReadSetting = Default Else ReadSetting = Default + End If +End Function + +Public Sub RemoveSetting(ByRef Setting As String) + + 'Remove setting if exists + If Config.Exists(Setting) Then Config.Remove Setting +End Sub + +Public Function Root(Optional ByVal Reference As Boolean) As Dictionary + + 'Check if we should return a reference + If Reference Then + + 'Return a reference + Set Root = Config + Else + + 'Return the setting + Set Root = DeepCopy(Config) + End If +End Function + +Public Sub SaveConfiguration(ByRef Filename As String, Optional ByVal NewLine As String = vbCrLf, Optional ByVal Whitespace As Boolean = True) + Dim FB As Integer 'File buffer + Dim Data As String 'Data + + + 'This reads a file and builds a new dictionary object + + + 'Create data + Data = OutputDictionary(Config, 0, NewLine, Whitespace) + + + 'Kill the file if exists + If Dir(Filename) <> "" Then Kill Filename + + 'Open the file to write + FB = FreeFile + Open Filename For Binary As #FB + + 'Write configuration data + Put #FB, 1, Data + + 'Close file + Close #FB +End Sub + +Public Sub WriteSetting(ByRef Setting As String, ByRef Value As Variant, Optional ByVal Reference As Boolean) + Dim DictValue As Dictionary + + 'Check if the setting exists + If Config.Exists(Setting) Then + + 'Check type of value + If VarType(Value) = vbObject Then + + 'Check if we should apply referenced + If Reference Then + + 'Apply setting as reference + Set Config(Setting) = Value + Else + + 'Apply setting + Set DictValue = Value + Set Config(Setting) = DeepCopy(DictValue) + + 'Clean up + Set DictValue = Nothing + End If + Else + + 'Apply setting + Config(Setting) = Value + End If + Else + + 'Add setting + Config.Add Setting, Value + End If +End Sub diff --git a/Resources/Font.cfg b/Resources/Font.cfg index 17bea478..90162ca6 100644 --- a/Resources/Font.cfg +++ b/Resources/Font.cfg @@ -7,9 +7,9 @@ chars { width = 26; height = 42; - u1 = 0.019141f; - v1 = 0.010938f; - u2 = 0.075195f; + u1 = 0.011719f; + v1 = -0.003906f; + u2 = 0.078125f; v2 = 0.195313f; } @@ -18,9 +18,9 @@ chars { width = 26; height = 42; - u1 = 0.089453f; - v1 = 0.010938f; - u2 = 0.145508f; + u1 = 0.082031f; + v1 = -0.003906f; + u2 = 0.148438f; v2 = 0.195313f; } @@ -29,9 +29,9 @@ chars { width = 26; height = 42; - u1 = 0.159766f; - v1 = 0.010938f; - u2 = 0.21582f; + u1 = 0.152344f; + v1 = -0.003906f; + u2 = 0.21875f; v2 = 0.195313f; } @@ -40,9 +40,9 @@ chars { width = 26; height = 42; - u1 = 0.230078f; - v1 = 0.010938f; - u2 = 0.286133f; + u1 = 0.222656f; + v1 = -0.003906f; + u2 = 0.289063f; v2 = 0.195313f; } @@ -51,9 +51,9 @@ chars { width = 24; height = 42; - u1 = 0.300391f; - v1 = 0.010938f; - u2 = 0.352539f; + u1 = 0.292969f; + v1 = -0.003906f; + u2 = 0.355469f; v2 = 0.195313f; } @@ -62,9 +62,9 @@ chars { width = 22; height = 42; - u1 = 0.366797f; - v1 = 0.010938f; - u2 = 0.415039f; + u1 = 0.359375f; + v1 = -0.003906f; + u2 = 0.417969f; v2 = 0.195313f; } @@ -73,9 +73,9 @@ chars { width = 28; height = 42; - u1 = 0.429297f; - v1 = 0.010938f; - u2 = 0.489258f; + u1 = 0.421875f; + v1 = -0.003906f; + u2 = 0.492188f; v2 = 0.195313f; } @@ -84,9 +84,9 @@ chars { width = 28; height = 42; - u1 = 0.503516f; - v1 = 0.010938f; - u2 = 0.563477f; + u1 = 0.496094f; + v1 = -0.003906f; + u2 = 0.566406f; v2 = 0.195313f; } @@ -95,9 +95,9 @@ chars { width = 13; height = 42; - u1 = 0.577734f; - v1 = 0.010938f; - u2 = 0.608398f; + u1 = 0.570313f; + v1 = -0.003906f; + u2 = 0.611328f; v2 = 0.195313f; } @@ -106,9 +106,9 @@ chars { width = 22; height = 42; - u1 = 0.622656f; - v1 = 0.010938f; - u2 = 0.670898f; + u1 = 0.615234f; + v1 = -0.003906f; + u2 = 0.673828f; v2 = 0.195313f; } @@ -117,9 +117,9 @@ chars { width = 28; height = 42; - u1 = 0.685156f; - v1 = 0.010938f; - u2 = 0.745117f; + u1 = 0.677734f; + v1 = -0.003906f; + u2 = 0.748047f; v2 = 0.195313f; } @@ -128,9 +128,9 @@ chars { width = 22; height = 42; - u1 = 0.759375f; - v1 = 0.010938f; - u2 = 0.807617f; + u1 = 0.751953f; + v1 = -0.003906f; + u2 = 0.810547f; v2 = 0.195313f; } @@ -139,9 +139,9 @@ chars { width = 31; height = 42; - u1 = 0.821875f; - v1 = 0.010938f; - u2 = 0.887695f; + u1 = 0.814453f; + v1 = -0.003906f; + u2 = 0.890625f; v2 = 0.195313f; } @@ -150,9 +150,9 @@ chars { width = 28; height = 42; - u1 = 0.901953f; - v1 = 0.010938f; - u2 = 0.961914f; + u1 = 0.894531f; + v1 = -0.003906f; + u2 = 0.964844f; v2 = 0.195313f; } @@ -161,9 +161,9 @@ chars { width = 28; height = 42; - u1 = 0.019141f; - v1 = 0.198438f; - u2 = 0.079102f; + u1 = 0.011719f; + v1 = 0.183594f; + u2 = 0.082031f; v2 = 0.382813f; } @@ -172,9 +172,9 @@ chars { width = 24; height = 42; - u1 = 0.093359f; - v1 = 0.198438f; - u2 = 0.145508f; + u1 = 0.085938f; + v1 = 0.183594f; + u2 = 0.148438f; v2 = 0.382813f; } @@ -183,9 +183,9 @@ chars { width = 28; height = 42; - u1 = 0.159766f; - v1 = 0.198438f; - u2 = 0.219727f; + u1 = 0.152344f; + v1 = 0.183594f; + u2 = 0.222656f; v2 = 0.382813f; } @@ -194,9 +194,9 @@ chars { width = 26; height = 42; - u1 = 0.233984f; - v1 = 0.198438f; - u2 = 0.290039f; + u1 = 0.226563f; + v1 = 0.183594f; + u2 = 0.292969f; v2 = 0.382813f; } @@ -205,9 +205,9 @@ chars { width = 24; height = 42; - u1 = 0.304297f; - v1 = 0.198438f; - u2 = 0.356445f; + u1 = 0.296875f; + v1 = 0.183594f; + u2 = 0.359375f; v2 = 0.382813f; } @@ -216,9 +216,9 @@ chars { width = 24; height = 42; - u1 = 0.370703f; - v1 = 0.198438f; - u2 = 0.422852f; + u1 = 0.363281f; + v1 = 0.183594f; + u2 = 0.425781f; v2 = 0.382813f; } @@ -227,9 +227,9 @@ chars { width = 28; height = 42; - u1 = 0.437109f; - v1 = 0.198438f; - u2 = 0.49707f; + u1 = 0.429688f; + v1 = 0.183594f; + u2 = 0.5f; v2 = 0.382813f; } @@ -238,9 +238,9 @@ chars { width = 26; height = 42; - u1 = 0.511328f; - v1 = 0.198438f; - u2 = 0.567383f; + u1 = 0.503906f; + v1 = 0.183594f; + u2 = 0.570313f; v2 = 0.382813f; } @@ -249,9 +249,9 @@ chars { width = 33; height = 42; - u1 = 0.581641f; - v1 = 0.198438f; - u2 = 0.651367f; + u1 = 0.574219f; + v1 = 0.183594f; + u2 = 0.654297f; v2 = 0.382813f; } @@ -260,9 +260,9 @@ chars { width = 26; height = 42; - u1 = 0.665625f; - v1 = 0.198438f; - u2 = 0.72168f; + u1 = 0.658203f; + v1 = 0.183594f; + u2 = 0.724609f; v2 = 0.382813f; } @@ -271,9 +271,9 @@ chars { width = 26; height = 42; - u1 = 0.735938f; - v1 = 0.198438f; - u2 = 0.791992f; + u1 = 0.728516f; + v1 = 0.183594f; + u2 = 0.794922f; v2 = 0.382813f; } @@ -282,9 +282,9 @@ chars { width = 24; height = 42; - u1 = 0.80625f; - v1 = 0.198438f; - u2 = 0.858398f; + u1 = 0.798828f; + v1 = 0.183594f; + u2 = 0.861328f; v2 = 0.382813f; } @@ -293,9 +293,9 @@ chars { width = 22; height = 42; - u1 = 0.872656f; - v1 = 0.198438f; - u2 = 0.920898f; + u1 = 0.865234f; + v1 = 0.183594f; + u2 = 0.923828f; v2 = 0.382813f; } @@ -304,9 +304,9 @@ chars { width = 22; height = 42; - u1 = 0.935156f; - v1 = 0.198438f; - u2 = 0.983398f; + u1 = 0.927734f; + v1 = 0.183594f; + u2 = 0.986328f; v2 = 0.382813f; } @@ -315,9 +315,9 @@ chars { width = 22; height = 42; - u1 = 0.019141f; - v1 = 0.385938f; - u2 = 0.067383f; + u1 = 0.011719f; + v1 = 0.371094f; + u2 = 0.070313f; v2 = 0.570313f; } @@ -326,9 +326,9 @@ chars { width = 22; height = 42; - u1 = 0.081641f; - v1 = 0.385938f; - u2 = 0.129883f; + u1 = 0.074219f; + v1 = 0.371094f; + u2 = 0.132813f; v2 = 0.570313f; } @@ -337,9 +337,9 @@ chars { width = 22; height = 42; - u1 = 0.144141f; - v1 = 0.385938f; - u2 = 0.192383f; + u1 = 0.136719f; + v1 = 0.371094f; + u2 = 0.195313f; v2 = 0.570313f; } @@ -348,9 +348,9 @@ chars { width = 22; height = 42; - u1 = 0.206641f; - v1 = 0.385938f; - u2 = 0.254883f; + u1 = 0.199219f; + v1 = 0.371094f; + u2 = 0.257813f; v2 = 0.570313f; } @@ -359,9 +359,9 @@ chars { width = 22; height = 42; - u1 = 0.269141f; - v1 = 0.385938f; - u2 = 0.317383f; + u1 = 0.261719f; + v1 = 0.371094f; + u2 = 0.320313f; v2 = 0.570313f; } @@ -370,9 +370,9 @@ chars { width = 22; height = 42; - u1 = 0.331641f; - v1 = 0.385938f; - u2 = 0.379883f; + u1 = 0.324219f; + v1 = 0.371094f; + u2 = 0.382813f; v2 = 0.570313f; } @@ -381,9 +381,9 @@ chars { width = 22; height = 42; - u1 = 0.394141f; - v1 = 0.385938f; - u2 = 0.442383f; + u1 = 0.386719f; + v1 = 0.371094f; + u2 = 0.445313f; v2 = 0.570313f; } @@ -392,9 +392,9 @@ chars { width = 22; height = 42; - u1 = 0.456641f; - v1 = 0.385938f; - u2 = 0.504883f; + u1 = 0.449219f; + v1 = 0.371094f; + u2 = 0.507813f; v2 = 0.570313f; } @@ -403,9 +403,9 @@ chars { width = 12; height = 42; - u1 = 0.519141f; - v1 = 0.385938f; - u2 = 0.547852f; + u1 = 0.511719f; + v1 = 0.371094f; + u2 = 0.550781f; v2 = 0.570313f; } @@ -414,9 +414,9 @@ chars { width = 12; height = 42; - u1 = 0.562109f; - v1 = 0.385938f; - u2 = 0.59082f; + u1 = 0.554688f; + v1 = 0.371094f; + u2 = 0.59375f; v2 = 0.570313f; } @@ -425,9 +425,9 @@ chars { width = 25; height = 42; - u1 = 0.605078f; - v1 = 0.385938f; - u2 = 0.65918f; + u1 = 0.597656f; + v1 = 0.371094f; + u2 = 0.662109f; v2 = 0.570313f; } @@ -436,9 +436,9 @@ chars { width = 22; height = 42; - u1 = 0.673438f; - v1 = 0.385938f; - u2 = 0.72168f; + u1 = 0.666016f; + v1 = 0.371094f; + u2 = 0.724609f; v2 = 0.570313f; } @@ -447,9 +447,9 @@ chars { width = 22; height = 42; - u1 = 0.735938f; - v1 = 0.385938f; - u2 = 0.78418f; + u1 = 0.728516f; + v1 = 0.371094f; + u2 = 0.787109f; v2 = 0.570313f; } @@ -458,9 +458,9 @@ chars { width = 33; height = 42; - u1 = 0.798438f; - v1 = 0.385938f; - u2 = 0.868164f; + u1 = 0.791016f; + v1 = 0.371094f; + u2 = 0.871094f; v2 = 0.570313f; } @@ -469,9 +469,9 @@ chars { width = 22; height = 42; - u1 = 0.882422f; - v1 = 0.385938f; - u2 = 0.930664f; + u1 = 0.875f; + v1 = 0.371094f; + u2 = 0.933594f; v2 = 0.570313f; } @@ -480,9 +480,9 @@ chars { width = 29; height = 42; - u1 = 0.019141f; - v1 = 0.573438f; - u2 = 0.081055f; + u1 = 0.011719f; + v1 = 0.558594f; + u2 = 0.083984f; v2 = 0.757813f; } @@ -491,9 +491,9 @@ chars { width = 19; height = 42; - u1 = 0.095313f; - v1 = 0.573438f; - u2 = 0.137695f; + u1 = 0.087891f; + v1 = 0.558594f; + u2 = 0.140625f; v2 = 0.757813f; } @@ -502,9 +502,9 @@ chars { width = 13; height = 42; - u1 = 0.151953f; - v1 = 0.573438f; - u2 = 0.182617f; + u1 = 0.144531f; + v1 = 0.558594f; + u2 = 0.185547f; v2 = 0.757813f; } @@ -513,9 +513,9 @@ chars { width = 13; height = 42; - u1 = 0.196875f; - v1 = 0.573438f; - u2 = 0.227539f; + u1 = 0.189453f; + v1 = 0.558594f; + u2 = 0.230469f; v2 = 0.757813f; } @@ -524,9 +524,9 @@ chars { width = 17; height = 42; - u1 = 0.241797f; - v1 = 0.573438f; - u2 = 0.280273f; + u1 = 0.234375f; + v1 = 0.558594f; + u2 = 0.283203f; v2 = 0.757813f; } @@ -535,9 +535,9 @@ chars { width = 22; height = 42; - u1 = 0.294531f; - v1 = 0.573438f; - u2 = 0.342773f; + u1 = 0.287109f; + v1 = 0.558594f; + u2 = 0.345703f; v2 = 0.757813f; } @@ -546,9 +546,9 @@ chars { width = 22; height = 42; - u1 = 0.357031f; - v1 = 0.573438f; - u2 = 0.405273f; + u1 = 0.349609f; + v1 = 0.558594f; + u2 = 0.408203f; v2 = 0.757813f; } @@ -557,9 +557,9 @@ chars { width = 12; height = 42; - u1 = 0.419531f; - v1 = 0.573438f; - u2 = 0.448242f; + u1 = 0.412109f; + v1 = 0.558594f; + u2 = 0.451172f; v2 = 0.757813f; } @@ -568,9 +568,9 @@ chars { width = 13; height = 42; - u1 = 0.4625f; - v1 = 0.573438f; - u2 = 0.493164f; + u1 = 0.455078f; + v1 = 0.558594f; + u2 = 0.496094f; v2 = 0.757813f; } @@ -579,9 +579,9 @@ chars { width = 13; height = 42; - u1 = 0.507422f; - v1 = 0.573438f; - u2 = 0.538086f; + u1 = 0.5f; + v1 = 0.558594f; + u2 = 0.541016f; v2 = 0.757813f; } @@ -590,9 +590,9 @@ chars { width = 12; height = 42; - u1 = 0.552344f; - v1 = 0.573438f; - u2 = 0.581055f; + u1 = 0.544922f; + v1 = 0.558594f; + u2 = 0.583984f; v2 = 0.757813f; } @@ -601,9 +601,9 @@ chars { width = 12; height = 42; - u1 = 0.595313f; - v1 = 0.573438f; - u2 = 0.624023f; + u1 = 0.587891f; + v1 = 0.558594f; + u2 = 0.626953f; v2 = 0.757813f; } @@ -612,9 +612,9 @@ chars { width = 10; height = 42; - u1 = 0.638281f; - v1 = 0.573438f; - u2 = 0.663086f; + u1 = 0.630859f; + v1 = 0.558594f; + u2 = 0.666016f; v2 = 0.757813f; } @@ -623,9 +623,9 @@ chars { width = 17; height = 42; - u1 = 0.677344f; - v1 = 0.573438f; - u2 = 0.71582f; + u1 = 0.669922f; + v1 = 0.558594f; + u2 = 0.71875f; v2 = 0.757813f; } @@ -634,9 +634,9 @@ chars { width = 12; height = 42; - u1 = 0.730078f; - v1 = 0.573438f; - u2 = 0.758789f; + u1 = 0.722656f; + v1 = 0.558594f; + u2 = 0.761719f; v2 = 0.757813f; } @@ -645,9 +645,9 @@ chars { width = 12; height = 42; - u1 = 0.773047f; - v1 = 0.573438f; - u2 = 0.801758f; + u1 = 0.765625f; + v1 = 0.558594f; + u2 = 0.804688f; v2 = 0.757813f; } @@ -656,9 +656,9 @@ chars { width = 22; height = 42; - u1 = 0.816016f; - v1 = 0.573438f; - u2 = 0.864258f; + u1 = 0.808594f; + v1 = 0.558594f; + u2 = 0.867188f; v2 = 0.757813f; } @@ -667,9 +667,9 @@ chars { width = 22; height = 42; - u1 = 0.878516f; - v1 = 0.573438f; - u2 = 0.926758f; + u1 = 0.871094f; + v1 = 0.558594f; + u2 = 0.929688f; v2 = 0.757813f; } @@ -678,9 +678,9 @@ chars { width = 10; height = 42; - u1 = 0.941016f; - v1 = 0.573438f; - u2 = 0.96582f; + u1 = 0.933594f; + v1 = 0.558594f; + u2 = 0.96875f; v2 = 0.757813f; } @@ -689,9 +689,9 @@ chars { width = 21; height = 42; - u1 = 0.019141f; - v1 = 0.760938f; - u2 = 0.06543f; + u1 = 0.011719f; + v1 = 0.746094f; + u2 = 0.068359f; v2 = 0.945313f; } @@ -700,9 +700,9 @@ chars { width = 10; height = 42; - u1 = 0.079688f; - v1 = 0.760938f; - u2 = 0.104492f; + u1 = 0.072266f; + v1 = 0.746094f; + u2 = 0.107422f; v2 = 0.945313f; } diff --git a/Resources/Font.cpt b/Resources/Font.cpt index 362d27bf07d877199ae87bb70635469177ccfb26..a9764dc358030f0a2cda988cf7fd3d0346769705 100644 GIT binary patch literal 280332 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
+F&v>v=WzR{&PpIfaDEZWx^idvv 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 delta 29582 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 S0b3>FNN1DzZ1Mup#r_2(ygxSp diff --git a/Resources/Font.png b/Resources/Font.png index fcf1531ea6f0d1d2a1ef9ccad8fc9b89b2e6d184..54cf04080c17cb4885261fe32ac23ed2f68d0fa3 100644 GIT binary patch literal 23772 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 diff --git a/Source/Builder.csproj b/Source/Builder.csproj index 20f69c87..3ecfab0f 100644 --- a/Source/Builder.csproj +++ b/Source/Builder.csproj @@ -324,6 +324,7 @@ Resources.resx + @@ -336,6 +337,9 @@ + + + @@ -517,5 +521,6 @@ + \ No newline at end of file diff --git a/Source/BuilderModes/ClassicModes/DragGeometryMode.cs b/Source/BuilderModes/ClassicModes/DragGeometryMode.cs index 4dfc3690..48679eed 100644 --- a/Source/BuilderModes/ClassicModes/DragGeometryMode.cs +++ b/Source/BuilderModes/ClassicModes/DragGeometryMode.cs @@ -69,6 +69,9 @@ namespace CodeImp.DoomBuilder.BuilderModes.Editing // List of unselected lines protected ICollection snaptolines; + // Text labels for all unstable lines + protected TextLabel[] labels; + // Keep track of view changes private float lastoffsetx; private float lastoffsety; @@ -96,7 +99,9 @@ namespace CodeImp.DoomBuilder.BuilderModes.Editing if(!isdisposed) { // Clean up - + if(labels != null) + foreach(TextLabel l in labels) l.Dispose(); + // Done base.Dispose(); } @@ -145,9 +150,27 @@ namespace CodeImp.DoomBuilder.BuilderModes.Editing // These will have their length displayed during the drag unstablelines = MapSet.UnstableLinedefsFromVertices(selectedverts); + // Make text labels + labels = new TextLabel[unstablelines.Count]; + int index = 0; + foreach(Linedef l in unstablelines) + { + Vector2D center = l.GetCenterPoint(); + labels[index] = new TextLabel(12); + labels[index].Rectangle = new RectangleF(center.x, center.y, 0f, 0f); + labels[index].AlignX = TextAlignmentX.Center; + labels[index].AlignY = TextAlignmentY.Middle; + labels[index].Color = General.Colors.Highlight; + labels[index].Backcolor = General.Colors.Background; + labels[index].Scale = 14f; + labels[index].TransformCoords = true; + labels[index].Text = l.Length.ToString("0"); + index++; + } + Cursor.Current = Cursors.Default; } - + // This moves the selected geometry relatively // Returns true when geometry has actually moved private bool MoveGeometryRelative(Vector2D offset, bool snapgrid, bool snapnearest) @@ -245,6 +268,17 @@ namespace CodeImp.DoomBuilder.BuilderModes.Editing i++; } + // Update labels + int index = 0; + foreach(Linedef l in unstablelines) + { + l.UpdateCache(); + Vector2D center = l.GetCenterPoint(); + labels[index].Rectangle = new RectangleF(center.x, center.y, 0f, 0f); + labels[index].Text = l.Length.ToString("0"); + index++; + } + // Moved return true; } diff --git a/Source/BuilderModes/ClassicModes/DragLinedefsMode.cs b/Source/BuilderModes/ClassicModes/DragLinedefsMode.cs index 11d3e7f5..9fce8d24 100644 --- a/Source/BuilderModes/ClassicModes/DragLinedefsMode.cs +++ b/Source/BuilderModes/ClassicModes/DragLinedefsMode.cs @@ -160,6 +160,16 @@ namespace CodeImp.DoomBuilder.BuilderModes.Editing renderer.Finish(); } } + + // Redraw overlay + if(renderer.StartOverlay(true)) + { + foreach(TextLabel l in labels) + { + renderer.RenderText(l); + } + renderer.Finish(); + } renderer.Present(); } diff --git a/Source/BuilderModes/ClassicModes/DragSectorsMode.cs b/Source/BuilderModes/ClassicModes/DragSectorsMode.cs index 1bb90f9a..be502df0 100644 --- a/Source/BuilderModes/ClassicModes/DragSectorsMode.cs +++ b/Source/BuilderModes/ClassicModes/DragSectorsMode.cs @@ -166,6 +166,16 @@ namespace CodeImp.DoomBuilder.BuilderModes.Editing } } + // Redraw overlay + if(renderer.StartOverlay(true)) + { + foreach(TextLabel l in labels) + { + renderer.RenderText(l); + } + renderer.Finish(); + } + renderer.Present(); } diff --git a/Source/BuilderModes/ClassicModes/DragVerticesMode.cs b/Source/BuilderModes/ClassicModes/DragVerticesMode.cs index 7de671dc..a46e6f3c 100644 --- a/Source/BuilderModes/ClassicModes/DragVerticesMode.cs +++ b/Source/BuilderModes/ClassicModes/DragVerticesMode.cs @@ -143,20 +143,16 @@ namespace CodeImp.DoomBuilder.BuilderModes.Editing } } + // Redraw overlay if(renderer.StartOverlay(true)) { - foreach(Linedef l in unstablelines) + foreach(TextLabel l in labels) { - Vector2D delta = l.End.Position - l.Start.Position; - Vector2D textpos = l.Start.Position + (delta * 0.5f); - int length = (int)Math.Round(l.Length); - renderer.RenderTextCentered(length.ToString(), textpos, General.Colors.Highlight, true); + renderer.RenderText(l); } - renderer.Finish(); } - renderer.Present(); } diff --git a/Source/IO/DoomMapSetIO.cs b/Source/IO/DoomMapSetIO.cs index 9f52b040..60f5124e 100644 --- a/Source/IO/DoomMapSetIO.cs +++ b/Source/IO/DoomMapSetIO.cs @@ -48,6 +48,7 @@ namespace CodeImp.DoomBuilder.IO public override int MaxSidedefs { get { return 65534; } } public override int VertexDecimals { get { return 0; } } + public override string DecimalsFormat { get { return "0"; } } #endregion diff --git a/Source/IO/HexenMapSetIO.cs b/Source/IO/HexenMapSetIO.cs index e61e5b52..b1d1190c 100644 --- a/Source/IO/HexenMapSetIO.cs +++ b/Source/IO/HexenMapSetIO.cs @@ -48,6 +48,7 @@ namespace CodeImp.DoomBuilder.IO public override int MaxSidedefs { get { return 65534; } } public override int VertexDecimals { get { return 0; } } + public override string DecimalsFormat { get { return "0"; } } #endregion diff --git a/Source/IO/IMapSetIO.cs b/Source/IO/IMapSetIO.cs index 4fd76db8..b8da16c7 100644 --- a/Source/IO/IMapSetIO.cs +++ b/Source/IO/IMapSetIO.cs @@ -34,5 +34,6 @@ namespace CodeImp.DoomBuilder.IO { int MaxSidedefs { get; } int VertexDecimals { get; } + string DecimalsFormat { get; } } } diff --git a/Source/IO/MapSetIO.cs b/Source/IO/MapSetIO.cs index 789516ce..d237898f 100644 --- a/Source/IO/MapSetIO.cs +++ b/Source/IO/MapSetIO.cs @@ -50,6 +50,7 @@ namespace CodeImp.DoomBuilder.IO public abstract int MaxSidedefs { get; } public abstract int VertexDecimals { get; } + public abstract string DecimalsFormat { get; } #endregion diff --git a/Source/IO/UniversalMapSetIO.cs b/Source/IO/UniversalMapSetIO.cs index 7aec3a99..3247859c 100644 --- a/Source/IO/UniversalMapSetIO.cs +++ b/Source/IO/UniversalMapSetIO.cs @@ -49,6 +49,7 @@ namespace CodeImp.DoomBuilder.IO public override int MaxSidedefs { get { return int.MaxValue; } } public override int VertexDecimals { get { return 3; } } + public override string DecimalsFormat { get { return "0.000"; } } #endregion diff --git a/Source/Interface/PreferencesForm.Designer.cs b/Source/Interface/PreferencesForm.Designer.cs index 488ddd94..e0e0ce40 100644 --- a/Source/Interface/PreferencesForm.Designer.cs +++ b/Source/Interface/PreferencesForm.Designer.cs @@ -33,6 +33,7 @@ namespace CodeImp.DoomBuilder.Interface System.Windows.Forms.Label label5; System.Windows.Forms.GroupBox groupBox1; System.Windows.Forms.Label label1; + this.squarethings = new System.Windows.Forms.CheckBox(); this.qualitydisplay = new System.Windows.Forms.CheckBox(); this.imagebrightnesslabel = new System.Windows.Forms.Label(); this.imagebrightness = new System.Windows.Forms.TrackBar(); @@ -75,7 +76,6 @@ namespace CodeImp.DoomBuilder.Interface this.colorselection3d = new CodeImp.DoomBuilder.Interface.ColorControl(); this.colorhighlight3d = new CodeImp.DoomBuilder.Interface.ColorControl(); this.colorcrosshair3d = new CodeImp.DoomBuilder.Interface.ColorControl(); - this.squarethings = new System.Windows.Forms.CheckBox(); label7 = new System.Windows.Forms.Label(); label6 = new System.Windows.Forms.Label(); label5 = new System.Windows.Forms.Label(); @@ -134,6 +134,16 @@ namespace CodeImp.DoomBuilder.Interface groupBox1.TabStop = false; groupBox1.Text = " Graphics "; // + // squarethings + // + this.squarethings.AutoSize = true; + this.squarethings.Location = new System.Drawing.Point(25, 150); + this.squarethings.Name = "squarethings"; + this.squarethings.Size = new System.Drawing.Size(93, 18); + this.squarethings.TabIndex = 11; + this.squarethings.Text = "Square things"; + this.squarethings.UseVisualStyleBackColor = true; + // // qualitydisplay // this.qualitydisplay.AutoSize = true; @@ -433,6 +443,7 @@ namespace CodeImp.DoomBuilder.Interface // this.actioncontrol.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.actioncontrol.FormattingEnabled = true; + this.actioncontrol.ImeMode = System.Windows.Forms.ImeMode.Off; this.actioncontrol.Location = new System.Drawing.Point(23, 204); this.actioncontrol.Name = "actioncontrol"; this.actioncontrol.Size = new System.Drawing.Size(197, 22); @@ -656,16 +667,6 @@ namespace CodeImp.DoomBuilder.Interface this.colorcrosshair3d.Size = new System.Drawing.Size(150, 23); this.colorcrosshair3d.TabIndex = 6; // - // squarethings - // - this.squarethings.AutoSize = true; - this.squarethings.Location = new System.Drawing.Point(25, 150); - this.squarethings.Name = "squarethings"; - this.squarethings.Size = new System.Drawing.Size(93, 18); - this.squarethings.TabIndex = 11; - this.squarethings.Text = "Square things"; - this.squarethings.UseVisualStyleBackColor = true; - // // PreferencesForm // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; diff --git a/Source/Map/Linedef.cs b/Source/Map/Linedef.cs index 2ffb014f..57c30d7e 100644 --- a/Source/Map/Linedef.cs +++ b/Source/Map/Linedef.cs @@ -354,6 +354,12 @@ namespace CodeImp.DoomBuilder.Map return p; } + + // This returns a point in the middle of the line + public Vector2D GetCenterPoint() + { + return start.Position + (end.Position - start.Position) * 0.5f; + } // This applies single/double sided flags public void ApplySidedFlags() diff --git a/Source/Rendering/D3DDevice.cs b/Source/Rendering/D3DDevice.cs index 046092ca..11bff796 100644 --- a/Source/Rendering/D3DDevice.cs +++ b/Source/Rendering/D3DDevice.cs @@ -30,6 +30,9 @@ using System.ComponentModel; using CodeImp.DoomBuilder.Geometry; using SlimDX; using CodeImp.DoomBuilder.Interface; +using CodeImp.DoomBuilder.Data; + +using Configuration = CodeImp.DoomBuilder.IO.Configuration; #endregion @@ -58,6 +61,8 @@ namespace CodeImp.DoomBuilder.Rendering private ShaderManager shaders; private Surface backbuffer; private Surface depthbuffer; + private TextFont font; + private ResourceImage fonttexture; // Disposing private bool isdisposed = false; @@ -73,6 +78,8 @@ namespace CodeImp.DoomBuilder.Rendering internal ShaderManager Shaders { get { return shaders; } } internal Surface BackBuffer { get { return backbuffer; } } internal Surface DepthBuffer { get { return depthbuffer; } } + internal TextFont Font { get { return font; } } + internal Texture FontTexture { get { return fonttexture.Texture; } } #endregion @@ -104,6 +111,8 @@ namespace CodeImp.DoomBuilder.Rendering if(backbuffer != null) backbuffer.Dispose(); if(depthbuffer != null) depthbuffer.Dispose(); device.Dispose(); + if(font != null) font.Dispose(); + if(fonttexture != null) fonttexture.Dispose(); // Done isdisposed = true; @@ -253,6 +262,12 @@ namespace CodeImp.DoomBuilder.Rendering // Create shader manager shaders = new ShaderManager(this); + // Font + font = new TextFont(); + fonttexture = new ResourceImage("Font.png"); + fonttexture.LoadImage(); + fonttexture.CreateTexture(); + // Initialize settings SetupSettings(); diff --git a/Source/Rendering/IRenderer2D.cs b/Source/Rendering/IRenderer2D.cs index f68c93c6..44480168 100644 --- a/Source/Rendering/IRenderer2D.cs +++ b/Source/Rendering/IRenderer2D.cs @@ -73,7 +73,6 @@ namespace CodeImp.DoomBuilder.Rendering void RenderRectangle(RectangleF rect, float bordersize, PixelColor c, bool transformrect); void RenderRectangleFilled(RectangleF rect, PixelColor c, bool transformrect); void RenderLine(Vector2D start, Vector2D end, float thickness, PixelColor c, bool transformcoords); - void RenderText(string text, Vector2D pos, PixelColor c, bool transformpos); - void RenderTextCentered(string text, Vector2D pos, PixelColor c, bool transformpos); + void RenderText(TextLabel text); } } diff --git a/Source/Rendering/Renderer2D.cs b/Source/Rendering/Renderer2D.cs index 1ab864ee..a850d24c 100644 --- a/Source/Rendering/Renderer2D.cs +++ b/Source/Rendering/Renderer2D.cs @@ -138,6 +138,8 @@ namespace CodeImp.DoomBuilder.Rendering public float OffsetX { get { return offsetx; } } public float OffsetY { get { return offsety; } } + public float TranslateX { get { return translatex; } } + public float TranslateY { get { return translatey; } } public float Scale { get { return scale; } } public int VertexSize { get { return vertexsize; } } @@ -1050,39 +1052,31 @@ namespace CodeImp.DoomBuilder.Rendering #region ================== Overlay // This renders text - public void RenderText(string text, Vector2D pos, PixelColor c, bool transformpos) + public void RenderText(TextLabel text) { - // Calculate coordinates - if(transformpos) pos = pos.GetTransformed(translatex, translatey, scale, -scale); - Rectangle posr = new Rectangle((int)pos.x, (int)pos.y, 0, 0); + // Update the text if needed + text.Update(translatex, translatey, scale, -scale); - // Set renderstates for rendering - graphics.Device.SetRenderState(RenderState.CullMode, Cull.None); - graphics.Device.SetRenderState(RenderState.ZEnable, false); - graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, false); - graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false); - graphics.Device.SetRenderState(RenderState.TextureFactor, -1); - - // Draw - if(font != null) font.DrawString(null, text, posr, DrawTextFormat.VCenter | DrawTextFormat.Left | DrawTextFormat.NoClip, c.ToColorValue()); - } + // Text is created? + if(text.VertexBuffer != null) + { + // Set renderstates for rendering + graphics.Device.SetRenderState(RenderState.CullMode, Cull.None); + graphics.Device.SetRenderState(RenderState.ZEnable, false); + graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true); + graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false); + graphics.Device.SetRenderState(RenderState.TextureFactor, -1); + graphics.Shaders.Texture2D.Texture1 = graphics.FontTexture; + graphics.Device.SetTexture(0, graphics.FontTexture); + graphics.Device.SetStreamSource(0, text.VertexBuffer, 0, FlatVertex.Stride); - // This renders text - public void RenderTextCentered(string text, Vector2D pos, PixelColor c, bool transformpos) - { - // Calculate coordinates - if(transformpos) pos = pos.GetTransformed(translatex, translatey, scale, -scale); - Rectangle posr = new Rectangle((int)pos.x, (int)pos.y, 0, 0); - - // Set renderstates for rendering - graphics.Device.SetRenderState(RenderState.CullMode, Cull.None); - graphics.Device.SetRenderState(RenderState.ZEnable, false); - graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, false); - graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false); - graphics.Device.SetRenderState(RenderState.TextureFactor, -1); - - // Draw - if(font != null) font.DrawString(null, text, posr, DrawTextFormat.VCenter | DrawTextFormat.Center | DrawTextFormat.NoClip, c.ToColorValue()); + // Draw + graphics.Shaders.Texture2D.Begin(); + graphics.Shaders.Texture2D.BeginPass(0); + graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, 0, text.NumFaces); + graphics.Shaders.Texture2D.EndPass(); + graphics.Shaders.Texture2D.End(); + } } // This renders a rectangle with given border size and color diff --git a/Source/Rendering/ShaderManager.cs b/Source/Rendering/ShaderManager.cs index 18058833..129a0722 100644 --- a/Source/Rendering/ShaderManager.cs +++ b/Source/Rendering/ShaderManager.cs @@ -53,6 +53,7 @@ namespace CodeImp.DoomBuilder.Rendering private Things2DShader things2dshader; private World3DShader world3dshader; private Color2DShader color2dshader; + private Texture2DShader texture2dshader; // Device private D3DDevice device; @@ -70,6 +71,7 @@ namespace CodeImp.DoomBuilder.Rendering public Things2DShader Things2D { get { return things2dshader; } } public World3DShader World3D { get { return world3dshader; } } public Color2DShader Color2D { get { return color2dshader; } } + public Texture2DShader Texture2D { get { return texture2dshader; } } public bool IsDisposed { get { return isdisposed; } } #endregion @@ -121,6 +123,7 @@ namespace CodeImp.DoomBuilder.Rendering things2dshader.Dispose(); world3dshader.Dispose(); color2dshader.Dispose(); + texture2dshader.Dispose(); } // Load resources @@ -138,6 +141,7 @@ namespace CodeImp.DoomBuilder.Rendering things2dshader = new Things2DShader(this); world3dshader = new World3DShader(this); color2dshader = new Color2DShader(this); + texture2dshader = new Texture2DShader(this); } #endregion diff --git a/Source/Rendering/TextAlignment.cs b/Source/Rendering/TextAlignment.cs new file mode 100644 index 00000000..1a7d438e --- /dev/null +++ b/Source/Rendering/TextAlignment.cs @@ -0,0 +1,56 @@ + +#region ================== Copyright (c) 2007 Pascal vd Heiden + +/* + * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com + * This program is released under GNU General Public License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#endregion + +#region ================== Namespaces + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Windows.Forms; +using System.IO; +using System.Reflection; +using System.Drawing; +using System.ComponentModel; +using CodeImp.DoomBuilder.Map; +using SlimDX.Direct3D9; +using SlimDX; +using CodeImp.DoomBuilder.Geometry; +using System.Drawing.Imaging; +using CodeImp.DoomBuilder.Data; +using CodeImp.DoomBuilder.Editing; + +#endregion + +namespace CodeImp.DoomBuilder.Rendering +{ + // This enumeration defines horizontal alignment + public enum TextAlignmentX : int + { + Left = 0, + Center = 1, + Right = 2 + } + + // This enumeration defines vertical alignment + public enum TextAlignmentY : int + { + Top = 0, + Middle = 1, + Bottom = 2 + } +} diff --git a/Source/Rendering/TextFont.cs b/Source/Rendering/TextFont.cs new file mode 100644 index 00000000..d0ed192f --- /dev/null +++ b/Source/Rendering/TextFont.cs @@ -0,0 +1,272 @@ + +#region ================== Copyright (c) 2007 Pascal vd Heiden + +/* + * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com + * This program is released under GNU General Public License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#endregion + +#region ================== Namespaces + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Windows.Forms; +using System.IO; +using System.Reflection; +using System.Drawing; +using System.ComponentModel; +using CodeImp.DoomBuilder.Map; +using SlimDX.Direct3D9; +using SlimDX; +using CodeImp.DoomBuilder.Geometry; +using System.Drawing.Imaging; +using CodeImp.DoomBuilder.Data; +using CodeImp.DoomBuilder.Editing; + +using Configuration = CodeImp.DoomBuilder.IO.Configuration; + +#endregion + +namespace CodeImp.DoomBuilder.Rendering +{ + internal class TextFont : IDisposable + { + #region ================== Structures + + // This structure defines character properties + private struct FontCharacter + { + // Variables + public float width; + public float height; + public float u1; + public float v1; + public float u2; + public float v2; + } + + #endregion + + #region ================== Constants + + // Font resource name + private const string FONT_RESOURCE = "Font.cfg"; + + // Spacing adjustments + private const float ADJUST_SPACING = -0.08f; + + #endregion + + #region ================== Variables + + // Characters + private FontCharacter[] characters; + + // Disposing + private bool isdisposed = false; + + #endregion + + #region ================== Properties + + public bool IsDisposed { get { return isdisposed; } } + + #endregion + + #region ================== Constructor / Disposer + + // Constructor + internal TextFont() + { + Configuration cfg; + Stream fontdata; + StreamReader fontreader; + string[] resnames; + + // Initialize + characters = new FontCharacter[256]; + + // Make chars configuration + cfg = new Configuration(); + + // Find a resource named Font.cfg + resnames = General.ThisAssembly.GetManifestResourceNames(); + foreach(string rn in resnames) + { + // Found it? + if(rn.EndsWith(FONT_RESOURCE, StringComparison.InvariantCultureIgnoreCase)) + { + // Get a stream from the resource + fontdata = General.ThisAssembly.GetManifestResourceStream(rn); + fontreader = new StreamReader(fontdata, Encoding.ASCII); + + // Load configuration from stream + cfg.InputConfiguration(fontreader.ReadToEnd()); + + // Done + fontreader.Dispose(); + fontdata.Dispose(); + break; + } + } + + // Get the charset from configuration + IDictionary cfgchars = cfg.ReadSetting("chars", new Hashtable()); + + // Go for all defined chars + foreach(DictionaryEntry item in cfgchars) + { + // Get the character Hashtable + IDictionary chr = (IDictionary)item.Value; + int i = Convert.ToInt32(item.Key); + + // This is ancient code of mine. + // The charater sizes were based on 800x600 resolution. + characters[i].width = (float)(int)chr["width"] / 40f; + characters[i].height = (float)(int)chr["height"] / 30f; + characters[i].u1 = (float)chr["u1"]; + characters[i].v1 = (float)chr["v1"]; + characters[i].u2 = (float)chr["u2"]; + characters[i].v2 = (float)chr["v2"]; + } + + // We have no destructor + GC.SuppressFinalize(this); + } + + // Diposer + public void Dispose() + { + // Not already disposed? + if(!isdisposed) + { + // Done + isdisposed = true; + } + } + + #endregion + + #region ================== Methods + + // This sets up vertices for a specific character + // also advances vertsoffset and textx + public void SetupVertices(DataStream stream, byte c, float scale, int color, + ref float textx, float texty, float textheight, float offsetv) + { + FlatVertex vert = new FlatVertex(); + FontCharacter cinfo; + float cwidth; + + // Get the character information + cinfo = characters[c]; + cwidth = cinfo.width * scale; + + // Create lefttop vertex + vert.c = color; + vert.u = cinfo.u1; + vert.v = cinfo.v1 * 0.5f + offsetv; + vert.x = textx; + vert.y = texty; + vert.w = 1f; + stream.Write(vert); + + // Create leftbottom vertex + vert.c = color; + vert.u = cinfo.u1; + vert.v = cinfo.v2 * 0.5f + offsetv; + vert.x = textx; + vert.y = texty + textheight; + vert.w = 1f; + stream.Write(vert); + + // Create righttop vertex + vert.c = color; + vert.u = cinfo.u2; + vert.v = cinfo.v1 * 0.5f + offsetv; + vert.x = textx + cwidth; + vert.y = texty; + vert.w = 1f; + stream.Write(vert); + + // Create leftbottom vertex + vert.c = color; + vert.u = cinfo.u1; + vert.v = cinfo.v2 * 0.5f + offsetv; + vert.x = textx; + vert.y = texty + textheight; + vert.w = 1f; + stream.Write(vert); + + // Create righttop vertex + vert.c = color; + vert.u = cinfo.u2; + vert.v = cinfo.v1 * 0.5f + offsetv; + vert.x = textx + cwidth; + vert.y = texty; + vert.w = 1f; + stream.Write(vert); + + // Create rightbottom vertex + vert.c = color; + vert.u = cinfo.u2; + vert.v = cinfo.v2 * 0.5f + offsetv; + vert.x = textx + cwidth; + vert.y = texty + textheight; + vert.w = 1f; + stream.Write(vert); + + textx += (cwidth + (ADJUST_SPACING * scale)); + } + + // This checks if the given character exists in the charset + public bool Contains(char c) + { + // Convert character to ASCII + byte[] keybyte = Encoding.ASCII.GetBytes(c.ToString()); + return Contains(keybyte[0]); + } + + // This checks if the given character exists in the charset + public bool Contains(byte b) + { + // Check if the character has been set + return ((characters[b].width > 0.000000001f) || + (characters[b].height > 0.000000001f)); + } + + // This calculates the size of a text string at a given scale + public SizeF GetTextSize(string text, float scale) + { + // Size items + float sizex = 0, sizey = 0; + + // Get the ASCII bytes for the text + byte[] btext = Encoding.ASCII.GetBytes(text); + + // Go for all chars in text to calculate final text size + foreach(byte b in btext) + { + // Add to the final size + sizex += characters[b].width * scale; + sizey = characters[b].height * scale; + } + + // Return size + return new SizeF(sizex, sizey); + } + + #endregion + } +} diff --git a/Source/Rendering/TextLabel.cs b/Source/Rendering/TextLabel.cs new file mode 100644 index 00000000..a180a6d7 --- /dev/null +++ b/Source/Rendering/TextLabel.cs @@ -0,0 +1,283 @@ + +#region ================== Copyright (c) 2007 Pascal vd Heiden + +/* + * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com + * This program is released under GNU General Public License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#endregion + +#region ================== Namespaces + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Windows.Forms; +using System.IO; +using System.Reflection; +using System.Drawing; +using System.ComponentModel; +using CodeImp.DoomBuilder.Map; +using SlimDX.Direct3D9; +using SlimDX; +using CodeImp.DoomBuilder.Geometry; +using System.Drawing.Imaging; +using CodeImp.DoomBuilder.Data; +using CodeImp.DoomBuilder.Editing; + +#endregion + +namespace CodeImp.DoomBuilder.Rendering +{ + public class TextLabel : IDisposable, ID3DResource + { + #region ================== Constants + + #endregion + + #region ================== Variables + + // The text is stored as a polygon in a vertex buffer + private VertexBuffer textbuffer; + private int numfaces; + private int capacity; + + // Text settings + private string text; + private RectangleF rect; + private bool transformcoords; + private PixelColor color; + private PixelColor backcolor; + private float scale; + private TextAlignmentX alignx; + private TextAlignmentY aligny; + private SizeF size; + + // This keeps track if changes were made + private bool updateneeded; + private float lasttranslatex = float.MinValue; + private float lasttranslatey; + private float lastscalex; + private float lastscaley; + + // Disposing + private bool isdisposed = false; + + #endregion + + #region ================== Properties + + // Properties + public RectangleF Rectangle { get { return rect; } set { rect = value; updateneeded = true; } } + public float Left { get { return rect.X; } set { rect.X = value; updateneeded = true; } } + public float Top { get { return rect.Y; } set { rect.Y = value; updateneeded = true; } } + public float Width { get { return rect.Width; } set { rect.Width = value; updateneeded = true; } } + public float Height { get { return rect.Height; } set { rect.Height = value; updateneeded = true; } } + public float Right { get { return rect.Right; } set { rect.Width = value - rect.X + 1f; updateneeded = true; } } + public float Bottom { get { return rect.Bottom; } set { rect.Height = value - rect.Y + 1f; updateneeded = true; } } + public string Text { get { return text; } set { if(text != value) { text = value; updateneeded = true; } } } + public bool TransformCoords { get { return transformcoords; } set { transformcoords = value; updateneeded = true; } } + public SizeF TextSize { get { return size; } } + public float Scale { get { return scale; } set { scale = value; updateneeded = true; } } + public TextAlignmentX AlignX { get { return alignx; } set { alignx = value; updateneeded = true; } } + public TextAlignmentY AlignY { get { return aligny; } set { aligny = value; updateneeded = true; } } + public PixelColor Color { get { return color; } set { color = value; updateneeded = true; } } + public PixelColor Backcolor { get { return backcolor; } set { backcolor = value; updateneeded = true; } } + internal VertexBuffer VertexBuffer { get { return textbuffer; } } + internal int NumFaces { get { return numfaces; } } + + // Disposing + public bool IsDisposed { get { return isdisposed; } } + + #endregion + + #region ================== Constructor / Disposer + + // Constructor + public TextLabel(int capacity) + { + // Initialize + this.text = ""; + this.rect = new RectangleF(0f, 0f, 1f, 1f); + this.color = new PixelColor(255, 255, 255, 255); + this.backcolor = new PixelColor(0, 0, 0, 0); + this.scale = 10f; + this.alignx = TextAlignmentX.Left; + this.aligny = TextAlignmentY.Top; + this.size = new SizeF(0f, 0f); + this.updateneeded = true; + this.numfaces = 0; + this.capacity = capacity; + + // Register as resource + General.Map.Graphics.RegisterResource(this); + + // We have no destructor + GC.SuppressFinalize(this); + } + + // Diposer + public void Dispose() + { + // Not already disposed? + if(!isdisposed) + { + // Clean up + UnloadResource(); + + // Unregister resource + General.Map.Graphics.UnregisterResource(this); + + // Done + isdisposed = true; + } + } + + #endregion + + #region ================== Methods + + // This updates the text if needed + internal void Update(float translatex, float translatey, float scalex, float scaley) + { + FlatVertex[] verts; + RectangleF absview; + float beginx = 0; + float beginy = 0; + bool colorcode = false; + int characters = 0; + byte[] textbytes; + DataStream stream; + + // Check if transformation changed and needs to be updated + if(transformcoords) + { + if((translatex != lasttranslatex) || + (translatey != lasttranslatey) || + (scalex != lastscalex) || + (scaley != lastscaley)) updateneeded = true; + } + + // Update if needed + if(updateneeded) + { + // Only build when there are any vertices + if(text.Length > 0) + { + // Do we have to make a new buffer? + if((textbuffer == null) || (text.Length > capacity)) + { + // Dispose previous + if(textbuffer != null) textbuffer.Dispose(); + + // Determine new capacity + if(capacity < text.Length) capacity = text.Length; + + // Create the buffer + textbuffer = new VertexBuffer(General.Map.Graphics.Device, + capacity * 12 * FlatVertex.Stride, + Usage.Dynamic | Usage.WriteOnly, + VertexFormat.None, Pool.Default); + } + + // Transform? + if(transformcoords) + { + // Calculate absolute coordinates + Vector2D lt = new Vector2D(rect.Left, rect.Top); + Vector2D rb = new Vector2D(rect.Right, rect.Bottom); + lt = lt.GetTransformed(translatex, translatey, scalex, scaley); + rb = rb.GetTransformed(translatex, translatey, scalex, scaley); + absview = new RectangleF(lt.x, lt.y, rb.x - lt.x, rb.y - lt.y); + } + else + { + // Fixed coordinates + absview = rect; + } + + // Calculate text dimensions + size = General.Map.Graphics.Font.GetTextSize(text, scale); + + // Align the text horizontally + switch(alignx) + { + case TextAlignmentX.Left: beginx = absview.X; break; + case TextAlignmentX.Center: beginx = absview.X + (absview.Width - size.Width) * 0.5f; break; + case TextAlignmentX.Right: beginx = absview.X + absview.Width - size.Width; break; + } + + // Align the text vertically + switch(aligny) + { + case TextAlignmentY.Top: beginy = absview.Y; break; + case TextAlignmentY.Middle: beginy = absview.Y + (absview.Height - size.Height) * 0.5f; break; + case TextAlignmentY.Bottom: beginy = absview.Y + absview.Height - size.Height; break; + } + + // Get the ASCII bytes for the text + textbytes = Encoding.ASCII.GetBytes(text); + + // Lock the buffer + stream = textbuffer.Lock(0, capacity * 12 * FlatVertex.Stride, + LockFlags.Discard | LockFlags.NoSystemLock); + + // Go for all chars in text to create the backgrounds + float textx = beginx; + foreach(byte b in textbytes) + General.Map.Graphics.Font.SetupVertices(stream, b, scale, backcolor.ToInt(), + ref textx, beginy, size.Height, 0.5f); + + // Go for all chars in text to create the text + textx = beginx; + foreach(byte b in textbytes) + General.Map.Graphics.Font.SetupVertices(stream, b, scale, color.ToInt(), + ref textx, beginy, size.Height, 0.0f); + + // Done filling the vertex buffer + textbuffer.Unlock(); + stream.Dispose(); + + // Calculate number of triangles + numfaces = text.Length * 4; + } + else + { + // No faces in polygon + numfaces = 0; + size = new SizeF(0f, 0f); + } + + // Text updated + updateneeded = false; + } + } + + // This unloads the resources + public void UnloadResource() + { + // Clean up + if(textbuffer != null) textbuffer.Dispose(); + textbuffer = null; + + // Need to update before we can render + updateneeded = true; + } + + // This (re)loads the resources + public void ReloadResource() + { + } + + #endregion + } +} diff --git a/Source/Rendering/Texture2DShader.cs b/Source/Rendering/Texture2DShader.cs new file mode 100644 index 00000000..1b8a9186 --- /dev/null +++ b/Source/Rendering/Texture2DShader.cs @@ -0,0 +1,102 @@ + +#region ================== Copyright (c) 2007 Pascal vd Heiden + +/* + * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com + * This program is released under GNU General Public License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#endregion + +#region ================== Namespaces + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Windows.Forms; +using System.IO; +using System.Reflection; +using System.Drawing; +using System.ComponentModel; +using CodeImp.DoomBuilder.Map; +using SlimDX.Direct3D9; +using SlimDX; +using CodeImp.DoomBuilder.Geometry; +using System.Drawing.Imaging; + +#endregion + +namespace CodeImp.DoomBuilder.Rendering +{ + internal sealed class Texture2DShader : D3DShader + { + #region ================== Variables + + // Property handlers + private EffectHandle texture1; + + #endregion + + #region ================== Properties + + public Texture Texture1 { set { if(manager.Enabled) effect.SetValue(texture1, value); } } + + #endregion + + #region ================== Constructor / Disposer + + // Constructor + public Texture2DShader(ShaderManager manager) : base(manager) + { + // Load effect from file + effect = LoadEffect("texture2d.fx"); + + // Get the property handlers from effect + if(effect != null) + { + texture1 = effect.GetParameter(null, "texture1"); + } + + // Initialize world vertex declaration + VertexElement[] elements = new VertexElement[] + { + new VertexElement(0, 0, DeclarationType.Float4, DeclarationMethod.Default, DeclarationUsage.PositionTransformed, 0), + new VertexElement(0, 16, DeclarationType.Color, DeclarationMethod.Default, DeclarationUsage.Color, 0), + new VertexElement(0, 20, DeclarationType.Float2, DeclarationMethod.Default, DeclarationUsage.TextureCoordinate, 0), + VertexElement.VertexDeclarationEnd + }; + vertexdecl = new VertexDeclaration(General.Map.Graphics.Device, elements); + + // We have no destructor + GC.SuppressFinalize(this); + } + + // Disposer + public override void Dispose() + { + // Not already disposed? + if(!isdisposed) + { + // Clean up + if(texture1 != null) texture1.Dispose(); + + // Done + base.Dispose(); + } + } + + #endregion + + #region ================== Methods + + #endregion + } +} diff --git a/Source/Resources/Font.cfg b/Source/Resources/Font.cfg index 17bea478..90162ca6 100644 --- a/Source/Resources/Font.cfg +++ b/Source/Resources/Font.cfg @@ -7,9 +7,9 @@ chars { width = 26; height = 42; - u1 = 0.019141f; - v1 = 0.010938f; - u2 = 0.075195f; + u1 = 0.011719f; + v1 = -0.003906f; + u2 = 0.078125f; v2 = 0.195313f; } @@ -18,9 +18,9 @@ chars { width = 26; height = 42; - u1 = 0.089453f; - v1 = 0.010938f; - u2 = 0.145508f; + u1 = 0.082031f; + v1 = -0.003906f; + u2 = 0.148438f; v2 = 0.195313f; } @@ -29,9 +29,9 @@ chars { width = 26; height = 42; - u1 = 0.159766f; - v1 = 0.010938f; - u2 = 0.21582f; + u1 = 0.152344f; + v1 = -0.003906f; + u2 = 0.21875f; v2 = 0.195313f; } @@ -40,9 +40,9 @@ chars { width = 26; height = 42; - u1 = 0.230078f; - v1 = 0.010938f; - u2 = 0.286133f; + u1 = 0.222656f; + v1 = -0.003906f; + u2 = 0.289063f; v2 = 0.195313f; } @@ -51,9 +51,9 @@ chars { width = 24; height = 42; - u1 = 0.300391f; - v1 = 0.010938f; - u2 = 0.352539f; + u1 = 0.292969f; + v1 = -0.003906f; + u2 = 0.355469f; v2 = 0.195313f; } @@ -62,9 +62,9 @@ chars { width = 22; height = 42; - u1 = 0.366797f; - v1 = 0.010938f; - u2 = 0.415039f; + u1 = 0.359375f; + v1 = -0.003906f; + u2 = 0.417969f; v2 = 0.195313f; } @@ -73,9 +73,9 @@ chars { width = 28; height = 42; - u1 = 0.429297f; - v1 = 0.010938f; - u2 = 0.489258f; + u1 = 0.421875f; + v1 = -0.003906f; + u2 = 0.492188f; v2 = 0.195313f; } @@ -84,9 +84,9 @@ chars { width = 28; height = 42; - u1 = 0.503516f; - v1 = 0.010938f; - u2 = 0.563477f; + u1 = 0.496094f; + v1 = -0.003906f; + u2 = 0.566406f; v2 = 0.195313f; } @@ -95,9 +95,9 @@ chars { width = 13; height = 42; - u1 = 0.577734f; - v1 = 0.010938f; - u2 = 0.608398f; + u1 = 0.570313f; + v1 = -0.003906f; + u2 = 0.611328f; v2 = 0.195313f; } @@ -106,9 +106,9 @@ chars { width = 22; height = 42; - u1 = 0.622656f; - v1 = 0.010938f; - u2 = 0.670898f; + u1 = 0.615234f; + v1 = -0.003906f; + u2 = 0.673828f; v2 = 0.195313f; } @@ -117,9 +117,9 @@ chars { width = 28; height = 42; - u1 = 0.685156f; - v1 = 0.010938f; - u2 = 0.745117f; + u1 = 0.677734f; + v1 = -0.003906f; + u2 = 0.748047f; v2 = 0.195313f; } @@ -128,9 +128,9 @@ chars { width = 22; height = 42; - u1 = 0.759375f; - v1 = 0.010938f; - u2 = 0.807617f; + u1 = 0.751953f; + v1 = -0.003906f; + u2 = 0.810547f; v2 = 0.195313f; } @@ -139,9 +139,9 @@ chars { width = 31; height = 42; - u1 = 0.821875f; - v1 = 0.010938f; - u2 = 0.887695f; + u1 = 0.814453f; + v1 = -0.003906f; + u2 = 0.890625f; v2 = 0.195313f; } @@ -150,9 +150,9 @@ chars { width = 28; height = 42; - u1 = 0.901953f; - v1 = 0.010938f; - u2 = 0.961914f; + u1 = 0.894531f; + v1 = -0.003906f; + u2 = 0.964844f; v2 = 0.195313f; } @@ -161,9 +161,9 @@ chars { width = 28; height = 42; - u1 = 0.019141f; - v1 = 0.198438f; - u2 = 0.079102f; + u1 = 0.011719f; + v1 = 0.183594f; + u2 = 0.082031f; v2 = 0.382813f; } @@ -172,9 +172,9 @@ chars { width = 24; height = 42; - u1 = 0.093359f; - v1 = 0.198438f; - u2 = 0.145508f; + u1 = 0.085938f; + v1 = 0.183594f; + u2 = 0.148438f; v2 = 0.382813f; } @@ -183,9 +183,9 @@ chars { width = 28; height = 42; - u1 = 0.159766f; - v1 = 0.198438f; - u2 = 0.219727f; + u1 = 0.152344f; + v1 = 0.183594f; + u2 = 0.222656f; v2 = 0.382813f; } @@ -194,9 +194,9 @@ chars { width = 26; height = 42; - u1 = 0.233984f; - v1 = 0.198438f; - u2 = 0.290039f; + u1 = 0.226563f; + v1 = 0.183594f; + u2 = 0.292969f; v2 = 0.382813f; } @@ -205,9 +205,9 @@ chars { width = 24; height = 42; - u1 = 0.304297f; - v1 = 0.198438f; - u2 = 0.356445f; + u1 = 0.296875f; + v1 = 0.183594f; + u2 = 0.359375f; v2 = 0.382813f; } @@ -216,9 +216,9 @@ chars { width = 24; height = 42; - u1 = 0.370703f; - v1 = 0.198438f; - u2 = 0.422852f; + u1 = 0.363281f; + v1 = 0.183594f; + u2 = 0.425781f; v2 = 0.382813f; } @@ -227,9 +227,9 @@ chars { width = 28; height = 42; - u1 = 0.437109f; - v1 = 0.198438f; - u2 = 0.49707f; + u1 = 0.429688f; + v1 = 0.183594f; + u2 = 0.5f; v2 = 0.382813f; } @@ -238,9 +238,9 @@ chars { width = 26; height = 42; - u1 = 0.511328f; - v1 = 0.198438f; - u2 = 0.567383f; + u1 = 0.503906f; + v1 = 0.183594f; + u2 = 0.570313f; v2 = 0.382813f; } @@ -249,9 +249,9 @@ chars { width = 33; height = 42; - u1 = 0.581641f; - v1 = 0.198438f; - u2 = 0.651367f; + u1 = 0.574219f; + v1 = 0.183594f; + u2 = 0.654297f; v2 = 0.382813f; } @@ -260,9 +260,9 @@ chars { width = 26; height = 42; - u1 = 0.665625f; - v1 = 0.198438f; - u2 = 0.72168f; + u1 = 0.658203f; + v1 = 0.183594f; + u2 = 0.724609f; v2 = 0.382813f; } @@ -271,9 +271,9 @@ chars { width = 26; height = 42; - u1 = 0.735938f; - v1 = 0.198438f; - u2 = 0.791992f; + u1 = 0.728516f; + v1 = 0.183594f; + u2 = 0.794922f; v2 = 0.382813f; } @@ -282,9 +282,9 @@ chars { width = 24; height = 42; - u1 = 0.80625f; - v1 = 0.198438f; - u2 = 0.858398f; + u1 = 0.798828f; + v1 = 0.183594f; + u2 = 0.861328f; v2 = 0.382813f; } @@ -293,9 +293,9 @@ chars { width = 22; height = 42; - u1 = 0.872656f; - v1 = 0.198438f; - u2 = 0.920898f; + u1 = 0.865234f; + v1 = 0.183594f; + u2 = 0.923828f; v2 = 0.382813f; } @@ -304,9 +304,9 @@ chars { width = 22; height = 42; - u1 = 0.935156f; - v1 = 0.198438f; - u2 = 0.983398f; + u1 = 0.927734f; + v1 = 0.183594f; + u2 = 0.986328f; v2 = 0.382813f; } @@ -315,9 +315,9 @@ chars { width = 22; height = 42; - u1 = 0.019141f; - v1 = 0.385938f; - u2 = 0.067383f; + u1 = 0.011719f; + v1 = 0.371094f; + u2 = 0.070313f; v2 = 0.570313f; } @@ -326,9 +326,9 @@ chars { width = 22; height = 42; - u1 = 0.081641f; - v1 = 0.385938f; - u2 = 0.129883f; + u1 = 0.074219f; + v1 = 0.371094f; + u2 = 0.132813f; v2 = 0.570313f; } @@ -337,9 +337,9 @@ chars { width = 22; height = 42; - u1 = 0.144141f; - v1 = 0.385938f; - u2 = 0.192383f; + u1 = 0.136719f; + v1 = 0.371094f; + u2 = 0.195313f; v2 = 0.570313f; } @@ -348,9 +348,9 @@ chars { width = 22; height = 42; - u1 = 0.206641f; - v1 = 0.385938f; - u2 = 0.254883f; + u1 = 0.199219f; + v1 = 0.371094f; + u2 = 0.257813f; v2 = 0.570313f; } @@ -359,9 +359,9 @@ chars { width = 22; height = 42; - u1 = 0.269141f; - v1 = 0.385938f; - u2 = 0.317383f; + u1 = 0.261719f; + v1 = 0.371094f; + u2 = 0.320313f; v2 = 0.570313f; } @@ -370,9 +370,9 @@ chars { width = 22; height = 42; - u1 = 0.331641f; - v1 = 0.385938f; - u2 = 0.379883f; + u1 = 0.324219f; + v1 = 0.371094f; + u2 = 0.382813f; v2 = 0.570313f; } @@ -381,9 +381,9 @@ chars { width = 22; height = 42; - u1 = 0.394141f; - v1 = 0.385938f; - u2 = 0.442383f; + u1 = 0.386719f; + v1 = 0.371094f; + u2 = 0.445313f; v2 = 0.570313f; } @@ -392,9 +392,9 @@ chars { width = 22; height = 42; - u1 = 0.456641f; - v1 = 0.385938f; - u2 = 0.504883f; + u1 = 0.449219f; + v1 = 0.371094f; + u2 = 0.507813f; v2 = 0.570313f; } @@ -403,9 +403,9 @@ chars { width = 12; height = 42; - u1 = 0.519141f; - v1 = 0.385938f; - u2 = 0.547852f; + u1 = 0.511719f; + v1 = 0.371094f; + u2 = 0.550781f; v2 = 0.570313f; } @@ -414,9 +414,9 @@ chars { width = 12; height = 42; - u1 = 0.562109f; - v1 = 0.385938f; - u2 = 0.59082f; + u1 = 0.554688f; + v1 = 0.371094f; + u2 = 0.59375f; v2 = 0.570313f; } @@ -425,9 +425,9 @@ chars { width = 25; height = 42; - u1 = 0.605078f; - v1 = 0.385938f; - u2 = 0.65918f; + u1 = 0.597656f; + v1 = 0.371094f; + u2 = 0.662109f; v2 = 0.570313f; } @@ -436,9 +436,9 @@ chars { width = 22; height = 42; - u1 = 0.673438f; - v1 = 0.385938f; - u2 = 0.72168f; + u1 = 0.666016f; + v1 = 0.371094f; + u2 = 0.724609f; v2 = 0.570313f; } @@ -447,9 +447,9 @@ chars { width = 22; height = 42; - u1 = 0.735938f; - v1 = 0.385938f; - u2 = 0.78418f; + u1 = 0.728516f; + v1 = 0.371094f; + u2 = 0.787109f; v2 = 0.570313f; } @@ -458,9 +458,9 @@ chars { width = 33; height = 42; - u1 = 0.798438f; - v1 = 0.385938f; - u2 = 0.868164f; + u1 = 0.791016f; + v1 = 0.371094f; + u2 = 0.871094f; v2 = 0.570313f; } @@ -469,9 +469,9 @@ chars { width = 22; height = 42; - u1 = 0.882422f; - v1 = 0.385938f; - u2 = 0.930664f; + u1 = 0.875f; + v1 = 0.371094f; + u2 = 0.933594f; v2 = 0.570313f; } @@ -480,9 +480,9 @@ chars { width = 29; height = 42; - u1 = 0.019141f; - v1 = 0.573438f; - u2 = 0.081055f; + u1 = 0.011719f; + v1 = 0.558594f; + u2 = 0.083984f; v2 = 0.757813f; } @@ -491,9 +491,9 @@ chars { width = 19; height = 42; - u1 = 0.095313f; - v1 = 0.573438f; - u2 = 0.137695f; + u1 = 0.087891f; + v1 = 0.558594f; + u2 = 0.140625f; v2 = 0.757813f; } @@ -502,9 +502,9 @@ chars { width = 13; height = 42; - u1 = 0.151953f; - v1 = 0.573438f; - u2 = 0.182617f; + u1 = 0.144531f; + v1 = 0.558594f; + u2 = 0.185547f; v2 = 0.757813f; } @@ -513,9 +513,9 @@ chars { width = 13; height = 42; - u1 = 0.196875f; - v1 = 0.573438f; - u2 = 0.227539f; + u1 = 0.189453f; + v1 = 0.558594f; + u2 = 0.230469f; v2 = 0.757813f; } @@ -524,9 +524,9 @@ chars { width = 17; height = 42; - u1 = 0.241797f; - v1 = 0.573438f; - u2 = 0.280273f; + u1 = 0.234375f; + v1 = 0.558594f; + u2 = 0.283203f; v2 = 0.757813f; } @@ -535,9 +535,9 @@ chars { width = 22; height = 42; - u1 = 0.294531f; - v1 = 0.573438f; - u2 = 0.342773f; + u1 = 0.287109f; + v1 = 0.558594f; + u2 = 0.345703f; v2 = 0.757813f; } @@ -546,9 +546,9 @@ chars { width = 22; height = 42; - u1 = 0.357031f; - v1 = 0.573438f; - u2 = 0.405273f; + u1 = 0.349609f; + v1 = 0.558594f; + u2 = 0.408203f; v2 = 0.757813f; } @@ -557,9 +557,9 @@ chars { width = 12; height = 42; - u1 = 0.419531f; - v1 = 0.573438f; - u2 = 0.448242f; + u1 = 0.412109f; + v1 = 0.558594f; + u2 = 0.451172f; v2 = 0.757813f; } @@ -568,9 +568,9 @@ chars { width = 13; height = 42; - u1 = 0.4625f; - v1 = 0.573438f; - u2 = 0.493164f; + u1 = 0.455078f; + v1 = 0.558594f; + u2 = 0.496094f; v2 = 0.757813f; } @@ -579,9 +579,9 @@ chars { width = 13; height = 42; - u1 = 0.507422f; - v1 = 0.573438f; - u2 = 0.538086f; + u1 = 0.5f; + v1 = 0.558594f; + u2 = 0.541016f; v2 = 0.757813f; } @@ -590,9 +590,9 @@ chars { width = 12; height = 42; - u1 = 0.552344f; - v1 = 0.573438f; - u2 = 0.581055f; + u1 = 0.544922f; + v1 = 0.558594f; + u2 = 0.583984f; v2 = 0.757813f; } @@ -601,9 +601,9 @@ chars { width = 12; height = 42; - u1 = 0.595313f; - v1 = 0.573438f; - u2 = 0.624023f; + u1 = 0.587891f; + v1 = 0.558594f; + u2 = 0.626953f; v2 = 0.757813f; } @@ -612,9 +612,9 @@ chars { width = 10; height = 42; - u1 = 0.638281f; - v1 = 0.573438f; - u2 = 0.663086f; + u1 = 0.630859f; + v1 = 0.558594f; + u2 = 0.666016f; v2 = 0.757813f; } @@ -623,9 +623,9 @@ chars { width = 17; height = 42; - u1 = 0.677344f; - v1 = 0.573438f; - u2 = 0.71582f; + u1 = 0.669922f; + v1 = 0.558594f; + u2 = 0.71875f; v2 = 0.757813f; } @@ -634,9 +634,9 @@ chars { width = 12; height = 42; - u1 = 0.730078f; - v1 = 0.573438f; - u2 = 0.758789f; + u1 = 0.722656f; + v1 = 0.558594f; + u2 = 0.761719f; v2 = 0.757813f; } @@ -645,9 +645,9 @@ chars { width = 12; height = 42; - u1 = 0.773047f; - v1 = 0.573438f; - u2 = 0.801758f; + u1 = 0.765625f; + v1 = 0.558594f; + u2 = 0.804688f; v2 = 0.757813f; } @@ -656,9 +656,9 @@ chars { width = 22; height = 42; - u1 = 0.816016f; - v1 = 0.573438f; - u2 = 0.864258f; + u1 = 0.808594f; + v1 = 0.558594f; + u2 = 0.867188f; v2 = 0.757813f; } @@ -667,9 +667,9 @@ chars { width = 22; height = 42; - u1 = 0.878516f; - v1 = 0.573438f; - u2 = 0.926758f; + u1 = 0.871094f; + v1 = 0.558594f; + u2 = 0.929688f; v2 = 0.757813f; } @@ -678,9 +678,9 @@ chars { width = 10; height = 42; - u1 = 0.941016f; - v1 = 0.573438f; - u2 = 0.96582f; + u1 = 0.933594f; + v1 = 0.558594f; + u2 = 0.96875f; v2 = 0.757813f; } @@ -689,9 +689,9 @@ chars { width = 21; height = 42; - u1 = 0.019141f; - v1 = 0.760938f; - u2 = 0.06543f; + u1 = 0.011719f; + v1 = 0.746094f; + u2 = 0.068359f; v2 = 0.945313f; } @@ -700,9 +700,9 @@ chars { width = 10; height = 42; - u1 = 0.079688f; - v1 = 0.760938f; - u2 = 0.104492f; + u1 = 0.072266f; + v1 = 0.746094f; + u2 = 0.107422f; v2 = 0.945313f; } diff --git a/Source/Resources/Font.png b/Source/Resources/Font.png index fcf1531ea6f0d1d2a1ef9ccad8fc9b89b2e6d184..54cf04080c17cb4885261fe32ac23ed2f68d0fa3 100644 GIT binary patch literal 23772 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 diff --git a/Source/Resources/texture2d.fx b/Source/Resources/texture2d.fx new file mode 100644 index 00000000..7c4a99f0 --- /dev/null +++ b/Source/Resources/texture2d.fx @@ -0,0 +1,40 @@ +// 2D textured rendering shader +// Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com + +// Pixel input data +struct PixelData +{ + float4 pos : POSITION; + float4 color : COLOR0; + float2 uv : TEXCOORD0; +}; + +// Texture input +texture texture1; + +// Texture sampler settings +sampler2D texturesamp = sampler_state +{ + Texture = ; + MagFilter = Linear; + MinFilter = Linear; + MipFilter = Linear; + AddressU = Wrap; + AddressV = Wrap; +}; + +// Pixel shader +float4 ps_normal(PixelData pd) : COLOR +{ + return pd.color * tex2D(texturesamp, pd.uv); +} + +// Technique for shader model 2.0 +technique SM20 +{ + pass p0 + { + VertexShader = null; + PixelShader = compile ps_2_0 ps_normal(); + } +} diff --git a/Source/Resources/world3d.fx b/Source/Resources/world3d.fx index 661e7f9c..5f256653 100644 --- a/Source/Resources/world3d.fx +++ b/Source/Resources/world3d.fx @@ -54,10 +54,7 @@ float4 ps_main(PixelData pd) : COLOR float4 tcolor = tex2D(texturesamp, pd.uv); // Blend texture color and vertex color - return float4(tcolor.r * pd.color.r, - tcolor.g * pd.color.g, - tcolor.b * pd.color.b, - tcolor.a * pd.color.a); + return tcolor * pd.color; } // Technique for shader model 2.0