//------------------------------------------------ //--- 010 Editor v8.0.1 Binary Template // // File: ctb, cbddlp, photon // Authors: Tiago Conceição //------------------------------------------------ LittleEndian(); struct HEADER { uint Magic ; uint Version ; float BedSizeX ; float BedSizeY ; float BedSizeZ ; uint Unknown1 ; uint Unknown2 ; float TotalHeightMilimeter ; float LayerHeightMilimeter ; float LayerExposureSeconds ; float BottomExposureSeconds ; float LightOffDelay ; uint BottomLayersCount ; uint ResolutionX ; uint ResolutionY ; uint PreviewLargeOffsetAddress ; uint LayersDefinitionOffsetAddress ; uint LayerCount ; uint PreviewSmallOffsetAddress ; uint PrintTime ; uint ProjectorType ; uint PrintParametersOffsetAddress ; uint PrintParametersSize ; uint AntiAliasLevel ; ushort LightPWM ; ushort BottomLightPWM ; uint EncryptionKey ; uint SlicerOffset ; uint SlicerSize ; } header; struct PREVIEW { uint ResolutionX ; uint ResolutionY ; uint ImageOffset ; uint ImageLength ; uint Unknown1 ; uint Unknown2 ; uint Unknown3 ; uint Unknown4 ; ubyte Data[ImageLength] ; }; struct PRINT_PARAMETERS { float BottomLiftHeight ; float BottomLiftSpeed ; float LiftHeight ; float LiftSpeed ; float RetractSpeed ; float VolumeMl ; float WeightG ; float CostDollars ; float BottomLightOffDelay ; float LightOffDelay ; uint BottomLayerCount ; uint Padding1 ; uint Padding2 ; uint Padding3 ; uint Padding4 ; }; struct SLICER_INFO { float BottomLiftDistance2 ; float BottomLiftSpeed2 ; float LiftHeight2 ; float LiftSpeed2 ; float RetractHeight2 ; float RetractSpeed2 ; float RestTimeAfterLift ; uint MachineNameAddress ; uint MachineNameSize ; uint EncryptionMode ; // 0/8 for cbddlp files, 0xF (15) for ctb files, 0x2000000F (536870927) for v3 ctb and 1073741839 for v4 ctb files to allow per layer parameters uint MysteriousId ; // v3 = 305419896 | v4 lightoff? = 27093086 | v4 rest? = 27093090 uint AntiAliasLevel ; uint SoftwareVersion ; // ctb v3 = 17171200 | ctb v4 pro = 16777216 float RestTimeAfterRetract ; float RestTimeAfterLift2 ; uint TransitionLayerCount ; uint PrintParametersV4Address ; uint Padding2 ; uint Padding3 ; if(MachineNameAddress > 0 && MachineNameSize > 0) { char MachineName[MachineNameSize] ; } }; if(header.PreviewLargeOffsetAddress > 0) { FSeek(header.PreviewLargeOffsetAddress); PREVIEW previewLarge ; } if(header.PreviewSmallOffsetAddress > 0) { FSeek(header.PreviewSmallOffsetAddress); PREVIEW previewSmall ; } if(header.PrintParametersOffsetAddress > 0){ FSeek(header.PrintParametersOffsetAddress); PRINT_PARAMETERS parameters ; } if(header.SlicerOffset > 0){ FSeek(header.SlicerOffset); SLICER_INFO SlicerInfo ; } if(header.Version >= 4) { FSeek(SlicerInfo.PrintParametersV4Address); struct PRINT_PARAMETERS_V4 { float BottomRetractSpeed ; float BottomRetractSpeed2 ; uint Padding1 ; float Four1 ; // 4? uint Padding2 ; float Four2 ; // 4? float RestTimeAfterRetract ; float RestTimeAfterLift ; float RestTimeBeforeLift ; float BottomRetractHeight2 ; float Unknown1 ; // 2955.996 or uint:1161347054 but changes uint Unknown2 ; // 73470 but changes uint Unknown3 ; // 5? uint LastLayerIndex ; // LayerCount-1 uint Padding3 ; uint Padding4 ; uint Padding5 ; uint Padding6 ; uint DisclaimerAddress ; uint DisclaimerLength ; // 320 ubyte Reserved[384] ; } printParametersV4; FSeek(printParametersV4.DisclaimerAddress); char DisclaimerText[printParametersV4.DisclaimerLength] ;; } struct LAYER_DATA { float LayerPositionZ ; float LayerExposure ; float LightOffSeconds ; uint DataAddress ; uint DataSize ; uint Unknown1 ; uint Unknown2 ; uint Unknown3 ; uint Unknown4 ; }; struct LAYER_DATAEX { LAYER_DATA LayerData ; uint TotalSize ; float LiftHeight ; float LiftSpeed ; float LiftHeight2 ; float LiftSpeed2 ; float RetractSpeed ; float RetractHeight2 ; float RetractSpeed2 ; float RestTimeBeforeLift ; float RestTimeAfterLift ; float RestTimeAfterRetract ; float LightPWM ; }; typedef struct(int size) { ubyte layerDataBlock[size] ; } LAYER_RLE; FSeek(header.LayersDefinitionOffsetAddress); struct LAYERS { local int aa; local int i; local uint currentPos; for( aa = 0; aa < header.AntiAliasLevel; aa++) { for( i = 0; i < header.LayerCount; i++ ){ LAYER_DATA layerData ; currentPos = FTell(); if(header.Version >= 3) { FSeek(layerData.DataAddress - 84); LAYER_DATAEX layerDataEx; } FSeek(layerData.DataAddress); LAYER_RLE layerRLE(layerData.DataSize); FSeek(currentPos); } } } layers;