HeartlessS Usurer
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
|
Post #6 of many
Scene Change Utility funcs, Part 1
Code:
##################
# UTILITY
##################
Function DBSC_Override(String ScanDB,String Override_Fn,Bool "DEBUG") {
/*
DBSC_Override(), Using SCAN DBase and Overrides.txt, allows user to set additional Scene Change or remove erroneous ones
from the SCAN DBase.
ScanDB, INFO DBase created by DBSC_Scan.
Override_fn filename: If first character == '*' then uses text in the Override_fn string and does not load file.
When using Override_fn as string, then each override should be on separate line (same format as file).
FORMAT: One frame numer command on each line.
Any +ve frame number sets START Of Scene Change frame.
Any -ve frame number REMOVES a scene change at that frame (START or END).
*/
myName="DBSC_Override: "
START_TIME = RT_TimerHP
DEBUG=Default(DEBUG,True)
Assert(Override_Fn!="",RT_String("%sMust provide a Override filename",myName))
GSCript("""
Assert(DBSC_ScanValidate(ScanDB,MustExist=True,name=myName),RT_String("%sScanDB Invalid\n'%s'",myName,ScanDB))
if(RT_Ord(Override_Fn)!=RT_Ord("*")) {
Assert(Exist(Override_Fn),RT_String("%sOverride_Fn Does NOT exist\n'%s'",myName,Override_Fn))
(DEBUG) ? RT_DebugF("Reading Override File '%s'",Override_Fn,name=myName) : NOP
OVS = RT_ReadTxtFromFile(Override_Fn)
} Else {
OVS = MidStr(Override_Fn,2)
}
OVS=(RT_Ord(OVS)==0) ? "#" : OVS # Avoid error in RT_StrReplaceMulti for Empty string ""
Fnd_S=RT_String("\t\n \n") # Replace TAB and double SPACE with Single SPACE
Rep_S=RT_String(" \n \n")
OVS=RT_StrReplaceMulti(OVS,Fnd_S,Rep_S)
NLINES = RT_TxtQueryLines(OVS) # Lines of text in OVS
(DEBUG) ? RT_DebugF("Scanning Overrides",name=myName) : NOP
FC=RT_DBaseRecords(ScanDB)
INSERTED=0
DELETED =0
RT_DBaseSetID(ScanDB,1,-1) # Disable ScanDB validity until finished without error
for(i=0,NLINES-1) {
STR = RT_TxtGetLine(OVS,i) # Without trailing n/l
While(RT_Ord(STR)==32) { STR=MidStr(STR,2) } # Eat White
S=STR
if(RT_Ord(S)!=RT_Ord("#")&&RT_Ord(S)!=0) { # Ignore comment ONLY or Empty lines
Neg=False
n=-1
if(RT_Ord(S)==RT_Ord("-")) {
Neg=True
S=MidStr(S,2)
While(RT_Ord(S)==32) { S=MidStr(S,2) } # Eat White
} Else if(RT_Ord(S)==RT_Ord("+")) {
S=MidStr(S,2)
While(RT_Ord(S)==32) { S=MidStr(S,2) } # Eat White
}
if(RT_Ord(S)>=RT_Ord("0") && RT_Ord(S)<=RT_Ord("9")) {
n=RT_NumberValue(S)
While(RT_Ord(S)>=RT_Ord("0") && RT_Ord(S)<=RT_Ord("9")) { S=MidStr(S,2) } # Eat Digits
While(RT_Ord(S)==32) { S=MidStr(S,2) } # Eat White
if(RT_Ord(S)==RT_Ord("#")) {S=""} # Eat remaining Comment
}
Assert(S=="",RT_String("%sLINE %d : Non Parse @'%s'\n'%s'",myName,i+1,S,STR))
Assert(n>=0 && n<FC,RT_String("%sLINE %d : Frame %d Does Not Exist @'%s'\n'%s'",myName,i+1,n,S,STR))
Assert(n!=0 && n!=FC-1,RT_String("%sLINE %d : Cannot Override First or Last frame %d @'%s'\n'%s'",myName,i+1,n,S,STR))
# ScanDB Fields: SOSix, EOSix, Type(1=SOS,2=EOS,0=non), SceneNo(Zero Rel), FLGS
Start=RT_DBaseGetField(ScanDB,n,0)
End =RT_DBaseGetField(ScanDB,n,1)
Type =RT_DBaseGetField(ScanDB,n,2)
Single=(Start==End && Start == n && Type==3)
if(Neg) {
if(n!=Start && n != End) {
(DEBUG||Type!=0) ? RT_DebugF("LINE %d : DEL SC, Frame %d Neither Start nor End Of Scene, Ignoring",i+1,n,name=myName) : NOP
Assert(Type==0,RT_String("%sLINE %d : INTERNAL ERROR, Frame %d Type non-zero(%d)",myName,i+1,n,Type))
} Else {
if(Single) {
# Single Frame Scene is melded with previous scene
(DEBUG) ? RT_DebugF("LINE %d : DEL SC, Frame %d Removing Single Frame Scene",i+1,n,name=myName) : NOP
NewStart = RT_DBaseGetField(ScanDB,n-1,0) # SOSix from previous scene
NewEnd = End # EOSix from current scene (ie n)
NewType=(NewStart==n-1)?1:0 # Previous is single frame scene
RT_DBaseSetField(ScanDB,n-1,2,NewType) # Change n-1 to Type NewType (SOS OR none)
FLGS=RT_DBaseGetField(ScanDB,n-1,4) # n-1 FLGS
RT_DBaseSetField(ScanDB,n-1,4,RT_BitOR(FLGS,$40000000)) # FLGS User Deleted
FLGS=RT_DBaseGetField(ScanDB,n,4) # n FLGS
RT_DBaseSetField(ScanDB,n,4,RT_BitOR(FLGS,$40000000)) # FLGS User Deleted
} Else if(Start==n) {
(DEBUG||Type!=1) ? RT_DebugF("LINE %d : DEL SC, Frame %d Removing Start Of Scene",i+1,n,name=myName) : NOP
Assert(Type==1,RT_String("%sLINE %d : INTERNAL ERROR, Frame %d Type non-1(%d)",myName,i+1,n,Type))
NewStart = RT_DBaseGetField(ScanDB,n-1,0) # SOSix from previous scene
NewEnd = End # EOSix from current scene
RT_DBaseSetField(ScanDB,n-1,2,0) # Change n-1 to Type=None
FLGS=RT_DBaseGetField(ScanDB,n-1,4) # n-1 FLGS
RT_DBaseSetField(ScanDB,n-1,4,RT_BitOR(FLGS,$40000000)) # FLGS User Deleted
FLGS=RT_DBaseGetField(ScanDB,n,4) # n FLGS
RT_DBaseSetField(ScanDB,n,4,RT_BitOR(FLGS,$40000000)) # FLGS User Deleted
} Else {
(DEBUG||Type!=2) ? RT_DebugF("LINE %d : DEL SC, Frame %d Removing End Of Scene",i+1,n,name=myName) : NOP
Assert(Type==2,RT_String("%sLINE %d : INTERNAL ERROR, Frame %d Type non-2(%d)",myName,i+1,n,Type))
NewStart = Start # SOSis from current scene
NewEnd = RT_DBaseGetField(ScanDB,n+1,1) # EOSix from next scene
RT_DBaseSetField(ScanDB,n+1,2,0) # Change n+1 to Type=None
FLGS=RT_DBaseGetField(ScanDB,n,4) # n FLGS
RT_DBaseSetField(ScanDB,n,4,RT_BitOR(FLGS,$40000000)) # FLGS User Deleted
FLGS=RT_DBaseGetField(ScanDB,n+1,4) # n+1 FLGS
RT_DBaseSetField(ScanDB,n+1,4,RT_BitOR(FLGS,$40000000)) # FLGS User Deleted
}
for(j=NewStart,NewEnd) {
RT_DBaseSetField(ScanDB,j,0,NewStart) # Change all of scene SOSix to new Start
RT_DBaseSetField(ScanDB,j,1,NewEnd) # Change all of scene EOSix to new End
}
NewType=(Single)?2:0
RT_DBaseSetField(ScanDB,n,2,NewType) # Change n to Type=None OR EOS if Single Frame Scene
DELETED = DELETED + 1 # Removed a scene
}
} Else {
If(Single) {
(DEBUG) ? RT_DebugF("LINE %d : INS SC, Frame %d already Single Frame Scene, Ignoring",i+1,n,name=myName) : NOP
} Else if(Start==n) {
(DEBUG||Type!=1) ? RT_DebugF("LINE %d : INS SC, Frame %d already Start Of Scene, Ignoring",i+1,n,name=myName) : NOP
Assert(Type==1,RT_String("%sLINE %d : INTERNAL ERROR, Frame %d Type non-1(%d)",myName,i+1,n,Type))
} Else {
if(End==n) {
(DEBUG||Type!=2) ? RT_DebugF("LINE %d : INS SC, Frame %d Changing End Of Scene to Single Frame Scene",i+1,n,name=myName) : NOP
Assert(Type==2,RT_String("%sLINE %d : INTERNAL ERROR, Frame %d Type non-2(%d)",myName,i+1,n,Type))
} Else {
(DEBUG||Type!=0) ? RT_DebugF("LINE %d : INS SC, Frame %d Changing Mid Scene to Start Of Scene",i+1,n,name=myName) : NOP
Assert(Type==0,RT_String("%sLINE %d : INTERNAL ERROR, Frame %d Type non-0(%d)",myName,i+1,n,Type))
}
for(j=Start,n-1) {
RT_DBaseSetField(ScanDB,j,1,n-1) # Change all of scene EOSix to new end
}
NewType=(Start==n-1)?3:2
RT_DBaseSetField(ScanDB,n-1,2,NewType) # Change n-1 to Type=Single Frame Scene OR End Of Scene
for(j=n,End) {
RT_DBaseSetField(ScanDB,j,0,n) # Change all of scene SOSix to new start
}
NewType=(End==n)?3:1
RT_DBaseSetField(ScanDB,n,2,NewType) # Change n to Type= Single Frame Scene OR Start Of Scene
FLGS=RT_DBaseGetField(ScanDB,n,4) # n FLGS
RT_DBaseSetField(ScanDB,n,4,RT_BitOR(FLGS,$80000000)) # FLGS User INSERTED START
FLGS=RT_DBaseGetField(ScanDB,n-1,4) # n-1 FLGS
RT_DBaseSetField(ScanDB,n-1,4,RT_BitOR(FLGS,$80000000)) # FLGS User INSERTED END (or Single Frame Scene)
INSERTED = INSERTED + 1 # Added new scene
}
}
}
}
if(INSERTED!=0 || DELETED!=0) {
(DEBUG) ? RT_DebugF("%d Overrides Processed",INSERTED+DELETED,name=myName) : NOP
(DEBUG) ? RT_DebugF("ReScan to update SCAN DBase SceneNo",name=myName) : NOP
SceneNo = -1
for(n=0,FC-1) {
S=n
SceneNo = SceneNo + 1
Start=RT_DBaseGetField(ScanDB,n,0)
End =RT_DBaseGetField(ScanDB,n,1)
Type =RT_DBaseGetField(ScanDB,n,2)
Single=(Start==End && Start == n && Type==3)
Assert(S==Start,RT_String("%s%d ] UPDATE INTERNAL ERROR : Start SOSix Mismatch(%d,%d)",myName,n,S,Start))
(!Single)?Assert(Type==1 ,RT_String("%s%d ] UPDATE INTERNAL ERROR : Start Type non-1(%d)",myName,n,Type)):NOP
EStart=RT_DBaseGetField(ScanDB,End,0)
EEnd =RT_DBaseGetField(ScanDB,End,1)
EType =RT_DBaseGetField(ScanDB,End,2)
Assert(S==EStart,RT_String("%s%d ] UPDATE INTERNAL ERROR : End SOSix Mismatch(%d,%d)",myName,n,S,EStart))
Assert(End==EEnd,RT_String("%s%d ] UPDATE INTERNAL ERROR : End MisMatch(%d,%d)",myName,n,End,EEnd))
(!Single)?Assert(EType==2 ,RT_String("%s%d ] UPDATE INTERNAL ERROR : End Type non-2(%d)",myName,n,EType)):NOP
(Single) ?Assert(EType==3 ,RT_String("%s%d ] UPDATE INTERNAL ERROR : End Type non-3(%d)",myName,n,EType)):NOP
RT_DBaseSetField(ScanDB,Start,3,SceneNo)
RT_DBaseSetField(ScanDB,End ,3,SceneNo)
for(i=Start+1,End-1) {
SOSix=RT_DBaseGetField(ScanDB,i,0)
EOSix=RT_DBaseGetField(ScanDB,i,1)
Type =RT_DBaseGetField(ScanDB,i,2)
Assert(Start==SOSix,RT_String("%s%d ] UPDATE INTERNAL ERROR : Start SOSix Mismatch(%d,%d)",myName,n,Start,SOSix))
Assert(End==EOSix ,RT_String("%s%d ] UPDATE INTERNAL ERROR : End MisMatch(%d,%d)",myName,n,End,EOSix))
Assert(Type==0 ,RT_String("%s%d ] UPDATE INTERNAL ERROR : Start Type non-1(%d)",myName,n,Type))
RT_DBaseSetField(ScanDB,i,3,SceneNo)
}
n = End # Next iteration n = End + 1
}
nAttribs=RT_DBaseGetAttrib(ScanDB,-1)
OVERRIDDEN = RT_DBaseGetAttrib(ScanDB,nAttribs-4)
TotOVR = OVERRIDDEN+INSERTED+DELETED
RT_DBaseSetAttrib(ScanDB,nAttribs-4,TotOVR) # Count of Overridden
(DEBUG) ? RT_DebugF("Total Accumulated Overrides = %d",TotOVR,name=myName) : NOP
}
RT_DBaseSetID(ScanDB,1,DBSC_Str2ID("SCAN")) # Re-enable ScanDB validity
T = RT_TimerHP - START_TIME
(DEBUG) ? RT_DebugF("Total Time taken = %.2f Seconds (%.2f Mins)",T,T/60.0,name=myName) : NOP
""")
Return 0
}
Last edited by StainlessS; 4th February 2015 at 07:56.
Reason: Update
|