# THIS FILE IS A PART OF VCStudio # PYTHON 3 # This is collection of simple geometric math operations that I gonna use trough # out the UI of the VCStudio. Stuff like collision detections, overlap detections # and other verious little tiny, but overused functions. def line_overlap(line1, line2): # This function will check if 2 one dimenshional line overlap. overlap = False # Let's sort them just incase. line1.sort() line2.sort() # Well. I guess this is the least ambiguos way of doing so. In my opinion if line1[0] > line2[0] and line1[0] < line2[1]: overlap = True elif line1[1] > line2[0] and line1[1] < line2[1]: overlap = True elif line2[0] > line1[0] and line2[0] < line1[1]: overlap = True elif line2[1] > line1[0] and line2[1] < line1[1]: overlap = True return overlap def rectangle_overlap(rectangle1, rectangle2): # This function will see if 2 rectangle overlap. It returns either True or # False. overlap = False # Now since it's going to be easier for me to use the same type of coordi- # nates as in cairo to draw rectangles. I need to purify them first. Meaning # convert the width and height into real points on a plane. r1x, r1y, r1w, r1h = rectangle1 r2x, r2y, r2w, r2h = rectangle2 r1w += r1x r1h += r1y r2w += r2x r2h += r2y # Now we going to simply compare if overlapping lines of x coordinates and if # yes. Coordinates of y coordinates. if line_overlap([r1x, r1w],[r2x, r2w]) and line_overlap([r1y, r1h],[r2y, r2h]): overlap = True return overlap def rectangle_surround( win, name, target_pos, target_size, now_pos, now_size ): # This function does surrounding operations. For example you have N amount # of nodes selected. And you want to draw a rectangle arround all of them. # for this you will have to find out the smallest of all values and biggest # and so this is what this funtion is for. now_pos = now_pos.copy() now_size = now_size.copy() # We are going to start by refrashing the current position of the rectangle # for this we need to know whether at this frame there was a refresh already. if win.current["frame"] != win.surround["frame"]:# and win.current["frame"] % 2 == 0: win.surround["frame"] = win.current["frame"] win.surround["rects"] = [] # Now let's see if a given name is in the data of those refrashed. if name not in win.surround["rects"]: target_pos[0] = now_pos[0] target_pos[1] = now_pos[1] target_size[0] = now_size[0] target_size[1] = now_size[1] win.surround["rects"].append(name) # Now you maybe wondering why I would not just make the whole targer_size # for example = [0,0]. And it because lists are linked from some other # data. And I don't create new lists. But change the link lists. # Now let's do the checking and overwritting of all the rest of the data. if now_pos[0] < target_pos[0]: target_size[0] += target_pos[0] - now_pos[0] target_pos[0] = now_pos[0] if now_pos[1] < target_pos[1]: target_size[1] += target_pos[1] - now_pos[1] target_pos[1] = now_pos[1] # Now the size. It's a bit trickier. But not too hard. We need to remember # the the ultimate bottom, right point is a combintation of position and # size. if now_pos[0] + now_size[0] > target_pos[0] + target_size[0]: target_size[0] = now_size[0] + now_pos[0] - target_pos[0] if now_pos[1] + now_size[1] > target_pos[1] + target_size[1]: target_size[1] = now_size[1] + now_pos[1] - target_pos[1] def filter_arrows(win): # This function filters the arrow connections. I copied it from the # Blender_Organizer's code. at py_data/modules/story_editor.py # Doing some clever magic I forgot the purpose of for num, arrow in enumerate(win.story["arrows"]): for num2, arrow2 in enumerate(win.story["arrows"]): if arrow[0] == arrow2[0] or arrow[1] == arrow2[1]: win.story["arrows"][num] = arrow2 # Removing doubles tmp = [] for i in win.story["arrows"]: if i not in tmp: tmp.append(i) win.story["arrows"] = tmp def timestring(tleft): # This crazy function will convert the microsecond into something a bit # more usefull. Like 03:20:90.06 Kind a thing. tleftX = tleft tleft = int(tleftX) addend = tleftX - tleft valt = str(tleft) if tleft > 60 : le = tleft tleft = int(tleft / 60) le = le - int(tleft * 60) stleft = "0"*(2-len(str(tleft)))+str(tleft) sle = "0"*(2-len(str(le)))+str(le) valt = stleft+":"+ sle if tleft > 60 : lele = le le = tleft tleft = int(tleft / 60) le = le - int(tleft * 60) lele = (lele - le) if lele < 0: lele = int(lele * -1) stleft = "0"*(2-len(str(tleft)))+str(tleft) sle = "0"*(2-len(str(le)))+str(le) slele = "0"*(2-len(str(lele)))+str(lele) valt = stleft+":"+ sle + ":" + slele if tleft > 24 : le = tleft tleft = int(tleft / 24) le = le - int(tleft * 24) valt = str(tleft)+" DAYS AND "+ str(le) + " HRS" return valt + "." + str(int(addend*100))