@Duffer
Yes you can,just be aware that different types of objects use different ways of storing the data in the vertex buffers,so just moving one point may work on some objects,ie all the polies that use that point would be affected so the surface would be unbroken,others do not and you would have to search all the vertex data to find shared points.
There is another solution to this thats called vertex welding,this does the search once for all the shared points and basicly builds another object out of the data that can then be edited more easily,it is tricky to do,but not impossible.
[EDIT]
UV Painter code,bit messy,but shows the principals of it.
`UV Painter
`======================
`P.Parkinson
`======================
`Main Source File
`needs sparkys and D3D to function corectly
SYNC ON
SYNC RATE 60
AUTOCAM OFF
COLOR BACKDROP 0, 0
SET TEXT FONT "Arial"
SET TEXT SIZE 12
SET TEXT TRANSPARENT
POSITION MOUSE 320,240
dummy=MOUSEMOVEX()
dummy=MOUSEMOVEY()
POSITION CAMERA 30,30,-30
POINT CAMERA 0,0,0
`set up return data array
TYPE vertex_data
x1 AS FLOAT
y1 AS FLOAT
z1 AS FLOAT
u1 AS FLOAT
v1 AS FLOAT
x2 AS FLOAT
y2 AS FLOAT
z2 AS FLOAT
u2 AS FLOAT
v2 AS FLOAT
x3 AS FLOAT
y3 AS FLOAT
z3 AS FLOAT
u3 AS FLOAT
v3 AS FLOAT
texture AS INTEGER
vertex1 AS INTEGER
vertex2 AS INTEGER
vertex3 AS INTEGER
ENDTYPE
GLOBAL draw_data AS vertex_data
`set up target and marker for raycast
GLOBAL target AS INTEGER
target=free_object()
MAKE OBJECT CUBE target,1
HIDE OBJECT target
GLOBAL marker AS INTEGER
marker=free_object()
MAKE OBJECT CUBE marker,0.3
COLOR OBJECT marker,RGB(255,0,0)
HIDE OBJECT marker
GLOBAL length_of_ray AS INTEGER=100
`set markers for poly outline objects
dummy=free_object()
MAKE OBJECT SPHERE dummy,0.2
MAKE MESH FROM OBJECT 1,dummy
DELETE OBJECT dummy
GLOBAL red_marker AS INTEGER
red_marker=free_object()
MAKE OBJECT SPHERE red_marker,0.2
COLOR OBJECT red_marker,RGB(255,0,0)
ADD LIMB red_marker,1,1
COLOR LIMB red_marker,1,RGB(255,0,0)
HIDE OBJECT red_marker
GLOBAL green_marker AS INTEGER
green_marker=free_object()
MAKE OBJECT SPHERE green_marker,0.2
COLOR OBJECT green_marker,RGB(0,255,0)
ADD LIMB green_marker,1,1
COLOR LIMB green_marker,1,RGB(0,255,0)
HIDE OBJECT green_marker
GLOBAL blue_marker AS INTEGER
blue_marker=free_object()
MAKE OBJECT SPHERE blue_marker,0.2
COLOR OBJECT blue_marker,RGB(0,0,255)
ADD LIMB blue_marker,1,1
COLOR LIMB blue_marker,1,RGB(0,0,255)
HIDE OBJECT blue_marker
DELETE MESH 1
`make text textures
make_textures()
`make test objects
obj=free_object()
MAKE OBJECT CUBE obj,5
TEXTURE OBJECT obj,1
POSITION OBJECT obj,-20,0,0
SC_SETUPOBJECT obj,0,0
obj=free_object()
MAKE OBJECT SPHERE obj,5
MAKE MESH FROM OBJECT 1,obj
DELETE OBJECT obj
MAKE OBJECT obj,1
TEXTURE OBJECT obj,2
DELETE MESH 1
POSITION OBJECT obj,-10,0,0
SC_SETUPOBJECT obj,0,0
obj=free_object()
MAKE OBJECT CUBE obj,5
TEXTURE OBJECT obj,3
POSITION OBJECT obj,0,0,0
YROTATE OBJECT obj,45
MAKE OBJECT SPHERE 1000,5
MAKE MESH FROM OBJECT 1,1000
DELETE OBJECT 1000
ADD LIMB obj,1,1
TEXTURE LIMB obj,1,1
DELETE MESH 1
OFFSET LIMB obj,1,0,3,0
SC_SETUPOBJECT obj,0,0
obj=free_object()
MAKE OBJECT CUBE obj,5
TEXTURE OBJECT obj,4
POSITION OBJECT obj,10,0,0
YROTATE OBJECT obj,45
MAKE OBJECT SPHERE 1000,5
MAKE MESH FROM OBJECT 1,1000
DELETE OBJECT 1000
ADD LIMB obj,1,1
TEXTURE LIMB obj,1,1
DELETE MESH 1
OFFSET LIMB obj,1,0,3,0
SC_SETUPOBJECT obj,0,0
obj=free_object()
MAKE OBJECT CUBE obj,5
TEXTURE OBJECT obj,5
POSITION OBJECT obj,20,0,0
YROTATE OBJECT obj,45
MAKE OBJECT SPHERE 1000,5
MAKE MESH FROM OBJECT 1,1000
DELETE OBJECT 1000
ADD LIMB obj,1,1
TEXTURE LIMB obj,1,1
DELETE MESH 1
OFFSET LIMB obj,1,0,3,0
ROTATE LIMB obj,1,45,0,0
SC_SETUPOBJECT obj,0,0
`*******main loop********
DO
POSITION OBJECT target,CAMERA POSITION X(),CAMERA POSITION Y(),CAMERA POSITION Z()
SET OBJECT TO CAMERA ORIENTATION target
MOVE OBJECT target,length_of_ray
MouseControl(1.0)
hit=SC_RAYCAST (0,CAMERA POSITION X(),CAMERA POSITION Y(),CAMERA POSITION Z(),OBJECT POSITION X(target),OBJECT POSITION Y(target),OBJECT POSITION Z(target),0)
IF hit>0
SHOW OBJECT marker
cx# = SC_GETSTATICCOLLISIONX() : nx# = SC_GETCOLLISIONNORMALX()
cy# = SC_GETSTATICCOLLISIONY() : ny# = SC_GETCOLLISIONNORMALY()
cz# = SC_GETSTATICCOLLISIONZ() : nz# = SC_GETCOLLISIONNORMALZ()
POSITION OBJECT marker,cx#,cy#,cz#
POINT OBJECT marker,cx#+(nx#*1000),cy#+(ny#*1000),cz#+(nz#*1000)
draw_wire_frame(hit)
ELSE
HIDE OBJECT marker
HIDE OBJECT red_marker
HIDE OBJECT green_marker
HIDE OBJECT blue_marker
ENDIF
TEXT 0,270,"MOUSE TO LOOK AROUND AND POSITION TARGET MOUSE BUTTONS ZOOM IN/OUT"
SYNC
LOOP
`*******Functions********
FUNCTION MouseControl(Speed AS FLOAT)
XROTATE CAMERA CAMERA ANGLE X()+MOUSEMOVEY()
YROTATE CAMERA CAMERA ANGLE Y()+MOUSEMOVEX()
IF MOUSECLICK()=1 THEN MOVE CAMERA Speed
IF MOUSECLICK()=2 THEN MOVE CAMERA (0-Speed)
r=MOUSEMOVEX()
r=MOUSEMOVEY()
ENDFUNCTION
FUNCTION free_object()
REPEAT
INC i
IF OBJECT EXIST(i)=0 THEN found=1
UNTIL found
ENDFUNCTION i
FUNCTION free_image()
REPEAT
INC i
IF IMAGE EXIST(i)=0 THEN found=1
UNTIL found
ENDFUNCTION i
FUNCTION draw_wire_frame(obj)
sparkys_face_hit=SC_GETFACEHIT()
num_limbs=find_num_limbs(obj)
`debug
TEXT 0,285,"PRESS SPACE TO SET NEW UV DATA"
TEXT 0,0+300,"Objec Hit - "+STR$(obj)
TEXT 0,15+300,"Sparky´s Face Hit - "+STR$(sparkys_face_hit)
TEXT 0,30+300,"Limbs In Object Hit - "+STR$(num_limbs)
`find the limb hit
start_face_of_limb=0
limb_hit=0
limb_face_hit=0
total_faces=0
FOR limb=0 TO num_limbs
LOCK VERTEXDATA FOR LIMB obj,limb
index_count=GET VERTEXDATA INDEX COUNT()
vertex_count=GET VERTEXDATA VERTEX COUNT()
IF index_count>0
faces_in_limb=index_count/3
ELSE
faces_in_limb=vertex_count/3
ENDIF
total_faces=total_faces+faces_in_limb
IF sparkys_face_hit>total_faces
INC limb_hit
ELSE
IF limb_hit=0
limb_face_hit=sparkys_face_hit
ELSE
limb_face_hit=sparkys_face_hit-(total_faces-faces_in_limb)
ENDIF
ENDIF
`debug
TEXT 0,45+(limb*15)+300,"Faces In Limb "+STR$(limb)+" - "+STR$(faces_in_limb)
UNLOCK VERTEXDATA
NEXT l
`debug
TEXT 0,45+((num_limbs+1)*15)+300,"Total Faces - "+STR$(total_faces)
TEXT 0,45+((num_limbs+2)*15)+300,"Limb Hit - "+STR$(limb_hit)
TEXT 0,45+((num_limbs+3)*15)+300,"Limb Face Hit - "+STR$(limb_face_hit)
`get marker positions
LOCK VERTEXDATA FOR LIMB obj,limb_hit
index_count=GET VERTEXDATA INDEX COUNT()
IF index_count>0
draw_data.x1=GET VERTEXDATA POSITION X(GET INDEXDATA(limb_face_hit*3))
draw_data.y1=GET VERTEXDATA POSITION Y(GET INDEXDATA(limb_face_hit*3))
draw_data.z1=GET VERTEXDATA POSITION Z(GET INDEXDATA(limb_face_hit*3))
draw_data.u1=GET VERTEXDATA U(GET INDEXDATA(limb_face_hit*3))
draw_data.v1=GET VERTEXDATA V(GET INDEXDATA(limb_face_hit*3))
draw_data.vertex1=GET INDEXDATA(limb_face_hit*3)
draw_data.x2=GET VERTEXDATA POSITION X(GET INDEXDATA(limb_face_hit*3+1))
draw_data.y2=GET VERTEXDATA POSITION Y(GET INDEXDATA(limb_face_hit*3+1))
draw_data.z2=GET VERTEXDATA POSITION Z(GET INDEXDATA(limb_face_hit*3+1))
draw_data.u2=GET VERTEXDATA U(GET INDEXDATA(limb_face_hit*3+1))
draw_data.v2=GET VERTEXDATA V(GET INDEXDATA(limb_face_hit*3+1))
draw_data.vertex2=GET INDEXDATA(limb_face_hit*3+1)
draw_data.x3=GET VERTEXDATA POSITION X(GET INDEXDATA(limb_face_hit*3+2))
draw_data.y3=GET VERTEXDATA POSITION Y(GET INDEXDATA(limb_face_hit*3+2))
draw_data.z3=GET VERTEXDATA POSITION Z(GET INDEXDATA(limb_face_hit*3+2))
draw_data.u3=GET VERTEXDATA U(GET INDEXDATA(limb_face_hit*3+2))
draw_data.v3=GET VERTEXDATA V(GET INDEXDATA(limb_face_hit*3+2))
draw_data.vertex3=GET INDEXDATA(limb_face_hit*3+2)
ELSE
draw_data.x1=GET VERTEXDATA POSITION X(limb_face_hit*3)
draw_data.y1=GET VERTEXDATA POSITION Y(limb_face_hit*3)
draw_data.z1=GET VERTEXDATA POSITION Z(limb_face_hit*3)
draw_data.u1=GET VERTEXDATA U(limb_face_hit*3)
draw_data.v1=GET VERTEXDATA V(limb_face_hit*3)
draw_data.vertex1=limb_face_hit*3
draw_data.x2=GET VERTEXDATA POSITION X(limb_face_hit*3+1)
draw_data.y2=GET VERTEXDATA POSITION Y(limb_face_hit*3+1)
draw_data.z2=GET VERTEXDATA POSITION Z(limb_face_hit*3+1)
draw_data.u2=GET VERTEXDATA U(limb_face_hit*3+1)
draw_data.v2=GET VERTEXDATA V(limb_face_hit*3+1)
draw_data.vertex2=limb_face_hit*3+1
draw_data.x3=GET VERTEXDATA POSITION X(limb_face_hit*3+2)
draw_data.y3=GET VERTEXDATA POSITION Y(limb_face_hit*3+2)
draw_data.z3=GET VERTEXDATA POSITION Z(limb_face_hit*3+2)
draw_data.u3=GET VERTEXDATA U(limb_face_hit*3+2)
draw_data.v3=GET VERTEXDATA V(limb_face_hit*3+2)
draw_data.vertex3=limb_face_hit*3+2
ENDIF
draw_data.texture=LIMB TEXTURE(obj,limb_hit)
IF draw_data.texture>0
PASTE IMAGE draw_data.texture,0,0
INK RGB(255,0,0),0
BOX 255.0*draw_data.u1-5.0,255.0*draw_data.v1-5.0,255.0*draw_data.u1+5.0,255.0*draw_data.v1+5.0
INK RGB(0,255,0),0
BOX 255.0*draw_data.u2-5.0,255.0*draw_data.v2-5.0,255.0*draw_data.u2+5.0,255.0*draw_data.v2+5.0
INK RGB(0,0,255),0
BOX 255.0*draw_data.u3-5.0,255.0*draw_data.v3-5.0,255.0*draw_data.u3+5.0,255.0*draw_data.v3+5.0
INK RGB(0,0,0),0
LINE 255.0*draw_data.u1,255.0*draw_data.v1,255.0*draw_data.u2,255.0*draw_data.v2
LINE 255.0*draw_data.u2,255.0*draw_data.v2,255.0*draw_data.u3,255.0*draw_data.v3
LINE 255.0*draw_data.u3,255.0*draw_data.v3,255.0*draw_data.u1,255.0*draw_data.v1
INK RGB(255,255,255),0
ENDIF
UNLOCK VERTEXDATA
`position markers
SHOW OBJECT red_marker
SHOW OBJECT green_marker
SHOW OBJECT blue_marker
POSITION OBJECT red_marker,LIMB POSITION X(obj,limb_hit),LIMB POSITION Y(obj,limb_hit),LIMB POSITION Z(obj,limb_hit)
POSITION OBJECT green_marker,LIMB POSITION X(obj,limb_hit),LIMB POSITION Y(obj,limb_hit),LIMB POSITION Z(obj,limb_hit)
POSITION OBJECT blue_marker,LIMB POSITION X(obj,limb_hit),LIMB POSITION Y(obj,limb_hit),LIMB POSITION Z(obj,limb_hit)
SET OBJECT TO OBJECT ORIENTATION red_marker,obj
SET OBJECT TO OBJECT ORIENTATION green_marker,obj
SET OBJECT TO OBJECT ORIENTATION blue_marker,obj
OFFSET LIMB red_marker,1,draw_data.x1,draw_data.y1,draw_data.z1
OFFSET LIMB green_marker,1,draw_data.x2,draw_data.y2,draw_data.z2
OFFSET LIMB blue_marker,1,draw_data.x3,draw_data.y3,draw_data.z3
ROTATE OBJECT red_marker,OBJECT ANGLE X(red_marker)+LIMB ANGLE X(obj,limb_hit),OBJECT ANGLE Y(red_marker)+LIMB ANGLE Y(obj,limb_hit),OBJECT ANGLE Z(red_marker)+LIMB ANGLE Z(obj,limb_hit)
ROTATE OBJECT green_marker,OBJECT ANGLE X(green_marker)+LIMB ANGLE X(obj,limb_hit),OBJECT ANGLE Y(green_marker)+LIMB ANGLE Y(obj,limb_hit),OBJECT ANGLE Z(green_marker)+LIMB ANGLE Z(obj,limb_hit)
ROTATE OBJECT blue_marker,OBJECT ANGLE X(blue_marker)+LIMB ANGLE X(obj,limb_hit),OBJECT ANGLE Y(blue_marker)+LIMB ANGLE Y(obj,limb_hit),OBJECT ANGLE Z(blue_marker)+LIMB ANGLE Z(obj,limb_hit)
`debug
TEXT 0,45+((num_limbs+4)*15)+300,"Limb Texture no. - "+STR$(draw_data.texture)
TEXT 0,45+((num_limbs+5)*15)+300,"Red U - "+STR$(draw_data.u1)+" Red V - "+STR$(draw_data.v1)
TEXT 0,45+((num_limbs+6)*15)+300,"Green U - "+STR$(draw_data.u2)+" Green V - "+STR$(draw_data.v2)
TEXT 0,45+((num_limbs+7)*15)+300,"Blue U - "+STR$(draw_data.u3)+" Blue V - "+STR$(draw_data.v3)
D3D_LINE3D LIMB POSITION X(red_marker,1),LIMB POSITION Y(red_marker,1),LIMB POSITION Z(red_marker,1),LIMB POSITION X(green_marker,1),LIMB POSITION Y(green_marker,1),LIMB POSITION Z(green_marker,1),RGB(0,0,0),1
D3D_LINE3D LIMB POSITION X(green_marker,1),LIMB POSITION Y(green_marker,1),LIMB POSITION Z(green_marker,1),LIMB POSITION X(blue_marker,1),LIMB POSITION Y(blue_marker,1),LIMB POSITION Z(blue_marker,1),RGB(0,0,0),1
D3D_LINE3D LIMB POSITION X(blue_marker,1),LIMB POSITION Y(blue_marker,1),LIMB POSITION Z(blue_marker,1),LIMB POSITION X(red_marker,1),LIMB POSITION Y(red_marker,1),LIMB POSITION Z(red_marker,1),RGB(0,0,0),1
IF SPACEKEY() AND draw_data.texture>0
set_uv_data(obj,limb_hit,limb_face_hit)
POSITION MOUSE 320,240
dummy=MOUSEMOVEX()
dummy=MOUSEMOVEY()
ENDIF
ENDFUNCTION
FUNCTION find_num_limbs(obj)
done=0
num_limbs=1
WHILE done=0
IF LIMB EXIST(obj,num_limbs)
INC num_limbs
ELSE
done=1
ENDIF
ENDWHILE
DEC num_limbs
ENDFUNCTION num_limbs
FUNCTION make_textures()
`texture 1
INK RGB(255,255,255),0
BOX 0,0,255,255
INK RGB(255,0,0),0
BOX 0,0,100,100
INK RGB(0,255,0),0
BOX 155,0,255,100
INK RGB(0,0,255),0
BOX 0,155,100,255
INK RGB(255,255,0),0
BOX 155,155,255,255
GET IMAGE 1,0,0,255,255
`texture 2
INK RGB(255,255,255),0
BOX 0,0,255,255
INK RGB(255,0,0)
FOR l=0 TO 255 STEP 32
BOX 0,l,255,l+15
NEXT l
GET IMAGE 2,0,0,255,255
`texture 3
INK RGB(255,255,255),0
BOX 0,0,255,255
INK RGB(0,255,0)
FOR l=0 TO 255 STEP 32
BOX 0,l,255,l+15
NEXT l
GET IMAGE 3,0,0,255,255
`texture 4
INK RGB(255,255,255),0
BOX 0,0,255,255
INK RGB(0,0,255)
FOR l=0 TO 255 STEP 32
BOX 0,l,255,l+15
NEXT l
GET IMAGE 4,0,0,255,255
`texture 5
INK RGB(255,255,255),0
BOX 0,0,255,255
INK RGB(255,255,0)
FOR l=0 TO 255 STEP 32
BOX 0,l,255,l+15
NEXT l
GET IMAGE 5,0,0,255,255
INK RGB(255,255,255),0
ENDFUNCTION
FUNCTION set_uv_data(obj,limb,face)
done=0
LOCK VERTEXDATA FOR LIMB obj,limb
WHILE done=0
PASTE IMAGE draw_data.texture,0,0
TEXT 0,270,"SELECT RED U/V POINT"
IF MOUSECLICK()>0 AND MOUSEX()<256 AND MOUSEY()<256
SET VERTEXDATA UV draw_data.vertex1,(1.0/255.0)*MOUSEX(),(1.0/255.0)*MOUSEY()
done=1
ENDIF
SYNC
ENDWHILE
WHILE MOUSECLICK()
ENDWHILE
done=0
WHILE done=0
PASTE IMAGE draw_data.texture,0,0
TEXT 0,270,"SELECT GREEN U/V POINT"
IF MOUSECLICK()>0 AND MOUSEX()<256 AND MOUSEY()<256
SET VERTEXDATA UV draw_data.vertex2,(1.0/255.0)*MOUSEX(),(1.0/255.0)*MOUSEY()
done=1
ENDIF
SYNC
ENDWHILE
WHILE MOUSECLICK()
ENDWHILE
done=0
WHILE done=0
PASTE IMAGE draw_data.texture,0,0
TEXT 0,270,"SELECT BLUE U/V POINT"
IF MOUSECLICK()>0 AND MOUSEX()<256 AND MOUSEY()<256
SET VERTEXDATA UV draw_data.vertex3,(1.0/255.0)*MOUSEX(),(1.0/255.0)*MOUSEY()
done=1
ENDIF
SYNC
ENDWHILE
WHILE MOUSECLICK()
ENDWHILE
UNLOCK VERTEXDATA
ENDFUNCTION