Gå til innhold

Anbefalte innlegg

Hei

 

Jeg lager for tiden en slags map editor, foreløpig har jeg bare konsentrert meg om terreng.

 

Det jeg er interessert i er å vite hva slags ytelse dere får, siden denne bruker C# grafikkmotoren min (glorg)

 

Andre som har testet det har fått problemer med at noe går kjempesakte.

Fortelle gjerne hvilket OS dere har, og hva slags hardware.

 

Og selvsagt feilmeldinger hvis dere får noen.

 

Programmet er ganske enkelt i bruk, midterste museknapp roterer rundt brettet, scroll med hjulet zoomer inn og ut, begge museknappene flytter kameraet rundt. Venstre museknapp utfører valgt kommando(opphøy terreng eller myk ut) høyre museknapp senker terrenget.

 

 

Fin sak. Fungerer bra hos meg. Ingen delay. Vet ikke om brush setup skal fungerere med det gjør det ihvertfall ikke; det skjer ingenting når jeg klikker på den.

 

Maskinen:

XP SP 2.

2 GB RAM

2,40 GHZ CORE 2.

NVIDIA Quadro FX560.

 

 

 

Hva slags kunnskaper trenger man får å lage noe sånt? Kan du peke på noe litteratur?

Fikk lyst til å prøve på noe "visualiseringsgreier" jeg har tenkt litt på.

 

Windows Vista Home Premium 64 bit

E8400

4 GB RAM

4870

 

Funker bra, men musa forsvinner og bugger (plutselig reiser terrenget seg en annen plass enn der jeg peker) hvis jeg maksimerer vinduet

Endret av zaqqoZeq
Lenke til kommentar
  • 1 måned senere...
Videoannonse
Annonse

Skrev noen extension metoder som kanskje noen synes er nyttig

 

public static class WriterExtensions
{
public static TextWriter EndLine(this TextWriter obj)
{
	obj.WriteLine();
	return obj;
}
public static TextWriter Commit<T>(this TextWriter obj, T value)
{
	obj.Write(value);
	return obj;
}
}

 

Poenget med disse er at de returnerer stream objektet. Dette gjør at en kan skrive ting som dette:

 

Console.Out.Commit("Mitt navn er:").Commit(my_name).Endline()
.Commit("Alder:").Commit(my_age).EndLine();

Endret av GeirGrusom
Lenke til kommentar
  • 3 uker senere...

Dette er en tekstbox jeg laget for databasedesign-programmet mitt. Den er laget for å begrense hva brukeren skriver og vise hva som er tillatt. Istedet for masks så bruker denne regular expressions.

En kan sette den slik at den nekter å ta imot en ny bokstav dersom den nye bokstaven vil føre til at teksten ikke matcher regexen, eller at den bare fargelegger teksten rød.

 

public partial class CheckedTextEditor : TextBox
{
protected Regex m_reg;
protected string m_reg_exp;
protected bool m_ignore_case;
protected bool m_allow_invalid_text;

[DefaultValue(false)]
public bool IgnoreCase
{
	get
	{
		return m_ignore_case;
	}
	set
	{
		m_ignore_case = value;
		RebuildRegex();
	}
}

[DefaultValue(false)]
public bool AllowInvalidText
{
	get
	{
		return m_allow_invalid_text;
	}
	set
	{
		m_allow_invalid_text = value;
	}
}
[DefaultValue(true)]
public bool IsTextValid
{
	get
	{
		if ( m_reg != null )
			return ValidateText( Text );
		else
			return true;
	}
}

protected void RebuildRegex()
{
	m_reg = new Regex(m_reg_exp, m_ignore_case ? RegexOptions.IgnoreCase : RegexOptions.None);
	System.Net.Sockets.TcpListener lst;

}
[DefaultValue("")]
public string RegularExpression
{
	get
	{
		return m_reg_exp;	
	}
	set
	{
		m_reg_exp = value;
		m_reg = new Regex( m_reg_exp );

		RebuildRegex();
	}
}

public CheckedTextEditor()
{
	m_reg_exp = "";
	m_reg = null;
}

protected override void OnKeyPress( KeyPressEventArgs e )
{
	base.OnKeyPress( e );
	if ( e.KeyChar != (char)8 && !m_allow_invalid_text)
	{
		string text = Text + e.KeyChar;

		e.Handled = !ValidateText( text );
	}
}
protected bool ValidateText( string text )
{
	Match m = m_reg.Match( text );
	return (m.Index == 0) && (m.Length == text.Length);
}

protected override void OnTextChanged( EventArgs e )
{
	ForeColor = IsTextValid ? SystemColors.WindowText : Color.Red;
	base.OnTextChanged( e );
}
}

 

For eksempel, regex for tall:

[0-9]*

regex for flyttall:

-?[0-9]*(\.[0-9]+)?

Lenke til kommentar
  • 1 måned senere...

Jeg skrev en extension klasse for binaryreader og binarywriter.

Disse er skrevet for at en skal kunne lese og skrive structures direkte til/fra filer.

 

Klikk for å se/fjerne innholdet nedenfor
using System;
using System.Runtime.InteropServices;

public static class IOExtensions
{
public static unsafe T Read<T>(this System.IO.BinaryReader rd)
	where T : struct
{
	T item = new T();
	int size = Marshal.SizeOf(typeof(T));
	byte[] b = rd.ReadBytes(size);
	fixed (byte* ptr = b)
		item = (T)Marshal.PtrToStructure(new IntPtr(ptr), typeof(T));
	return item;
}
public static unsafe T[] ReadArray<T>(this System.IO.BinaryReader rd, int count)
	where T : struct
{
	int size = Marshal.SizeOf(typeof(T));
	T[] arr = new T[count];
	GCHandle handle;
	// Pin array to prevent GC from moving it
	handle = GCHandle.Alloc(arr, GCHandleType.Pinned);
	int real_size = count * size;
	// Retrieve array address
	byte* ptr = (byte*)handle.AddrOfPinnedObject().ToPointer();
	for (int i = 0; i < real_size; i++)
		*ptr++ = rd.ReadByte();
	// Unpin array
	handle.Free();
	return arr;
}
public static unsafe void Write<T>(this System.IO.BinaryWriter wr, T value)
	where T : struct
{
	int size = Marshal.SizeOf(typeof(T));
	// Allocate temporary memory		
	IntPtr ptr = Marshal.AllocHGlobal(size);
	Marshal.StructureToPtr(value, ptr, false);
	byte* v_ptr = (byte*)ptr.ToPointer();
	for (int i = 0; i < size; i++)
		wr.Write(*v_ptr++);
	// Free temporary memory
	Marshal.FreeHGlobal(ptr);
}
public static void Write<T>(this System.IO.BinaryWriter wr, T[] arr)
	where T : struct
{
	for (int i = 0; i < arr.Length; i++)
		Write<T>(wr, arr[i]);
}
}

 

Merk at denne skriver dem nøyaktig slik de ligger i minnet, IKKE bruk reference types i strukturen (dette inkluderer selvsagt strings)

Kun byte, sbyte, shot, ushort, int, uint, long, ulong, float, double, decimal og andre valuetypes kan brukes.

 

For å bruke funksjonene, bruker en rett og slett BinaryReader og BinaryWriter

 

struct Chunk3DS
{
 public short id;
 public int length;
}
struct Vertex
{
 public float X;
 public float Y;
 public float Z;
}

void SomeFunction(Stream src)
{
 var reader = new BinaryReader(src);
 Chunk3DS chunk = reader.Read<Chunk3DS>();
 Vertex[] vertex_array = reader.ReadArray<Vertex>(chunk.length / Marshal.SizeOf(Vertex));
}

Endret av GeirGrusom
Lenke til kommentar
  • 4 uker senere...

Liten morsom klasse (den har ingen hensikt).

NB: Den er ikke testet!

 

Klikk for å se/fjerne innholdet nedenfor
using System;

namespace Baking
{
class Cake
{
	static bool isBaked = false;
	static bool isEaten = false;
	static bool isKilled = false;
	static bool is_A_lie = false;
	static bool isDisposed = false;
	public Cake(bool is_A_Lie)
	{
		is_A_lie = is_A_Lie;
	}

	public static void Bake()
	{
		isBaked = true;
	}

	public static void Eat()
	{
		if (is_A_lie)
		{
			throw new Exception("The cake is a lie.");
		}
		else
		{
			if (!isBaked)
			{
				throw new Exception("Bake the cake first.");
			}
			else if (isKilled)
			{
				throw new Exception("Can't eat cake, it is killed :(");
			}
			else if (isDisposed)
			{
				throw new Exception("Can't eat cake, it is disposed.");
			}
			else
			{
				isEaten = true;
			}
		}
	}

	public static void Kill()
	{
		if (is_A_lie)
		{
			throw new Exception("The cake is a lie.");
		}
		else
		{
			if (!isBaked)
			{
				throw new Exception("Bake the cake first.");
			}
			else if (isEaten)
			{
				throw new Exception("Can't kill cake, it is eaten.");
			}
			else if (isDisposed)
			{
				throw new Exception("The cake can not be killed, it is disposed.");
			}
			else
			{
				isKilled = true;
			}
		}
	}

	public static void Dispose()
	{
		if (is_A_lie)
		{
			throw new Exception("The cake is a lie.");
		}
		else
		{
			if (!isBaked)
			{
				throw new Exception("Bake the cake first.");
			}
			else if (isEaten)
			{
				throw new Exception("Can't throw cake, it is eaten.");
			}
			else if (isKilled)
			{
				throw new Exception("Cannot dispose of the cake, it is killed and not alive, bake a new one, or as GLADOS");
			}
			else
			{
				isDisposed = true;
			}
		}
	}
}
}

Lenke til kommentar
  • 4 uker senere...

Liten kreativ (men ikke veldig god) løsning på henting av variabler fra en fil med valgfri seperator (her ",". "\n" kan brukes om man vil separere med linjeskift):

			{
			FileInfo fi = new FileInfo(@"c:\bane\mål.txt);
			StreamReader sr = new StreamReader(fi.OpenRead());
			string config = sl.ReadLine();
			string param = "";
			int teller,start,slutt = 0;
			while (config.IndexOf(',') >= 0)
			{
				param = config.Substring(0, config.IndexOf(','));
				start = config.IndexOf(',')+1;
				slutt = config.Length-start;
				config = config.Substring(start, slutt);

				if (teller == 1) _var1 = param;
				if (teller == 2) _var2 = param;
				//osv
					teller++;
			}

Lenke til kommentar
  • 2 måneder senere...

Jeg skrev en ray-tracer i C++ og jeg gjentok (nesten) samme opplegget i C#

 

Jeg har dog ikke lagt til skygger, men grunnlaget er der :)

 

RayTrace.zip

 

Programmet er skrevet for .NET 3.5 men tviler på at det er noe stress å kjøre det under .NET 2.0 med en rekompilering.

Jeg laget det for multi-threading, men kan ikke se at det hadde noen effekt på ytelsen overhode... som jeg synes var litt snedig siden denne maskinen har 2 kjerner. I C++ utgjorde det en enorm forskjell, men det kan være at det er jeg som har gjort noe feil.

Lenke til kommentar

Kjempe kult eksempel. Skjønnte plutselig hvor enkelt det er å lage 3d animasjon i C#

Men dette gikk treeeeeeegt på min maskin. Har ingen 3d akksellerator så det er nok årsaken.

 

Mens vi er inne på temaet. Er det noen form for kollisjons analyse i dette?

 

 

Edit:

For å få kompillert i net2 så må referansen til LINQ og alle USING av LINQ tas vekk

Endret av HDSoftware
Lenke til kommentar

Det er ren software rendering (all kode for rendring ligger i kildekoden) sannsynligvis derfor det går tregt ^^ 3d akselleratoren er veldig uegnet til ray-tracing.

Men det er noen fordeler med ray-tracing, for eksempel realtistiske refleksjoner og refraksjoner, som er temmelig vanskelig å få til med vanlig raster-3D.

Ray-tracing brukes ofte av 3D programmer som 3ds max og lignende.

 

edit:lief

Endret av GeirGrusom
Lenke til kommentar

Måtte jo bare teste. Endret litt på posisjoneringen og animasjonen inne i løkka

 

sp1.Position = new Vector(Math.Cos(ang) * 4, 0, Math.Sin(ang) * 4 + 5);
sp2.Position = new Vector(0, Math.Sin(ang) * 4, Math.Cos(ang) * 4 + 5);

 

 

Ikke så fancy greier, men var litt artig å betrakte animasjonen innenifra objektene. Masse morro man kan gjøre med dette.

Endret av HDSoftware
Lenke til kommentar

Tja, var vel egentlig ikke ViewPoint jeg flyttet, men origo til objektene pluss at jeg endret objekt 2 til å spinne rundt x aksen i stedet for y aksen. Programmet ditt gir ideer....

 

Siden vi er på det 3dimensjonale planet. Har du eksempelkode på hvordan man kan animere på samme måte uten å bruke Ray Tracing? Tenker litt mere DirectX stuff som demonstrerer den samme effekten uten å rendre RT selv

 

nb! Ikke kast bort tid hvis det er kompliserte greier...

Lenke til kommentar
  • 3 uker senere...

Hei!

 

Jeg har jobbet litt med å lage en virtual machine noen dager, og lurte på hva dere synes om den.

 

Det er en virtuell prosessor (ikke operativsystem :p )

 

I bunn og grunn litt general purpose, men den har egne registre og instruksjoner for vektorregning.

 

Her er instruksjonssettet:

 

Klikk for å se/fjerne innholdet nedenfor
Registers:
ra-d    64-bit integer or floating point
ri    64-bit integer, instruction pointer
rs    64-bit integer, stack pointer
rva-d    256-bit vector

a, b : integer register
va, vb : vector register

Mnemonic    Description        Function
Add        Signed addition        a <= (a + b)
Sub        Signed subtraction    a <= (a - b)
Mul        Signed multiplication    a <= (a * b)
Div        Signed division        a <= (a / b)
Mod        Signed modulo        a <= (a mod b)
UAdd        Unsigned addition    a <= (a + b)
USub        Unsigned subtraction    a <= (a - b)
UMul        Unsigned multiplication    a <= (a * b)
UDiv        Unsigned division    a <= (a / b)
And        Bitwise and        a <= (a and b)
Or        Bitwise or        a <= (a or b)
Xor        Bitwise exclusive or    a <= (a xor b)
Bsh        Bitshift        a <= (a <<>> b)
Not        Bitwise not        a <= not a
Jmp        Unconditional jump    ip <= a
Je        Jump if equal        ip <= b if a = 0
Jne        Jump if not equal    ip <= b if a <> 0
Jl        Jump if less        ip <= b if a < 0
Jg        Jump if grater        ip <= b if a > 0
Jle        Jump if less or equal    ip <= b if a <= 0
Jge        Jump if great or equal    ip <= b if a >= 0
Call        Call procedure        push ip; ip <= a
ECall        Call extern procedure    a <= function return
int        Call interrupt
Ret        Return from procedure    ip <= stack[sp]; sp <= sp - 1
Cmp        Compare values        a <= (a - b)
Push        Push value to stack    stack[sp] <= a; sp <= sp + 1
Pop        Pop value from stack    sp <= sp -1; a <= stack[sp]
Inc        Increment value        a <= (a + 1)
Dec        Decrement value        a <= (a - 1)
Fadd        Floating point add    a <= (a + b)
Fsub        Floating point sub    a <= (a - b)
Fmul        Floating point mul    a <= (a * b)
Fdiv        Floating point div    a <= (a / b)
fcos        Cosine            a <= cos(a)
fsin        Sine            a <= sin(a)
fsincos        Cosine and sine        b <= cos(a); a <= sin(a)
fsqrt        Square root        a <= sqrt(a)
fpow        Value raised to power    a <= (a ^ b)
floor        Floor of value        a <= floor(a)
ceil        Ceiling of value    a <= ceil(a)
Ftoi        Float to integer    a <= int(a)
Itof        Integer to float    a <= float(a)
Mov        Copy value        a <= b
MOvh        Copy half-word        a <= (b & 0xffffffff)
Movq        Copy quarter-word    a <= (b & 0xffff)
Movb        Copy byte        a <= (b & 0xff)
Lea        Load effective address    a <= a * 8 + stack
quit        Exit program        no change
vadd        Add vectors        va <= (va + vb)
vsub        Subtract vectors    va <= (va - vb)
vmul        Multiply vec or scalar    va <= (va * ?b)
vdiv        Divide vec or scalar    va <= (va * ?b)
vdot        Dot product of vectors  ra <= (va dot vb)
vmov        Move vector or scalars    va <= ?b
vpush        Push vector to stack    stack[sp] <= va; sp <= sp + 4
vpop        Pop vector from stack    sp <= sp - 4; va <= stack[sp]
vlen        Length of vector    a <= length(vb)
vnorm        Normalize vector    va <= normalize(va)

 

 

jump funksjonene er litt annerledes enn i x86 assembly, ved at alle conditional jump instruksjoner tar to parameter, resultatet av sammenligningen, og hvor hoppet skjer. Det er også noen ting med adresser som en må merke seg, jxx og call bruker ikke absoluttadresser, men adresser som er både 8-byte alignet, og relativt i forhold til adresseområdet til maskinen.

 

Eksempel på bruk av je:

 

cmp ra, rb
je ra, MyLabel
jmp main
MyLabel:

 

 

Det er også en egen instruksjon som heter ecall, denne er laget for å kalle .NET funksjoner som er lagt til. Foreløpig er bare MsgBox lagt til, og den tar en absolutt adresse til et minneområde med tekst i ra.

 

I disassembly vil alle disse funksjonene bli lagt til på slutten (jump table)

 

main er en spesiell label (dersom den står noen andre steder enn på toppen) den vil føre til at assembleren legger til en jmp instruksjon til main labelen.

 

Registrene er som følger:

 

ra, rb, rc, rd som er general purpose. rs er stack pekeren, og ri er instruksjonspekeren (begge er 8-byte alignet og relativ i forhold til adresseområdet)

 

Bruk lea for å gjøre om en 8-byte alignet og relativ adresse til en absolutt adresse.

 

rva, rvb, rvc, rvd er vektorregistre. Disse har 4 elementer: x, y, z og w.

 

En kan kopiere fra vektor-element til general purpose slik:

 

mov ra, rva.x
mov rb, rva.y
mov rc, rva.z
mov rd, rva.w

 

 

Det er en interrupt funksjon også, foreløpig er denne laget for å vise grafikk.

 

int 1 vil legge adressen til grafikkområdet (32-bit rgb) i rd, og dytte width og height til stack i den rekkefølgen. For å hente bredden kan en kalle

 

mov rc, rs
lea rc
mov ra, [rc - 16] // Bredde
mov rb, [rc - 8] // Høyde

 

 

Jeg må legge til flere debug muligheter vet jeg, men det har vært en del jobb å lage denne foreløpig, så får se.

 

edit: Rettet opp masse bugs og lagt til debugger. Det følger med et eksempelprogram som farger én pixel etter verdien i rva registeret.

 

VectorVM.zip

Endret av GeirGrusom
Lenke til kommentar
  • 1 måned senere...
  • 2 uker senere...

Å skrive en raytracer er naturligvis imponerende.

Hvis du er interessert i slikt, kan du for eksempel peke nettleseren din på http://code.msdn.microsoft.com/ParExtSampl...?ReleaseId=3354, og hente en raytracer skrevet med parallelle utvidelser for C#. Har du fire kjerner, klarer den nesten å kjøre en animert sekvens uten hakking. Hint: ikke kjør programmet i full skjerm om du bruker 2560x1600... (vel, den klarer fortsatt 0,3 fps, så noen krise er det ikke)

 

Det ser ut til at CPUene har stoppet på omlag 3GHz, men at man øker antall kjerner i stedet. Parallell programmering kan derfor bli viktigere og viktigere - om ikke alt havner i Skyen, da.

 

- Grå -

Lenke til kommentar

Nice. Men parallelle utvidelser kommer vel ikke før i .NET 4.0?

 

Laget btw. en Ubb syntax highlighter for C#. Poster koden her fargelagt med den :)

 

[color="#0000FF"]using[/color] System;
[color="#0000FF"]using[/color] System.Collections.Generic;
[color="#0000FF"]using[/color] System.ComponentModel;
[color="#0000FF"]using[/color] System.Data;
[color="#0000FF"]using[/color] System.Drawing;
[color="#0000FF"]using[/color] System.Windows.Forms;

[color="#0000FF"]using[/color] System.Text.RegularExpressions;

[color="#0000FF"]namespace[/color] LangUbbize
{
   [color="#0000FF"]public[/color] partial [color="#0000FF"]class[/color] MainForm : Form
   {
       [color="#0000FF"]public[/color] List<[color="#0000FF"]string[/color]> Keywords;

       [color="#0000FF"]public[/color] Regex cs_reg = [color="#0000FF"]new[/color] Regex(
           [color="#A9A9A9"]@"(?<CodeInfo>(?m-s)///.*$)|(?<Comment>(?s-m)(/\*.*?\*/)|((?m-s)//.*$))|(?<String>((?-s)("[/color][color="#A9A9A9"]".*?"[/color][color="#A9A9A9"]"))|((?s)@"[/color][color="#A9A9A9"]".*?"[/color][color="#A9A9A9"]"))|(?<Character>('.+?'))|(?<Keyword>[a-z]+)"[/color], RegexOptions.Compiled
           );

       [color="#708090"]/// <summary>
[/color]
       [color="#708090"]/// Performs a code replace to UBB syntax highlighting
[/color]
       [color="#708090"]/// </summary>
[/color]
       [color="#708090"]/// <param name="input">C# code to syntax highlight</param>
[/color]
       [color="#708090"]/// <returns>Resulting UBB code</returns>
[/color]
       [color="#0000FF"]public[/color] [color="#0000FF"]string[/color] PerformReplace([color="#0000FF"]string[/color] input)
       {
           [color="#008000"]// Do replace. Check each match to se what
[/color]
           [color="#008000"]// capture group they belong to.
[/color]
           [color="#0000FF"]return[/color] cs_reg.Replace(input, m =>
           {
               Color color = Color.Transparent;
               [color="#0000FF"]if[/color] (m.Groups[[color="#A9A9A9"]"Comment"[/color]].Success)
                   color = Color.Green;
               [color="#0000FF"]else[/color] [color="#0000FF"]if[/color] (m.Groups[[color="#A9A9A9"]"Character"[/color]].Success)
                   color = Color.SlateGray;
               [color="#0000FF"]else[/color] [color="#0000FF"]if[/color] (m.Groups[[color="#A9A9A9"]"String"[/color]].Success)
                   color = Color.DarkGray;
               [color="#0000FF"]else[/color] [color="#0000FF"]if[/color] (m.Groups[[color="#A9A9A9"]"CodeInfo"[/color]].Success)
                   color = Color.SlateGray;
               [color="#0000FF"]else[/color] [color="#0000FF"]if[/color] (m.Groups[[color="#A9A9A9"]"Keyword"[/color]].Success)
                   [color="#0000FF"]if[/color] (Keywords.Contains(m.Value))
                       color = Color.Blue;
                   [color="#0000FF"]else[/color]
                       color = Color.Transparent;

               [color="#0000FF"]if[/color] (color != Color.Transparent)
                   [color="#0000FF"]return[/color] [color="#A9A9A9"]"[color="#colorcspancolorc  colorToArgb amp 0x00ffffffToStringcoloro#A9A9A9span stylecolor#A9A9A9coloroX6colorcspancolorc  coloro#A9A9A9span stylecolor#A9A9A9coloro"]"[/color] + m.Value + [color="#A9A9A9"]"[/color]"[/color];
               [color="#0000FF"]else[/color] 
                   [color="#0000FF"]return[/color] m.Value;
           });
       }

       [color="#0000FF"]public[/color] MainForm()
       {
           Keywords = [color="#0000FF"]new[/color] List<[color="#0000FF"]string[/color]>([color="#0000FF"]new[/color] [color="#0000FF"]string[/color][] {
               [color="#A9A9A9"]"abstract"[/color], [color="#A9A9A9"]"event"[/color],    [color="#A9A9A9"]"new"[/color],      [color="#A9A9A9"]"struct"[/color],
               [color="#A9A9A9"]"as"[/color],       [color="#A9A9A9"]"explicit"[/color], [color="#A9A9A9"]"null"[/color],     [color="#A9A9A9"]"switch"[/color],
               [color="#A9A9A9"]"base"[/color],     [color="#A9A9A9"]"extern"[/color],   [color="#A9A9A9"]"object"[/color],   [color="#A9A9A9"]"this"[/color],
               [color="#A9A9A9"]"bool"[/color],     [color="#A9A9A9"]"false"[/color],    [color="#A9A9A9"]"operator"[/color], [color="#A9A9A9"]"throw"[/color], 
               [color="#A9A9A9"]"break"[/color],    [color="#A9A9A9"]"finally"[/color],  [color="#A9A9A9"]"out"[/color],      [color="#A9A9A9"]"true"[/color],
               [color="#A9A9A9"]"byte"[/color],     [color="#A9A9A9"]"fixed"[/color],    [color="#A9A9A9"]"override"[/color], [color="#A9A9A9"]"try"[/color],
               [color="#A9A9A9"]"case"[/color],     [color="#A9A9A9"]"float"[/color],    [color="#A9A9A9"]"params"[/color],   [color="#A9A9A9"]"typeof"[/color],
               [color="#A9A9A9"]"catch"[/color],    [color="#A9A9A9"]"for"[/color],      [color="#A9A9A9"]"private"[/color],  [color="#A9A9A9"]"uint"[/color],
               [color="#A9A9A9"]"char"[/color],     [color="#A9A9A9"]"foreach"[/color],  [color="#A9A9A9"]"protected"[/color],[color="#A9A9A9"]"ulong"[/color],
               [color="#A9A9A9"]"checked"[/color],  [color="#A9A9A9"]"goto"[/color],     [color="#A9A9A9"]"public"[/color],   [color="#A9A9A9"]"unchecked"[/color],
               [color="#A9A9A9"]"class"[/color],    [color="#A9A9A9"]"if"[/color],       [color="#A9A9A9"]"readonly"[/color], [color="#A9A9A9"]"unsafe"[/color],
               [color="#A9A9A9"]"const"[/color],    [color="#A9A9A9"]"implicit"[/color], [color="#A9A9A9"]"ref"[/color],      [color="#A9A9A9"]"ushort"[/color],
               [color="#A9A9A9"]"continue"[/color], [color="#A9A9A9"]"in"[/color],       [color="#A9A9A9"]"return"[/color],   [color="#A9A9A9"]"using"[/color],
               [color="#A9A9A9"]"decimal"[/color],  [color="#A9A9A9"]"int"[/color],      [color="#A9A9A9"]"sbyte"[/color],    [color="#A9A9A9"]"virtual"[/color],
               [color="#A9A9A9"]"default"[/color],  [color="#A9A9A9"]"interface"[/color],[color="#A9A9A9"]"sealed"[/color],   [color="#A9A9A9"]"volatile"[/color],
               [color="#A9A9A9"]"delegate"[/color], [color="#A9A9A9"]"internal"[/color], [color="#A9A9A9"]"short"[/color],    [color="#A9A9A9"]"void"[/color],
               [color="#A9A9A9"]"do"[/color],       [color="#A9A9A9"]"is"[/color],       [color="#A9A9A9"]"sizeof"[/color],   [color="#A9A9A9"]"while"[/color],
               [color="#A9A9A9"]"double"[/color],   [color="#A9A9A9"]"lock"[/color],     [color="#A9A9A9"]"stackalloc"[/color],
               [color="#A9A9A9"]"else"[/color],     [color="#A9A9A9"]"long"[/color],     [color="#A9A9A9"]"static"[/color],
               [color="#A9A9A9"]"enum"[/color],     [color="#A9A9A9"]"namespace"[/color],[color="#A9A9A9"]"string"[/color]
           });


           InitializeComponent();
       }

       [color="#0000FF"]private[/color] [color="#0000FF"]void[/color] SourceCode_TextChanged([color="#0000FF"]object[/color] sender, EventArgs e)
       {
           UbbText.Text = PerformReplace(SourceCode.Text);
       }
   }
}

Den tøyser imidlertid på koden som danner color sakene, så jeg uploader også kildekoden.

multiline verbatim strings er også støttet, uten at jeg har hatt spesielt bruk for det i denne kode.

For å lage den for et annet språk, trengs det kun å skrives ny regex, samt legge inn andre keywords.

 

edit: den resulterende koden må legges i codebox, og ikke code, siden sistnevnte ignorerer ubb tags.

LangUbbize.zip

Endret av GeirGrusom
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...