Author Topic: Vector Editor  (Read 3926 times)

MrTAToad

  • Guest
Vector Editor
« on: 2010-Jul-23 »
Here is the beta of my vector editor.

Its all pretty self-explanatory really - Add will add the current node type, Delete will delete it,  Move will move a node whilst Insert will add the current node, but resort the node list into ascending X and Y values.

As all the node positions are held in integers, you will find that rotating an object will cause rounding errors and thus slightly affect the objects shape.

Let me know of any problems...



[attachment deleted by admin]

Offline Wampus

  • Prof. Inline
  • *****
  • Posts: 1004
    • View Profile
Re: Vector Editor
« Reply #1 on: 2010-Jul-23 »
Couldn't find any problems other than the rounding error you mentioned. I can think of vital & helpful features you could add but I'm sure you've already considered them as things you might include later.

This is looking like a very useful little proggy for creating 2D wire vectors for games. You are awesome.  :nw:

MrTAToad

  • Guest
Re: Vector Editor
« Reply #2 on: 2010-Jul-23 »
Here is a little test program I've started to test the output.  It could do with being optimised a bit :

Code: GLBasic [Select]
// --------------------------------- //
// Project: TestVector
// Start: Friday, July 23, 2010
// IDE Version: 8.036

GLOBAL graphic AS TVector

IF graphic.TVector_Load("Media/Test.VEC")=FALSE
        DEBUG "Error!"
ENDIF

LOCAL scale=1.0
LOCAL x,y,angle

x=100
y=100
angle=0.0
WHILE TRUE
        graphic.TVector_Display(x,y,angle,scale)
        SHOWSCREEN

        INC scale,MOUSEAXIS(2)
        INC x,MOUSEAXIS(0)*0.5
        INC y,MOUSEAXIS(1)*0.5

        INC angle,0.25
WEND

Code: GLBasic [Select]
// --------------------------------- //
// Project: TestVector
// Start: Friday, July 23, 2010
// IDE Version: 8.036
TYPE tCoord
        x
        y
ENDTYPE

TYPE tGroup
        pos[] AS tCoord
ENDTYPE

TYPE tObject
        author$
        objectName$
        handleX%;handleY%
        groups[] AS tGroup
ENDTYPE

TYPE TVector
        vectorObject AS tObject

        SECTION_OBJECT$ =       "OBJECT"
        KEY_AUTHOR$             =       "AUTHOR"
        KEY_NAME$               =       "NAME"
        KEY_HANDLE$             =       "HANDLE"
        KEY_INUSE$              =       "INUSE"
        KEY_DATA$               =       "DATA"

        FUNCTION TVector_Initialise%:
                DIM self.vectorObject.groups[0]
        ENDFUNCTION

        FUNCTION TVector_Load%:fileName$
        LOCAL vector AS tCoord
        LOCAL group AS tGroup
        LOCAL temp$,loop%,error$
        LOCAL array$[],dataArray$[]

                IF DOESFILEEXIST(fileName$)
                        TRY
                                INIOPEN fileName$

                                self.vectorObject.author$=INIGET$(self.SECTION_OBJECT$,self.KEY_AUTHOR$,"")
                                self.vectorObject.objectName$=INIGET$(self.SECTION_OBJECT$,self.KEY_NAME$,"")

                                DIM array$[0]
                                DIM self.vectorObject.groups[0]

                                // Get the handle positions - for information only
                                IF SPLITSTR(INIGET$(self.SECTION_OBJECT$,self.KEY_HANDLE$,"0,0"),array$[],",")=2
                                        self.vectorObject.handleX%=INTEGER(array$[0])
                                        self.vectorObject.handleY%=INTEGER(array$[1])
                                ELSE
                                        // Ignore anything else and carry on
                                ENDIF

                                // Now we get a list of data sections that are in use
                                DIM array$[0]
                                IF SPLITSTR(INIGET$(self.SECTION_OBJECT$,self.KEY_INUSE$,""),array$[],",")>0
                                        FOREACH temp$ IN array$[]
                                                DIM dataArray$[0]
                                                DIM group.pos[0]
                                                IF SPLITSTR(INIGET$(self.SECTION_OBJECT$,self.KEY_DATA$+temp$,""),dataArray$[],",")>0
                                                        FOR loop%=0 TO BOUNDS(dataArray$[],0)-2 STEP 2
                                                                vector.x=INTEGER(dataArray$[loop%])*1.0
                                                                vector.y=INTEGER(dataArray$[loop%+1])*1.0
                                                                DIMPUSH group.pos[],vector
                                                        NEXT

                                                        // Push group into array
                                                        DIMPUSH self.vectorObject.groups[],group
                                                ELSE
                                                        THROW "No data in key : "+self.KEY_DATA$+temp$
                                                ENDIF
                                        NEXT
                                ELSE
                                        THROW "No data to be found!"
                                ENDIF

                                INIOPEN ""
                                RETURN TRUE
                        CATCH error$
                                DEBUG error$
                                STDERR error$
                                INIOPEN ""
                                RETURN FALSE
                        FINALLY
                ELSE
                        RETURN FALSE
                ENDIF
        ENDFUNCTION

        FUNCTION TVector_Display%:x,y,angle,scale
        LOCAL group AS tGroup
        LOCAL coords%,size%
        LOCAL ox,oy,nx,ny,n%,cv,sv

                cv=COS(angle)
                sv=SIN(angle)
                FOREACH group IN self.vectorObject.groups[]
                        size%=BOUNDS(group.pos[],0)
                        FOR loop%=0 TO size%-1
                                ox=(cv*group.pos[loop%].x*scale)-(sv*group.pos[loop%].y*scale)
                                oy=(cv*group.pos[loop%].y*scale)+(sv*group.pos[loop%].x*scale)
                                n%=loop%+1
                                IF n%>=size% THEN n%=0
                                nx=(cv*group.pos[n%].x*scale)-(sv*group.pos[n%].y*scale)
                                ny=(cv*group.pos[n%].y*scale)+(sv*group.pos[n%].x*scale)

                                DRAWLINE x+ox,y+oy,x+nx,y+ny,RGB(255,255,255)
                        NEXT
                NEXT
        ENDFUNCTION
ENDTYPE
 

This uses just lines for a no-thrills display.  I'll be doing a polyvector version later...

Quote
I can think of vital & helpful features you could add but I'm sure you've already considered them as things you might include later.
Let me know what you think is vital!

Quote
You are awesom
That is so true!  =D

[attachment deleted by admin]
« Last Edit: 2010-Aug-25 by MrTAToad »

Offline Wampus

  • Prof. Inline
  • *****
  • Posts: 1004
    • View Profile
Re: Vector Editor
« Reply #3 on: 2010-Jul-23 »
Even though REMOVE will take away the last x,y point an UNDO feature would be very useful, especially a successive UNDO feature so many steps can be retraced. Very few people remember to save at every major step of what they're working on.  :)

What I would see as helpful but not vital is this: as well as ADD and INSERT, a MIDPOINT function would be cool. It would add a new x,y point between the nearest two other points, so you can add more complexity to shapes.

MrTAToad

  • Guest
Re: Vector Editor
« Reply #4 on: 2010-Jul-23 »
Some good suggestions there!

I'll have to implement a nearest neighbour search for a MIDPOINT function, but it shouldn't be too hard :)  However, the INSERT function may do what you want - it resorts all the nodes according to the X & Y positions...
« Last Edit: 2010-Jul-24 by MrTAToad »

MrTAToad

  • Guest
Re: Vector Editor
« Reply #5 on: 2010-Jul-23 »
This is an example when using POLYVECTOR

Including is the updated code...

I dont know how many vector graphics can be handled, although, based on Scramble, it should be quite a few...

Now updated to be compatible with V8 - but see my later post




[attachment deleted by admin]
« Last Edit: 2010-Aug-25 by MrTAToad »

Offline Bursar

  • Mr. Drawsprite
  • **
  • Posts: 63
    • View Profile
Re: Vector Editor
« Reply #6 on: 2010-Aug-25 »
I figured I'd give GLB a look now there's a free version, but I've into a problem when trying to compile the code for the Vector Test. I get the following:
Code: GLBasic [Select]
GPC - GLBasic Precompiler V.8.044 SN:49df697f - 2D, WIN32
"TestVector.gbas"(0) warning : note : TYPE TVector is not declared

"TestVector.gbas"(0) warning : note : TYPE TVector is not declared

"TestVector.gbas"(0) warning : note : TYPE TVector is not declared

"..\VecEdit2\MiscRoutines.gbas"(5) warning : Demo mode: This command would require "GLBasic SDK premium"
"TVector.gbas"(107) error : call to undefined function : TVector_GetNextIndex
 

The offending line is:
Code: GLBasic [Select]
n%=TVector_GetNextIndex(loop%,size%)
in the function TVector_Display%

I can compile the code forthe vector editor with no problem, but the test app won't compile. The .exe version of it runs OK and displays the test vector. Not sure if there's an issue with compatibility with v8 of GLB, or it's something to do with me only running the free versio. Ofcourse I might just need to do something else before the code will compile.

MrTAToad

  • Guest
Re: Vector Editor
« Reply #7 on: 2010-Aug-25 »
Those are just warning messages - hopefully they will be removed soon-ish.

I've updated and re-posted the original code, so grab that again and it should work.

[attachment deleted by admin]
« Last Edit: 2010-Aug-25 by MrTAToad »

Offline Bursar

  • Mr. Drawsprite
  • **
  • Posts: 63
    • View Profile
Re: Vector Editor
« Reply #8 on: 2010-Aug-25 »
Thanks, I'll give it a go later on.

Offline Bursar

  • Mr. Drawsprite
  • **
  • Posts: 63
    • View Profile
Re: Vector Editor
« Reply #9 on: 2010-Aug-25 »
Still get some warnings, but it compiles and runs great now :)

MrTAToad

  • Guest
Re: Vector Editor
« Reply #10 on: 2010-Aug-25 »
The warnings can be ignored.  Glad it works now!