q3map2: Add crn loading support to q3map2
authordolcetriade <vcelestialragev@gmail.com>
Thu, 5 Jul 2018 19:07:31 +0000 (12:07 -0700)
committerThomas Debesse <dev@illwieckz.net>
Sun, 28 Oct 2018 21:28:42 +0000 (22:28 +0100)
tools/quake3/CMakeLists.txt
tools/quake3/q3map2/image.c
tools/quake3/q3map2/q3map2.h

index 1a85298..eb3060e 100644 (file)
@@ -31,6 +31,8 @@ include_directories(${ZLIB_INCLUDE_DIRS})
 find_package(Minizip REQUIRED)
 include_directories(${Minizip_INCLUDE_DIRS})
 
+include_directories(${CMAKE_SOURCE_DIR}/libs/crunch)
+
 set(q3map2_games
         q3map2/game_darkplaces.h
         q3map2/game_dq.h
@@ -127,6 +129,7 @@ target_link_libraries(q3map2
         ${Minizip_LIBRARIES}
         ${ZLIB_LIBRARIES}
         ddslib
+        crnlib
         etclib
         filematch
         l_net
index 6ae88ca..4bf1ec0 100644 (file)
@@ -86,6 +86,26 @@ static void LoadDDSBuffer( byte *buffer, int size, byte **pixels, int *width, in
        DDSDecompress( (ddsBuffer_t*) buffer, *pixels );
 }
 
+/*
+    LoadCRNBuffer
+    loads a crn image into a valid rgba image
+*/
+void LoadCRNBuffer( byte *buffer, int size, byte **pixels, int *width, int *height) {
+       /* dummy check */
+       if ( buffer == NULL || size <= 0 || pixels == NULL || width == NULL || height == NULL ) {
+               return;
+       }
+       if ( !GetCRNImageSize( buffer, size, width, height ) ) {
+               Sys_FPrintf( SYS_WRN, "WARNING: Error getting crn imag dimensions.\n");;
+               return;
+       }
+       int outBufSize = *width * *height * 4;
+       *pixels = safe_malloc( outBufSize );
+       if ( !ConvertCRNtoRGBA( buffer, size, outBufSize, *pixels) ) {
+               Sys_FPrintf( SYS_WRN, "WARNING: Error decoding crn image.\n", 0 );
+               return;
+       }
+}
 
 
 /*
@@ -437,6 +457,16 @@ image_t *ImageLoad( const char *filename ){
                                        if ( size > 0 ) {
                                                LoadKTXBufferFirstImage( buffer, size, &image->pixels, &image->width, &image->height );
                                        }
+                                       else
+                                       {
+                                               /* attempt to load crn */
+                                               StripExtension( name );
+                                               strcat( name, ".crn" );
+                                               size = vfsLoadFile( ( const char* ) name, ( void** ) &buffer, 0 );
+                                               if ( size > 0 ) {
+                                                       LoadCRNBuffer( buffer, size, &image->pixels, &image->width, &image->height );
+                                               }
+                                       }
                                }
                        }
                }
@@ -473,7 +503,7 @@ image_t *ImageLoad( const char *filename ){
                                if (pixels) {
                                        // On error, LoadJPGBuff might store a pointer to the error message in pixels
                                        Sys_FPrintf( SYS_WRN, "WARNING: LoadJPGBuff %s %s\n", name, (unsigned char*) pixels );
-                               }                               
+                               }
                        } else {
                                if ( width == image->width && height == image->height ) {
                                        int i;
index 46fec5e..698e57c 100644 (file)
@@ -70,6 +70,7 @@
 #include "mathlib.h"
 #include "md5lib.h"
 #include "ddslib.h"
+#include "crn_rgba.h"
 
 #include "picomodel.h"